Replaced each crlf with lf
authorTim Düsterhus <timwolla@arcor.de>
Mon, 25 Jul 2011 18:17:10 +0000 (20:17 +0200)
committerTim Düsterhus <timwolla@arcor.de>
Mon, 25 Jul 2011 18:17:10 +0000 (20:17 +0200)
363 files changed:
com.woltlab.wcf/cronjobs.xml
com.woltlab.wcf/options.xml
com.woltlab.wcf/package.xml
com.woltlab.wcf/styleattributes.xml
com.woltlab.wcf/templates/documentHeader.tpl
com.woltlab.wcf/templates/footer.tpl
com.woltlab.wcf/templates/headInclude.tpl
com.woltlab.wcf/templates/header.tpl
com.woltlab.wcf/templates/headerMenu.tpl
com.woltlab.wcf/templates/optionTypeBoolean.tpl
com.woltlab.wcf/templates/optionTypeDate.tpl
com.woltlab.wcf/templates/optionTypeMultiselect.tpl
com.woltlab.wcf/templates/optionTypeRadiobuttons.tpl
com.woltlab.wcf/templates/optionTypeSelect.tpl
com.woltlab.wcf/templates/permissionDenied.tpl
com.woltlab.wcf/templates/redirect.tpl
com.woltlab.wcf/templates/userException.tpl
com.woltlab.wcf/useroptions.xml
wcfsetup/install.php
wcfsetup/install/files/acp/dereferrer.php
wcfsetup/install/files/acp/global.php
wcfsetup/install/files/acp/images/wcfLogoWhite.svg
wcfsetup/install/files/acp/index.php
wcfsetup/install/files/acp/install.php
wcfsetup/install/files/acp/js/WCF.ACP.js
wcfsetup/install/files/acp/style/style.css
wcfsetup/install/files/acp/style/testing-reset.css
wcfsetup/install/files/acp/style/testing.css
wcfsetup/install/files/acp/style/wcfAcp.css
wcfsetup/install/files/acp/templates/cronjobAdd.tpl
wcfsetup/install/files/acp/templates/cronjobLogList.tpl
wcfsetup/install/files/acp/templates/footer.tpl
wcfsetup/install/files/acp/templates/header.tpl
wcfsetup/install/files/acp/templates/index.tpl
wcfsetup/install/files/acp/templates/login.tpl
wcfsetup/install/files/acp/templates/masterPassword.tpl
wcfsetup/install/files/acp/templates/masterPasswordInit.tpl
wcfsetup/install/files/acp/templates/option.tpl
wcfsetup/install/files/acp/templates/optionFieldList.tpl
wcfsetup/install/files/acp/templates/optionImport.tpl
wcfsetup/install/files/acp/templates/optionTypeBoolean.tpl
wcfsetup/install/files/acp/templates/optionTypeCustomselect.tpl
wcfsetup/install/files/acp/templates/optionTypeDate.tpl
wcfsetup/install/files/acp/templates/optionTypeMultiselect.tpl
wcfsetup/install/files/acp/templates/optionTypeRadiobuttons.tpl
wcfsetup/install/files/acp/templates/optionTypeSelect.tpl
wcfsetup/install/files/acp/templates/optionTypeText.tpl
wcfsetup/install/files/acp/templates/packageInstallationConfirm.tpl
wcfsetup/install/files/acp/templates/packageInstallationSetup.tpl
wcfsetup/install/files/acp/templates/packageList.tpl
wcfsetup/install/files/acp/templates/packageStartInstall.tpl
wcfsetup/install/files/acp/templates/packageUninstallationDependencies.tpl
wcfsetup/install/files/acp/templates/packageUpdateAuth.tpl
wcfsetup/install/files/acp/templates/packageView.tpl
wcfsetup/install/files/acp/templates/permissionDenied.tpl
wcfsetup/install/files/acp/templates/setupFooter.tpl
wcfsetup/install/files/acp/templates/setupHeader.tpl
wcfsetup/install/files/acp/templates/setupWindowFooter.tpl
wcfsetup/install/files/acp/templates/success.tpl
wcfsetup/install/files/acp/templates/updateServerAdd.tpl
wcfsetup/install/files/acp/templates/updateServerList.tpl
wcfsetup/install/files/acp/templates/userAdd.tpl
wcfsetup/install/files/acp/templates/userAssignToGroup.tpl
wcfsetup/install/files/acp/templates/userEmailAddressExport.tpl
wcfsetup/install/files/acp/templates/userException.tpl
wcfsetup/install/files/acp/templates/userGroupAdd.tpl
wcfsetup/install/files/acp/templates/userGroupList.tpl
wcfsetup/install/files/acp/templates/userList.tpl
wcfsetup/install/files/acp/templates/userMail.tpl
wcfsetup/install/files/acp/templates/userSearch.tpl
wcfsetup/install/files/acp/templates/usersMassProcessing.tpl
wcfsetup/install/files/acp/templates/worker.tpl
wcfsetup/install/files/acp/templates/workerException.tpl
wcfsetup/install/files/acp/templates/workerFinish.tpl
wcfsetup/install/files/acp/templates/workerNext.tpl
wcfsetup/install/files/global.php
wcfsetup/install/files/js/3rdParty/jquery-ui.min.js
wcfsetup/install/files/js/WCF.js
wcfsetup/install/files/lib/acp/action/AJAXProxyAction.class.php
wcfsetup/install/files/lib/acp/action/InstallPackageAction.class.php
wcfsetup/install/files/lib/acp/action/LogoutAction.class.php
wcfsetup/install/files/lib/acp/action/OptionExportAction.class.php
wcfsetup/install/files/lib/acp/action/UninstallPackageAction.class.php
wcfsetup/install/files/lib/acp/form/ACPForm.class.php
wcfsetup/install/files/lib/acp/form/AbstractOptionListForm.class.php
wcfsetup/install/files/lib/acp/form/CronjobAddForm.class.php
wcfsetup/install/files/lib/acp/form/CronjobEditForm.class.php
wcfsetup/install/files/lib/acp/form/LoginForm.class.php
wcfsetup/install/files/lib/acp/form/OptionForm.class.php
wcfsetup/install/files/lib/acp/form/PackageStartInstallForm.class.php
wcfsetup/install/files/lib/acp/form/UserAddForm.class.php
wcfsetup/install/files/lib/acp/form/UserAssignToGroupForm.class.php
wcfsetup/install/files/lib/acp/form/UserEditForm.class.php
wcfsetup/install/files/lib/acp/form/UserEmailAddressExportForm.class.php
wcfsetup/install/files/lib/acp/form/UserGroupAddForm.class.php
wcfsetup/install/files/lib/acp/form/UserGroupEditForm.class.php
wcfsetup/install/files/lib/acp/form/UserMailForm.class.php
wcfsetup/install/files/lib/acp/form/UserOptionListForm.class.php
wcfsetup/install/files/lib/acp/form/UserSearchForm.class.php
wcfsetup/install/files/lib/acp/page/IndexPage.class.php
wcfsetup/install/files/lib/acp/page/PackageListPage.class.php
wcfsetup/install/files/lib/acp/page/PackagePage.class.php
wcfsetup/install/files/lib/acp/page/PackageViewPage.class.php
wcfsetup/install/files/lib/acp/page/UpdateServerListPage.class.php
wcfsetup/install/files/lib/acp/page/UserListPage.class.php
wcfsetup/install/files/lib/action/AJAXProxyAction.class.php
wcfsetup/install/files/lib/action/AbstractAction.class.php
wcfsetup/install/files/lib/action/AbstractAjaxAction.class.php
wcfsetup/install/files/lib/action/AbstractDialogAction.class.php
wcfsetup/install/files/lib/action/AbstractSecureObjectAction.class.php
wcfsetup/install/files/lib/action/IAction.class.php
wcfsetup/install/files/lib/core.functions.php
wcfsetup/install/files/lib/data/DatabaseObject.class.php
wcfsetup/install/files/lib/data/acp/menu/item/ACPMenuItemAction.class.php
wcfsetup/install/files/lib/data/acp/menu/item/ACPMenuItemList.class.php
wcfsetup/install/files/lib/data/acp/session/ACPSessionAction.class.php
wcfsetup/install/files/lib/data/acp/session/ACPSessionList.class.php
wcfsetup/install/files/lib/data/acp/session/access/log/ACPSessionAccessLogAction.class.php
wcfsetup/install/files/lib/data/acp/session/data/ACPSessionDataAction.class.php
wcfsetup/install/files/lib/data/acp/session/data/ACPSessionDataList.class.php
wcfsetup/install/files/lib/data/acp/session/log/ACPSessionLogAction.class.php
wcfsetup/install/files/lib/data/acp/template/ACPTemplateAction.class.php
wcfsetup/install/files/lib/data/acp/template/ACPTemplateList.class.php
wcfsetup/install/files/lib/data/cleanup/listener/CleanupListenerAction.class.php
wcfsetup/install/files/lib/data/cleanup/listener/CleanupListenerList.class.php
wcfsetup/install/files/lib/data/core/object/CoreObjectAction.class.php
wcfsetup/install/files/lib/data/core/object/CoreObjectList.class.php
wcfsetup/install/files/lib/data/cronjob/CronjobAction.class.php
wcfsetup/install/files/lib/data/cronjob/CronjobList.class.php
wcfsetup/install/files/lib/data/cronjob/log/CronjobLogList.class.php
wcfsetup/install/files/lib/data/event/listener/EventListenerAction.class.php
wcfsetup/install/files/lib/data/event/listener/EventListenerList.class.php
wcfsetup/install/files/lib/data/language/LanguageList.class.php
wcfsetup/install/files/lib/data/language/category/LanguageCategoryAction.class.php
wcfsetup/install/files/lib/data/language/category/LanguageCategoryList.class.php
wcfsetup/install/files/lib/data/language/item/LanguageItemAction.class.php
wcfsetup/install/files/lib/data/language/item/LanguageItemList.class.php
wcfsetup/install/files/lib/data/option/OptionAction.class.php
wcfsetup/install/files/lib/data/option/OptionList.class.php
wcfsetup/install/files/lib/data/option/category/OptionCategoryAction.class.php
wcfsetup/install/files/lib/data/option/category/OptionCategoryList.class.php
wcfsetup/install/files/lib/data/package/PackageAction.class.php
wcfsetup/install/files/lib/data/package/PackageList.class.php
wcfsetup/install/files/lib/data/package/installation/plugin/PackageInstallationPluginAction.class.php
wcfsetup/install/files/lib/data/package/installation/plugin/PackageInstallationPluginList.class.php
wcfsetup/install/files/lib/data/package/installation/queue/PackageInstallationQueueAction.class.php
wcfsetup/install/files/lib/data/package/installation/queue/PackageInstallationQueueList.class.php
wcfsetup/install/files/lib/data/package/update/PackageUpdateAction.class.php
wcfsetup/install/files/lib/data/package/update/PackageUpdateList.class.php
wcfsetup/install/files/lib/data/package/update/server/PackageUpdateServerAction.class.php
wcfsetup/install/files/lib/data/package/update/server/PackageUpdateServerList.class.php
wcfsetup/install/files/lib/data/package/update/version/PackageUpdateVersionAction.class.php
wcfsetup/install/files/lib/data/package/update/version/PackageUpdateVersionList.class.php
wcfsetup/install/files/lib/data/page/location/ILocation.class.php
wcfsetup/install/files/lib/data/page/location/PageLocationAction.class.php
wcfsetup/install/files/lib/data/page/location/PageLocationList.class.php
wcfsetup/install/files/lib/data/page/menu/item/PageMenuItemAction.class.php
wcfsetup/install/files/lib/data/page/menu/item/PageMenuItemList.class.php
wcfsetup/install/files/lib/data/search/SearchAction.class.php
wcfsetup/install/files/lib/data/search/SearchList.class.php
wcfsetup/install/files/lib/data/session/SessionAction.class.php
wcfsetup/install/files/lib/data/session/SessionList.class.php
wcfsetup/install/files/lib/data/session/data/SessionDataAction.class.php
wcfsetup/install/files/lib/data/session/data/SessionDataList.class.php
wcfsetup/install/files/lib/data/spider/SpiderAction.class.php
wcfsetup/install/files/lib/data/spider/SpiderList.class.php
wcfsetup/install/files/lib/data/style/Style.class.php
wcfsetup/install/files/lib/data/style/StyleAction.class.php
wcfsetup/install/files/lib/data/style/StyleEditor.class.php
wcfsetup/install/files/lib/data/style/StyleList.class.php
wcfsetup/install/files/lib/data/template/TemplateAction.class.php
wcfsetup/install/files/lib/data/template/TemplateList.class.php
wcfsetup/install/files/lib/data/template/group/TemplateGroupAction.class.php
wcfsetup/install/files/lib/data/template/group/TemplateGroupList.class.php
wcfsetup/install/files/lib/data/template/listener/TemplateListenerAction.class.php
wcfsetup/install/files/lib/data/template/listener/TemplateListenerList.class.php
wcfsetup/install/files/lib/data/user/UserList.class.php
wcfsetup/install/files/lib/data/user/group/UserGroupAction.class.php
wcfsetup/install/files/lib/data/user/group/UserGroupList.class.php
wcfsetup/install/files/lib/data/user/group/option/UserGroupOptionAction.class.php
wcfsetup/install/files/lib/data/user/group/option/UserGroupOptionList.class.php
wcfsetup/install/files/lib/data/user/group/option/category/UserGroupOptionCategoryAction.class.php
wcfsetup/install/files/lib/data/user/group/option/category/UserGroupOptionCategoryList.class.php
wcfsetup/install/files/lib/data/user/option/IUserOptionOutput.class.php
wcfsetup/install/files/lib/data/user/option/UserOption.class.php
wcfsetup/install/files/lib/data/user/option/UserOptionAction.class.php
wcfsetup/install/files/lib/data/user/option/UserOptionEditor.class.php
wcfsetup/install/files/lib/data/user/option/UserOptionList.class.php
wcfsetup/install/files/lib/data/user/option/category/UserOptionCategoryAction.class.php
wcfsetup/install/files/lib/data/user/option/category/UserOptionCategoryEditor.class.php
wcfsetup/install/files/lib/form/AbstractForm.class.php
wcfsetup/install/files/lib/form/IForm.class.php
wcfsetup/install/files/lib/page/AbstractPage.class.php
wcfsetup/install/files/lib/page/IPage.class.php
wcfsetup/install/files/lib/page/MultipleLinkPage.class.php
wcfsetup/install/files/lib/page/SortablePage.class.php
wcfsetup/install/files/lib/page/util/InlineCalendar.class.php
wcfsetup/install/files/lib/system/WCF.class.php
wcfsetup/install/files/lib/system/WCFACP.class.php
wcfsetup/install/files/lib/system/WCFSetup.class.php
wcfsetup/install/files/lib/system/auth/UserAuth.class.php
wcfsetup/install/files/lib/system/auth/UserAuthDefault.class.php
wcfsetup/install/files/lib/system/cache/CacheHandler.class.php
wcfsetup/install/files/lib/system/cache/ICacheBuilder.class.php
wcfsetup/install/files/lib/system/cache/SetupCacheHandler.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderACPMenu.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderEventListener.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderLanguage.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderOption.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderPackage.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderSpider.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderStyle.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderTemplate.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderUserGroup.class.php
wcfsetup/install/files/lib/system/cache/builder/CacheBuilderUserGroupPermission.class.php
wcfsetup/install/files/lib/system/cleanup/ICleanupAdapter.class.php
wcfsetup/install/files/lib/system/cronjob/CleanupListenerCronjob.class.php
wcfsetup/install/files/lib/system/cronjob/GetUpdateInfoCronjob.class.php
wcfsetup/install/files/lib/system/cronjob/ICronjob.class.php
wcfsetup/install/files/lib/system/database/Database.class.php
wcfsetup/install/files/lib/system/database/DatabaseException.class.php
wcfsetup/install/files/lib/system/database/PostgreSQLDatabase.class.php
wcfsetup/install/files/lib/system/database/util/ConditionBuilder.class.php
wcfsetup/install/files/lib/system/database/util/PreparedStatementConditionBuilder.class.php
wcfsetup/install/files/lib/system/event/EventHandler.class.php
wcfsetup/install/files/lib/system/event/IEventListener.class.php
wcfsetup/install/files/lib/system/exception/AJAXException.class.php
wcfsetup/install/files/lib/system/exception/IPrintableException.class.php
wcfsetup/install/files/lib/system/exception/IllegalLinkException.class.php
wcfsetup/install/files/lib/system/exception/NamedUserException.class.php
wcfsetup/install/files/lib/system/exception/PermissionDeniedException.class.php
wcfsetup/install/files/lib/system/exception/UserException.class.php
wcfsetup/install/files/lib/system/exception/UserInputException.class.php
wcfsetup/install/files/lib/system/exception/ValidateActionException.class.php
wcfsetup/install/files/lib/system/form/FormDocument.class.php
wcfsetup/install/files/lib/system/form/IFormElement.class.php
wcfsetup/install/files/lib/system/form/IFormElementContainer.class.php
wcfsetup/install/files/lib/system/form/container/AbstractFormElementContainer.class.php
wcfsetup/install/files/lib/system/form/container/GroupFormElementContainer.class.php
wcfsetup/install/files/lib/system/form/container/MultipleSelectionFormElementContainer.class.php
wcfsetup/install/files/lib/system/form/container/SelectionFormElementContainer.class.php
wcfsetup/install/files/lib/system/form/container/SingleSelectionFormElementContainer.class.php
wcfsetup/install/files/lib/system/form/element/AbstractFormElement.class.php
wcfsetup/install/files/lib/system/form/element/AbstractNamedFormElement.class.php
wcfsetup/install/files/lib/system/form/element/LabelFormElement.class.php
wcfsetup/install/files/lib/system/form/element/MultipleSelectionFormElement.class.php
wcfsetup/install/files/lib/system/form/element/PasswordInputFormElement.class.php
wcfsetup/install/files/lib/system/form/element/SingleSelectionFormElement.class.php
wcfsetup/install/files/lib/system/form/element/TextInputFormElement.class.php
wcfsetup/install/files/lib/system/image/Thumbnail.class.php
wcfsetup/install/files/lib/system/io/FTP.class.php
wcfsetup/install/files/lib/system/io/File.class.php
wcfsetup/install/files/lib/system/io/GZipFile.class.php
wcfsetup/install/files/lib/system/io/RemoteFile.class.php
wcfsetup/install/files/lib/system/io/Tar.class.php
wcfsetup/install/files/lib/system/io/TarWriter.class.php
wcfsetup/install/files/lib/system/io/ZipWriter.class.php
wcfsetup/install/files/lib/system/mail/DebugMailSender.class.php
wcfsetup/install/files/lib/system/mail/Mail.class.php
wcfsetup/install/files/lib/system/mail/MailSender.class.php
wcfsetup/install/files/lib/system/mail/PHPMailSender.class.php
wcfsetup/install/files/lib/system/mail/SMTPMailSender.class.php
wcfsetup/install/files/lib/system/menu/ITreeMenuItem.class.php
wcfsetup/install/files/lib/system/menu/TreeMenu.class.php
wcfsetup/install/files/lib/system/menu/acp/ACPMenu.class.php
wcfsetup/install/files/lib/system/menu/page/DefaultPageMenuItemProvider.class.php
wcfsetup/install/files/lib/system/menu/page/IPageMenuItemProvider.class.php
wcfsetup/install/files/lib/system/menu/page/PageMenu.class.php
wcfsetup/install/files/lib/system/option/IOptionType.class.php
wcfsetup/install/files/lib/system/option/ISearchableUserOption.class.php
wcfsetup/install/files/lib/system/option/OptionTypeBoolean.class.php
wcfsetup/install/files/lib/system/option/OptionTypeCustomselect.class.php
wcfsetup/install/files/lib/system/option/OptionTypeDate.class.php
wcfsetup/install/files/lib/system/option/OptionTypeInteger.class.php
wcfsetup/install/files/lib/system/option/OptionTypeMultiselect.class.php
wcfsetup/install/files/lib/system/option/OptionTypePassword.class.php
wcfsetup/install/files/lib/system/option/OptionTypeRadiobuttons.class.php
wcfsetup/install/files/lib/system/option/OptionTypeSelect.class.php
wcfsetup/install/files/lib/system/option/OptionTypeText.class.php
wcfsetup/install/files/lib/system/option/OptionTypeTextarea.class.php
wcfsetup/install/files/lib/system/option/OptionTypeTimezone.class.php
wcfsetup/install/files/lib/system/option/group/GroupOptionTypeBoolean.class.php
wcfsetup/install/files/lib/system/option/group/GroupOptionTypeGroups.class.php
wcfsetup/install/files/lib/system/option/group/GroupOptionTypeInfiniteInteger.class.php
wcfsetup/install/files/lib/system/option/group/GroupOptionTypeInfiniteInverseInteger.class.php
wcfsetup/install/files/lib/system/option/group/GroupOptionTypeInteger.class.php
wcfsetup/install/files/lib/system/option/group/GroupOptionTypeInverseInteger.class.php
wcfsetup/install/files/lib/system/option/group/GroupOptionTypeTextarea.class.php
wcfsetup/install/files/lib/system/option/group/IGroupOptionType.class.php
wcfsetup/install/files/lib/system/package/PackageInstallationStep.class.php
wcfsetup/install/files/lib/system/package/plugin/IPackageInstallationPlugin.class.php
wcfsetup/install/files/lib/system/package/plugin/PageMenuPackageInstallationPlugin.class.php
wcfsetup/install/files/lib/system/package/plugin/StyleAttributesPackageInstallationPlugin.class.php
wcfsetup/install/files/lib/system/package/plugin/StylePackageInstallationPlugin.class.php
wcfsetup/install/files/lib/system/request/Request.class.php
wcfsetup/install/files/lib/system/request/RequestHandler.class.php
wcfsetup/install/files/lib/system/session/SessionFactory.class.php
wcfsetup/install/files/lib/system/setup/IFileHandler.class.php
wcfsetup/install/files/lib/system/setup/Installer.class.php
wcfsetup/install/files/lib/system/setup/Uninstaller.class.php
wcfsetup/install/files/lib/system/template/ITemplatePluginBlock.class.php
wcfsetup/install/files/lib/system/template/ITemplatePluginCompiler.class.php
wcfsetup/install/files/lib/system/template/ITemplatePluginFunction.class.php
wcfsetup/install/files/lib/system/template/ITemplatePluginModifier.class.php
wcfsetup/install/files/lib/system/template/ITemplatePluginPrefilter.class.php
wcfsetup/install/files/lib/system/template/SetupTemplate.class.php
wcfsetup/install/files/lib/system/template/SetupTemplateEngine.class.php
wcfsetup/install/files/lib/system/template/TemplateCompiler.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginBlockLink.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginCompilerAppend.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginCompilerAssign.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginCompilerFetch.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginCompilerImplode.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginCompilerLang.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginFunctionCounter.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginFunctionCycle.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginFunctionHtmlcheckboxes.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginFunctionHtmloptions.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginFunctionPages.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginModifierConcat.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginModifierDate.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginModifierEncodejs.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginModifierFilesize.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginModifierPlainTime.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginModifierTime.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginModifierTruncate.class.php
wcfsetup/install/files/lib/system/template/plugin/TemplatePluginPrefilterLang.class.php
wcfsetup/install/files/lib/util/ArrayUtil.class.php
wcfsetup/install/files/lib/util/BasicFileUtil.class.php
wcfsetup/install/files/lib/util/ClassUtil.class.php
wcfsetup/install/files/lib/util/CronjobUtil.class.php
wcfsetup/install/files/lib/util/ImageUtil.class.php
wcfsetup/install/files/lib/util/JSON.class.php
wcfsetup/install/files/lib/util/StringStack.class.php
wcfsetup/install/files/lib/util/UserUtil.class.php
wcfsetup/install/files/lib/util/XML.class.php
wcfsetup/install/files/options.inc.php
wcfsetup/install/files/style/containers.css
wcfsetup/install/files/style/extra/print-rtl.css
wcfsetup/install/files/style/extra/print.css
wcfsetup/install/files/style/footer.css
wcfsetup/install/files/style/forms.css
wcfsetup/install/files/style/inlineCalendar.css
wcfsetup/install/files/style/pageNavigation.css
wcfsetup/install/files/style/tabbedMenus.css
wcfsetup/install/lang/de-informal.xml
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml
wcfsetup/setup/db/install.sql
wcfsetup/setup/lang/setup_de.xml
wcfsetup/setup/lang/setup_en.xml
wcfsetup/setup/license/license_en.txt
wcfsetup/setup/template/footer.tpl
wcfsetup/setup/template/stepConfigureDB.tpl
wcfsetup/setup/template/stepCreateUser.tpl
wcfsetup/setup/template/stepInstallPackages.tpl
wcfsetup/setup/template/stepNext.tpl
wcfsetup/setup/template/stepSearchWcfDir.tpl
wcfsetup/setup/template/stepSelectLanguages.tpl
wcfsetup/setup/template/stepSelectSetupLanguage.tpl
wcfsetup/setup/template/stepShowLicense.tpl
wcfsetup/setup/template/stepShowSystemRequirements.tpl
wcfsetup/test.php

index dd4cc087b39a82a4a2e87ce880da9c4e12e683fe..6894f4710c6e38b9a61274a1959ac7e4490b8321 100644 (file)
@@ -1,69 +1,69 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/cronjobs.xsd">\r
-       <import>\r
-               <cronjob>\r
-                       <classpath>lib/system/cronjob/GetUpdateInfoCronjob.class.php</classpath>\r
-                       <description>Gets update package information</description>\r
-                       <startminute>0</startminute>\r
-                       <starthour>2</starthour>\r
-                       <startdom>*/2</startdom>\r
-                       <startmonth>*</startmonth>\r
-                       <startdow>*</startdow>\r
-                       <active>1</active>\r
-                       <canbeedited>1</canbeedited>\r
-                       <canbedisabled>1</canbedisabled>\r
-               </cronjob>\r
-               \r
-               <cronjob>\r
-                       <classpath>lib/system/cronjob/RefreshSearchRobotsCronjob.class.php</classpath>\r
-                       <description>Refreshes list of search robots</description>\r
-                       <startminute>0</startminute>\r
-                       <starthour>3</starthour>\r
-                       <startdom>1</startdom>\r
-                       <startmonth>*</startmonth>\r
-                       <startdow>*</startdow>\r
-                       <active>1</active>\r
-                       <canbeedited>1</canbeedited>\r
-                       <canbedisabled>1</canbedisabled>\r
-               </cronjob>\r
-               \r
-               <cronjob>\r
-                       <classpath>lib/system/cronjob/CleanUpCronjobLogCronjob.class.php</classpath>\r
-                       <description>Deletes old entries from cronjob log.</description>\r
-                       <startminute>0</startminute>\r
-                       <starthour>12</starthour>\r
-                       <startdom>*</startdom>\r
-                       <startmonth>*</startmonth>\r
-                       <startdow>*</startdow>\r
-                       <active>1</active>\r
-                       <canbeedited>1</canbeedited>\r
-                       <canbedisabled>1</canbedisabled>\r
-               </cronjob>\r
-               \r
-               <cronjob>\r
-                       <classpath>lib/system/cronjob/CleanUpSessionLogCronjob.class.php</classpath>\r
-                       <description>Deletes old entries from session log.</description>\r
-                       <startminute>0</startminute>\r
-                       <starthour>10</starthour>\r
-                       <startdom>*</startdom>\r
-                       <startmonth>*</startmonth>\r
-                       <startdow>*</startdow>\r
-                       <active>1</active>\r
-                       <canbeedited>0</canbeedited>\r
-                       <canbedisabled>0</canbedisabled>\r
-               </cronjob>\r
-               \r
-               <cronjob>\r
-                       <classpath>lib/system/cronjob/CleanupListenerCronjob.class.php</classpath>\r
-                       <description>Executes cleanup system.</description>\r
-                       <startminute>5,20,35,50</startminute>\r
-                       <starthour>*</starthour>\r
-                       <startdom>*</startdom>\r
-                       <startmonth>*</startmonth>\r
-                       <startdow>*</startdow>\r
-                       <active>1</active>\r
-                       <canbeedited>0</canbeedited>\r
-                       <canbedisabled>0</canbedisabled>\r
-               </cronjob>\r
-       </import>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/cronjobs.xsd">
+       <import>
+               <cronjob>
+                       <classpath>lib/system/cronjob/GetUpdateInfoCronjob.class.php</classpath>
+                       <description>Gets update package information</description>
+                       <startminute>0</startminute>
+                       <starthour>2</starthour>
+                       <startdom>*/2</startdom>
+                       <startmonth>*</startmonth>
+                       <startdow>*</startdow>
+                       <active>1</active>
+                       <canbeedited>1</canbeedited>
+                       <canbedisabled>1</canbedisabled>
+               </cronjob>
+               
+               <cronjob>
+                       <classpath>lib/system/cronjob/RefreshSearchRobotsCronjob.class.php</classpath>
+                       <description>Refreshes list of search robots</description>
+                       <startminute>0</startminute>
+                       <starthour>3</starthour>
+                       <startdom>1</startdom>
+                       <startmonth>*</startmonth>
+                       <startdow>*</startdow>
+                       <active>1</active>
+                       <canbeedited>1</canbeedited>
+                       <canbedisabled>1</canbedisabled>
+               </cronjob>
+               
+               <cronjob>
+                       <classpath>lib/system/cronjob/CleanUpCronjobLogCronjob.class.php</classpath>
+                       <description>Deletes old entries from cronjob log.</description>
+                       <startminute>0</startminute>
+                       <starthour>12</starthour>
+                       <startdom>*</startdom>
+                       <startmonth>*</startmonth>
+                       <startdow>*</startdow>
+                       <active>1</active>
+                       <canbeedited>1</canbeedited>
+                       <canbedisabled>1</canbedisabled>
+               </cronjob>
+               
+               <cronjob>
+                       <classpath>lib/system/cronjob/CleanUpSessionLogCronjob.class.php</classpath>
+                       <description>Deletes old entries from session log.</description>
+                       <startminute>0</startminute>
+                       <starthour>10</starthour>
+                       <startdom>*</startdom>
+                       <startmonth>*</startmonth>
+                       <startdow>*</startdow>
+                       <active>1</active>
+                       <canbeedited>0</canbeedited>
+                       <canbedisabled>0</canbedisabled>
+               </cronjob>
+               
+               <cronjob>
+                       <classpath>lib/system/cronjob/CleanupListenerCronjob.class.php</classpath>
+                       <description>Executes cleanup system.</description>
+                       <startminute>5,20,35,50</startminute>
+                       <starthour>*</starthour>
+                       <startdom>*</startdom>
+                       <startmonth>*</startmonth>
+                       <startdow>*</startdow>
+                       <active>1</active>
+                       <canbeedited>0</canbeedited>
+                       <canbedisabled>0</canbedisabled>
+               </cronjob>
+       </import>
 </data>
\ No newline at end of file
index e32eab2f176251340fa9994ede4f2a1461d08297..d44d0ade0285dfa7e559437b0eb6ea69fd8dc36f 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/options.xsd">\r
-       <import>\r
-               <categories>\r
-                       <!-- modules -->\r
-                       <category name="module">\r
-                               <showorder>1</showorder>\r
-                       </category>\r
-                               <category name="module.system">\r
-                                       <parent>module</parent>\r
-                               </category>\r
-                               <category name="module.user">\r
-                                       <parent>module</parent>\r
-                               </category>\r
-                               <category name="module.display">\r
-                                       <parent>module</parent>\r
-                               </category>\r
-                               <category name="module.content">\r
-                                       <parent>module</parent>\r
-                               </category>\r
-                               \r
-                               <category name="message"></category>\r
-                               \r
-                               <category name="message.general">\r
-                                       <parent>message</parent>\r
-                               </category>\r
-                       <!-- /modules -->\r
-                       \r
-                       <!-- general -->\r
-                       <category name="general">\r
-                               <showorder>2</showorder>\r
-                       </category>\r
-                               <category name="general.page">\r
-                                       <parent>general</parent>\r
-                               </category>\r
-                               <category name="general.offline">\r
-                                       <parent>general</parent>\r
-                               </category>\r
-                               <category name="general.http">\r
-                                       <parent>general</parent>\r
-                               </category>\r
-                                       <category name="general.http.cookie">\r
-                                               <parent>general.http</parent>\r
-                                       </category>\r
-                                       <category name="general.http.http">\r
-                                               <parent>general.http</parent>\r
-                                       </category>\r
-                                       <category name="general.http.proxy">\r
-                                               <parent>general.http</parent>\r
-                                       </category>\r
-                               <category name="general.date">\r
-                                       <parent>general</parent>\r
-                               </category>\r
-                               <category name="general.mail">\r
-                                       <parent>general</parent>\r
-                               </category>\r
-                                       <category name="general.mail.general">\r
-                                               <parent>general.mail</parent>\r
-                                       </category>\r
-                                       <category name="general.mail.send">\r
-                                               <parent>general.mail</parent>\r
-                                       </category>\r
-                               <category name="general.cache">\r
-                                       <parent>general</parent>\r
-                               </category>\r
-                                       <category name="general.cache.general">\r
-                                               <parent>general.cache</parent>\r
-                                       </category>\r
-                                       <category name="general.cache.memcache">\r
-                                               <parent>general.cache</parent>\r
-                                       </category>\r
-                       <!-- /general -->\r
-                       \r
-                       <!-- user -->\r
-                       <category name="user">\r
-                               <showorder>3</showorder>\r
-                       </category>\r
-                       <!-- /user -->\r
-                       \r
-                       <!-- security -->\r
-                       <category name="security">\r
-                               <showorder>4</showorder>\r
-                       </category>\r
-                               <category name="security.general">\r
-                                       <parent>security</parent>\r
-                               </category>\r
-                                       <category name="security.general.session">\r
-                                               <parent>security.general</parent>\r
-                                       </category>\r
-                               <category name="security.blacklist">\r
-                                       <parent>security</parent>\r
-                               </category>\r
-                               <category name="security.antispam">\r
-                                       <parent>security</parent>\r
-                               </category>\r
-                               <category name="security.censorship">\r
-                                       <parent>security</parent>\r
-                               </category>\r
-                       <!-- /security -->\r
-               </categories>\r
-               \r
-               <options>\r
-                       <option name="module_master_password">\r
-                               <categoryname>module.system</categoryname>\r
-                               <optiontype>boolean</optiontype>\r
-                               <defaultvalue>0</defaultvalue>\r
-                       </option>\r
-                       \r
-                       <!-- general.page -->\r
-                       <option name="page_title">\r
-                               <categoryname>general.page</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <option name="page_description">\r
-                               <categoryname>general.page</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <option name="page_url">\r
-                               <categoryname>general.page</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <option name="page_urls">\r
-                               <categoryname>general.page</categoryname>\r
-                               <optiontype>textarea</optiontype>\r
-                       </option>\r
-                       <option name="meta_keywords">\r
-                               <categoryname>general.page</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <option name="meta_description">\r
-                               <categoryname>general.page</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <!-- /general.page -->\r
-                       \r
-                       <!-- general.http.cookie -->\r
-                       <option name="cookie_prefix">\r
-                               <categoryname>general.http.cookie</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                               <defaultvalue>wcf_</defaultvalue>\r
-                               <validationpattern>.+</validationpattern>\r
-                       </option>\r
-                       <option name="cookie_path">\r
-                               <categoryname>general.http.cookie</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                               <defaultvalue></defaultvalue>\r
-                       </option>\r
-                       <option name="cookie_domain">\r
-                               <categoryname>general.http.cookie</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <!-- /general.http.cookie-->\r
-                       \r
-                       <!-- general.http.http -->\r
-                       <option name="http_enable_no_cache_headers">\r
-                               <categoryname>general.http.http</categoryname>\r
-                               <optiontype>boolean</optiontype>\r
-                               <defaultvalue>0</defaultvalue>\r
-                       </option>\r
-                       <option name="http_enable_gzip">\r
-                               <categoryname>general.http.http</categoryname>\r
-                               <optiontype>boolean</optiontype>\r
-                               <defaultvalue>1</defaultvalue>\r
-                               <enableoptions><![CDATA[http_gzip_level]]></enableoptions>\r
-                       </option>\r
-                       <option name="http_gzip_level">\r
-                               <categoryname>general.http.http</categoryname>\r
-                               <optiontype>integer</optiontype>\r
-                               <defaultvalue>1</defaultvalue>\r
-                       </option>\r
-                       <!-- /general.http.http -->\r
-                       \r
-                       <!-- general.http.proxy -->\r
-                       <option name="proxy_server_http">\r
-                               <categoryname>general.http.proxy</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <!-- /general.http.proxy -->\r
-                       \r
-                       <!-- general.session -->\r
-                       <option name="session_timeout">\r
-                               <categoryname>security.general.session</categoryname>\r
-                               <optiontype>integer</optiontype>\r
-                               <defaultvalue>1800</defaultvalue>\r
-                               <validationpattern>^[^0]</validationpattern>\r
-                       </option>\r
-                       <option name="user_online_timeout">\r
-                               <categoryname>security.general.session</categoryname>\r
-                               <optiontype>integer</optiontype>\r
-                               <defaultvalue>900</defaultvalue>\r
-                       </option>\r
-                       <option name="session_validate_ip_address">\r
-                               <categoryname>security.general.session</categoryname>\r
-                               <optiontype>select</optiontype>\r
-                               <selectoptions>0\r
-1\r
-2\r
-3\r
-4</selectoptions>\r
-                               <defaultvalue>2</defaultvalue>\r
-                       </option>\r
-                       <option name="session_validate_user_agent">\r
-                               <categoryname>security.general.session</categoryname>\r
-                               <optiontype>boolean</optiontype>\r
-                               <defaultvalue>1</defaultvalue>\r
-                       </option>\r
-                       <!-- /general.session -->\r
-                       \r
-                       <!-- security.blacklist -->\r
-                       <option name="blacklist_ip_addresses">\r
-                               <categoryname>security.blacklist</categoryname>\r
-                               <optiontype>textarea</optiontype>\r
-                       </option>\r
-                       <option name="blacklist_user_agents">\r
-                               <categoryname>security.blacklist</categoryname>\r
-                               <optiontype>textarea</optiontype>\r
-                       </option>\r
-                       <option name="blacklist_hostnames">\r
-                               <categoryname>security.blacklist</categoryname>\r
-                               <optiontype>textarea</optiontype>\r
-                       </option>\r
-                       <!-- /security.blacklist -->\r
-                       \r
-                       <!-- general.date -->\r
-                       <option name="timezone">\r
-                               <categoryname>general.date</categoryname>\r
-                               <optiontype>timezone</optiontype>\r
-                               <defaultvalue>Europe/London</defaultvalue>\r
-                       </option>\r
-                       <!-- /general.date -->\r
-                       \r
-                       <!-- mail.general -->\r
-                       <option name="mail_from_name">\r
-                               <categoryname>general.mail.general</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                               <defaultvalue><![CDATA[]]></defaultvalue>\r
-                       </option>\r
-                       <option name="mail_from_address">\r
-                               <categoryname>general.mail.general</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                               <defaultvalue><![CDATA[]]></defaultvalue>\r
-                       </option>\r
-                       <option name="mail_admin_address">\r
-                               <categoryname>general.mail.general</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                               <defaultvalue><![CDATA[]]></defaultvalue>\r
-                       </option>\r
-                       <option name="mail_signature">\r
-                               <categoryname>general.mail.general</categoryname>\r
-                               <optiontype>textarea</optiontype>\r
-                               <defaultvalue><![CDATA[]]></defaultvalue>\r
-                       </option>\r
-                       <!-- /mail.general -->\r
-                       \r
-                       <!-- mail.send -->\r
-                       <option name="mail_send_method">\r
-                               <categoryname>general.mail.send</categoryname>\r
-                               <optiontype>radiobuttons</optiontype>\r
-                               <defaultvalue><![CDATA[php]]></defaultvalue>\r
-                               <selectoptions><![CDATA[php:wcf.acp.option.mail_send_method.php\r
-smtp:wcf.acp.option.mail_send_method.smtp\r
-debug:wcf.acp.option.mail_send_method.debug]]></selectoptions>\r
-                               <enableoptions><![CDATA[php:mail_use_f_param,!mail_debug_logfile_path,!mail_smtp_host,!mail_smtp_port,!mail_smtp_user,!mail_smtp_password\r
-smtp:!mail_debug_logfile_path,!mail_use_f_param,mail_smtp_host,mail_smtp_port,mail_smtp_user,mail_smtp_password\r
-debug:mail_debug_logfile_path,!mail_use_f_param,!mail_smtp_host,!mail_smtp_port,!mail_smtp_user,!mail_smtp_password]]></enableoptions>\r
-                       </option>\r
-                       <option name="mail_debug_logfile_path">\r
-                               <categoryname>general.mail.send</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <option name="mail_smtp_host">\r
-                               <categoryname>general.mail.send</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <option name="mail_smtp_port">\r
-                               <categoryname>general.mail.send</categoryname>\r
-                               <optiontype>integer</optiontype>\r
-                               <defaultvalue><![CDATA[25]]></defaultvalue>\r
-                       </option>\r
-                       <option name="mail_smtp_user">\r
-                               <categoryname>general.mail.send</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                       </option>\r
-                       <option name="mail_smtp_password">\r
-                               <categoryname>general.mail.send</categoryname>\r
-                               <optiontype>password</optiontype>\r
-                       </option>\r
-                       <option name="mail_use_f_param">\r
-                               <categoryname>general.mail.send</categoryname>\r
-                               <optiontype>boolean</optiontype>\r
-                       </option>\r
-                       <option name="mail_use_formatted_address">\r
-                               <categoryname>general.mail.send</categoryname>\r
-                               <optiontype>boolean</optiontype>\r
-                       </option>\r
-                       <!-- /mail.send -->\r
-                       \r
-                       <!-- general.cache -->\r
-                       <option name="cache_source_type">\r
-                               <categoryname>general.cache.general</categoryname>\r
-                               <optiontype>radiobuttons</optiontype>\r
-                               <defaultvalue><![CDATA[disk]]></defaultvalue>\r
-                               <selectoptions><![CDATA[disk:wcf.acp.option.cache_source_type.disk\r
-memcache:wcf.acp.option.cache_source_type.memcache\r
-apc:wcf.acp.option.cache_source_type.apc]]></selectoptions>\r
-                               <enableoptions><![CDATA[disk:!cache_source_memcache_host,!cache_source_memcache_use_pconnect,!enable_session_data_cache\r
-memcache:cache_source_memcache_host,cache_source_memcache_use_pconnect,enable_session_data_cache\r
-apc:!cache_source_memcache_host,!cache_source_memcache_use_pconnect,!enable_session_data_cache]]></enableoptions>\r
-                       </option>\r
-                       \r
-                       <option name="enable_session_data_cache">\r
-                               <categoryname>general.cache.general</categoryname>\r
-                               <optiontype>boolean</optiontype>\r
-                       </option>\r
-                       \r
-                       <option name="cache_source_memcache_host">\r
-                               <categoryname>general.cache.memcache</categoryname>\r
-                               <optiontype>textarea</optiontype>\r
-                       </option>\r
-                       \r
-                       <option name="cache_source_memcache_use_pconnect">\r
-                               <categoryname>general.cache.memcache</categoryname>\r
-                               <optiontype>boolean</optiontype>\r
-                       </option>\r
-                       <!-- /general.cache -->\r
-               </options>\r
-       </import>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/options.xsd">
+       <import>
+               <categories>
+                       <!-- modules -->
+                       <category name="module">
+                               <showorder>1</showorder>
+                       </category>
+                               <category name="module.system">
+                                       <parent>module</parent>
+                               </category>
+                               <category name="module.user">
+                                       <parent>module</parent>
+                               </category>
+                               <category name="module.display">
+                                       <parent>module</parent>
+                               </category>
+                               <category name="module.content">
+                                       <parent>module</parent>
+                               </category>
+                               
+                               <category name="message"></category>
+                               
+                               <category name="message.general">
+                                       <parent>message</parent>
+                               </category>
+                       <!-- /modules -->
+                       
+                       <!-- general -->
+                       <category name="general">
+                               <showorder>2</showorder>
+                       </category>
+                               <category name="general.page">
+                                       <parent>general</parent>
+                               </category>
+                               <category name="general.offline">
+                                       <parent>general</parent>
+                               </category>
+                               <category name="general.http">
+                                       <parent>general</parent>
+                               </category>
+                                       <category name="general.http.cookie">
+                                               <parent>general.http</parent>
+                                       </category>
+                                       <category name="general.http.http">
+                                               <parent>general.http</parent>
+                                       </category>
+                                       <category name="general.http.proxy">
+                                               <parent>general.http</parent>
+                                       </category>
+                               <category name="general.date">
+                                       <parent>general</parent>
+                               </category>
+                               <category name="general.mail">
+                                       <parent>general</parent>
+                               </category>
+                                       <category name="general.mail.general">
+                                               <parent>general.mail</parent>
+                                       </category>
+                                       <category name="general.mail.send">
+                                               <parent>general.mail</parent>
+                                       </category>
+                               <category name="general.cache">
+                                       <parent>general</parent>
+                               </category>
+                                       <category name="general.cache.general">
+                                               <parent>general.cache</parent>
+                                       </category>
+                                       <category name="general.cache.memcache">
+                                               <parent>general.cache</parent>
+                                       </category>
+                       <!-- /general -->
+                       
+                       <!-- user -->
+                       <category name="user">
+                               <showorder>3</showorder>
+                       </category>
+                       <!-- /user -->
+                       
+                       <!-- security -->
+                       <category name="security">
+                               <showorder>4</showorder>
+                       </category>
+                               <category name="security.general">
+                                       <parent>security</parent>
+                               </category>
+                                       <category name="security.general.session">
+                                               <parent>security.general</parent>
+                                       </category>
+                               <category name="security.blacklist">
+                                       <parent>security</parent>
+                               </category>
+                               <category name="security.antispam">
+                                       <parent>security</parent>
+                               </category>
+                               <category name="security.censorship">
+                                       <parent>security</parent>
+                               </category>
+                       <!-- /security -->
+               </categories>
+               
+               <options>
+                       <option name="module_master_password">
+                               <categoryname>module.system</categoryname>
+                               <optiontype>boolean</optiontype>
+                               <defaultvalue>0</defaultvalue>
+                       </option>
+                       
+                       <!-- general.page -->
+                       <option name="page_title">
+                               <categoryname>general.page</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <option name="page_description">
+                               <categoryname>general.page</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <option name="page_url">
+                               <categoryname>general.page</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <option name="page_urls">
+                               <categoryname>general.page</categoryname>
+                               <optiontype>textarea</optiontype>
+                       </option>
+                       <option name="meta_keywords">
+                               <categoryname>general.page</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <option name="meta_description">
+                               <categoryname>general.page</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <!-- /general.page -->
+                       
+                       <!-- general.http.cookie -->
+                       <option name="cookie_prefix">
+                               <categoryname>general.http.cookie</categoryname>
+                               <optiontype>text</optiontype>
+                               <defaultvalue>wcf_</defaultvalue>
+                               <validationpattern>.+</validationpattern>
+                       </option>
+                       <option name="cookie_path">
+                               <categoryname>general.http.cookie</categoryname>
+                               <optiontype>text</optiontype>
+                               <defaultvalue></defaultvalue>
+                       </option>
+                       <option name="cookie_domain">
+                               <categoryname>general.http.cookie</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <!-- /general.http.cookie-->
+                       
+                       <!-- general.http.http -->
+                       <option name="http_enable_no_cache_headers">
+                               <categoryname>general.http.http</categoryname>
+                               <optiontype>boolean</optiontype>
+                               <defaultvalue>0</defaultvalue>
+                       </option>
+                       <option name="http_enable_gzip">
+                               <categoryname>general.http.http</categoryname>
+                               <optiontype>boolean</optiontype>
+                               <defaultvalue>1</defaultvalue>
+                               <enableoptions><![CDATA[http_gzip_level]]></enableoptions>
+                       </option>
+                       <option name="http_gzip_level">
+                               <categoryname>general.http.http</categoryname>
+                               <optiontype>integer</optiontype>
+                               <defaultvalue>1</defaultvalue>
+                       </option>
+                       <!-- /general.http.http -->
+                       
+                       <!-- general.http.proxy -->
+                       <option name="proxy_server_http">
+                               <categoryname>general.http.proxy</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <!-- /general.http.proxy -->
+                       
+                       <!-- general.session -->
+                       <option name="session_timeout">
+                               <categoryname>security.general.session</categoryname>
+                               <optiontype>integer</optiontype>
+                               <defaultvalue>1800</defaultvalue>
+                               <validationpattern>^[^0]</validationpattern>
+                       </option>
+                       <option name="user_online_timeout">
+                               <categoryname>security.general.session</categoryname>
+                               <optiontype>integer</optiontype>
+                               <defaultvalue>900</defaultvalue>
+                       </option>
+                       <option name="session_validate_ip_address">
+                               <categoryname>security.general.session</categoryname>
+                               <optiontype>select</optiontype>
+                               <selectoptions>0
+1
+2
+3
+4</selectoptions>
+                               <defaultvalue>2</defaultvalue>
+                       </option>
+                       <option name="session_validate_user_agent">
+                               <categoryname>security.general.session</categoryname>
+                               <optiontype>boolean</optiontype>
+                               <defaultvalue>1</defaultvalue>
+                       </option>
+                       <!-- /general.session -->
+                       
+                       <!-- security.blacklist -->
+                       <option name="blacklist_ip_addresses">
+                               <categoryname>security.blacklist</categoryname>
+                               <optiontype>textarea</optiontype>
+                       </option>
+                       <option name="blacklist_user_agents">
+                               <categoryname>security.blacklist</categoryname>
+                               <optiontype>textarea</optiontype>
+                       </option>
+                       <option name="blacklist_hostnames">
+                               <categoryname>security.blacklist</categoryname>
+                               <optiontype>textarea</optiontype>
+                       </option>
+                       <!-- /security.blacklist -->
+                       
+                       <!-- general.date -->
+                       <option name="timezone">
+                               <categoryname>general.date</categoryname>
+                               <optiontype>timezone</optiontype>
+                               <defaultvalue>Europe/London</defaultvalue>
+                       </option>
+                       <!-- /general.date -->
+                       
+                       <!-- mail.general -->
+                       <option name="mail_from_name">
+                               <categoryname>general.mail.general</categoryname>
+                               <optiontype>text</optiontype>
+                               <defaultvalue><![CDATA[]]></defaultvalue>
+                       </option>
+                       <option name="mail_from_address">
+                               <categoryname>general.mail.general</categoryname>
+                               <optiontype>text</optiontype>
+                               <defaultvalue><![CDATA[]]></defaultvalue>
+                       </option>
+                       <option name="mail_admin_address">
+                               <categoryname>general.mail.general</categoryname>
+                               <optiontype>text</optiontype>
+                               <defaultvalue><![CDATA[]]></defaultvalue>
+                       </option>
+                       <option name="mail_signature">
+                               <categoryname>general.mail.general</categoryname>
+                               <optiontype>textarea</optiontype>
+                               <defaultvalue><![CDATA[]]></defaultvalue>
+                       </option>
+                       <!-- /mail.general -->
+                       
+                       <!-- mail.send -->
+                       <option name="mail_send_method">
+                               <categoryname>general.mail.send</categoryname>
+                               <optiontype>radiobuttons</optiontype>
+                               <defaultvalue><![CDATA[php]]></defaultvalue>
+                               <selectoptions><![CDATA[php:wcf.acp.option.mail_send_method.php
+smtp:wcf.acp.option.mail_send_method.smtp
+debug:wcf.acp.option.mail_send_method.debug]]></selectoptions>
+                               <enableoptions><![CDATA[php:mail_use_f_param,!mail_debug_logfile_path,!mail_smtp_host,!mail_smtp_port,!mail_smtp_user,!mail_smtp_password
+smtp:!mail_debug_logfile_path,!mail_use_f_param,mail_smtp_host,mail_smtp_port,mail_smtp_user,mail_smtp_password
+debug:mail_debug_logfile_path,!mail_use_f_param,!mail_smtp_host,!mail_smtp_port,!mail_smtp_user,!mail_smtp_password]]></enableoptions>
+                       </option>
+                       <option name="mail_debug_logfile_path">
+                               <categoryname>general.mail.send</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <option name="mail_smtp_host">
+                               <categoryname>general.mail.send</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <option name="mail_smtp_port">
+                               <categoryname>general.mail.send</categoryname>
+                               <optiontype>integer</optiontype>
+                               <defaultvalue><![CDATA[25]]></defaultvalue>
+                       </option>
+                       <option name="mail_smtp_user">
+                               <categoryname>general.mail.send</categoryname>
+                               <optiontype>text</optiontype>
+                       </option>
+                       <option name="mail_smtp_password">
+                               <categoryname>general.mail.send</categoryname>
+                               <optiontype>password</optiontype>
+                       </option>
+                       <option name="mail_use_f_param">
+                               <categoryname>general.mail.send</categoryname>
+                               <optiontype>boolean</optiontype>
+                       </option>
+                       <option name="mail_use_formatted_address">
+                               <categoryname>general.mail.send</categoryname>
+                               <optiontype>boolean</optiontype>
+                       </option>
+                       <!-- /mail.send -->
+                       
+                       <!-- general.cache -->
+                       <option name="cache_source_type">
+                               <categoryname>general.cache.general</categoryname>
+                               <optiontype>radiobuttons</optiontype>
+                               <defaultvalue><![CDATA[disk]]></defaultvalue>
+                               <selectoptions><![CDATA[disk:wcf.acp.option.cache_source_type.disk
+memcache:wcf.acp.option.cache_source_type.memcache
+apc:wcf.acp.option.cache_source_type.apc]]></selectoptions>
+                               <enableoptions><![CDATA[disk:!cache_source_memcache_host,!cache_source_memcache_use_pconnect,!enable_session_data_cache
+memcache:cache_source_memcache_host,cache_source_memcache_use_pconnect,enable_session_data_cache
+apc:!cache_source_memcache_host,!cache_source_memcache_use_pconnect,!enable_session_data_cache]]></enableoptions>
+                       </option>
+                       
+                       <option name="enable_session_data_cache">
+                               <categoryname>general.cache.general</categoryname>
+                               <optiontype>boolean</optiontype>
+                       </option>
+                       
+                       <option name="cache_source_memcache_host">
+                               <categoryname>general.cache.memcache</categoryname>
+                               <optiontype>textarea</optiontype>
+                       </option>
+                       
+                       <option name="cache_source_memcache_use_pconnect">
+                               <categoryname>general.cache.memcache</categoryname>
+                               <optiontype>boolean</optiontype>
+                       </option>
+                       <!-- /general.cache -->
+               </options>
+       </import>
 </data>
\ No newline at end of file
index a5e8825468dff3065234fa1ee913fa494e9dfb52..0ab966280486c77b6bd754a8efac5190a1f3a2e8 100644 (file)
@@ -1,29 +1,29 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<package name="com.woltlab.wcf" xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/package.xsd">\r
-       <packageinformation>\r
-               <packagename>WoltLab Community Framework</packagename>\r
-               <packagedescription>Free web-framework, designed and developed for complex community applications.</packagedescription>\r
-               <standalone>1</standalone>\r
-               <isunique>1</isunique>\r
-               <version>2.0.0 Alpha 1</version> <!-- codename: maelstrom -->\r
-               <date>2011-05-19</date>\r
-       </packageinformation>\r
-       \r
-       <authorinformation>\r
-               <author>WoltLab GmbH</author>\r
-               <authorurl>http://www.woltlab.com</authorurl>\r
-       </authorinformation>\r
-       \r
-       <instructions type="install">\r
-               <instruction type="packageinstallationplugins">pip.xml</instruction>\r
-               <instruction type="acpmenu">acpmenu.xml</instruction>\r
-               <instruction type="groupoptions">groupoptions.xml</instruction>\r
-               <instruction type="options">options.xml</instruction>\r
-               <instruction type="useroptions">useroptions.xml</instruction>\r
-               <instruction type="templates">templates.tar</instruction>\r
-               <instruction type="eventlistener">eventlistener.xml</instruction>\r
-               <instruction type="script">acp/install.php</instruction>\r
-               <instruction type="cronjobs">cronjobs.xml</instruction>\r
-               <instruction type="coreobject">coreobject.xml</instruction>\r
-       </instructions>\r
-</package>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.woltlab.wcf" xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/package.xsd">
+       <packageinformation>
+               <packagename>WoltLab Community Framework</packagename>
+               <packagedescription>Free web-framework, designed and developed for complex community applications.</packagedescription>
+               <standalone>1</standalone>
+               <isunique>1</isunique>
+               <version>2.0.0 Alpha 1</version> <!-- codename: maelstrom -->
+               <date>2011-05-19</date>
+       </packageinformation>
+       
+       <authorinformation>
+               <author>WoltLab GmbH</author>
+               <authorurl>http://www.woltlab.com</authorurl>
+       </authorinformation>
+       
+       <instructions type="install">
+               <instruction type="packageinstallationplugins">pip.xml</instruction>
+               <instruction type="acpmenu">acpmenu.xml</instruction>
+               <instruction type="groupoptions">groupoptions.xml</instruction>
+               <instruction type="options">options.xml</instruction>
+               <instruction type="useroptions">useroptions.xml</instruction>
+               <instruction type="templates">templates.tar</instruction>
+               <instruction type="eventlistener">eventlistener.xml</instruction>
+               <instruction type="script">acp/install.php</instruction>
+               <instruction type="cronjobs">cronjobs.xml</instruction>
+               <instruction type="coreobject">coreobject.xml</instruction>
+       </instructions>
+</package>
index 75b8e4f08573ac772ff4275e5168f4f65cafb455..9f18c81a177eba44e86bd665359bfec2b800864c 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/styleattributes.xsd">\r
-       <import>\r
-               <attribute>\r
-                       <selector><![CDATA[]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[user.additional.style.input1.use]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[user.additional.style.input2.use]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[page.header.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[page.header.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[background-position]]></name>\r
-                       <value><![CDATA[page.header.background.image.alignment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[background-repeat]]></name>\r
-                       <value><![CDATA[page.header.background.image.repeat]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo]]></selector>\r
-                       <name><![CDATA[border-bottom-width]]></name>\r
-                       <value><![CDATA[menu.main.bar.divider.show]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo]]></selector>\r
-                       <name><![CDATA[height]]></name>\r
-                       <value><![CDATA[page.header.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo .pageLogo]]></selector>\r
-                       <name><![CDATA[text-align]]></name>\r
-                       <value><![CDATA[page.logo.image.alignment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo .pageLogo img]]></selector>\r
-                       <name><![CDATA[margin-left]]></name>\r
-                       <value><![CDATA[page.logo.image.padding.left]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo .pageLogo img]]></selector>\r
-                       <name><![CDATA[margin-right]]></name>\r
-                       <value><![CDATA[page.logo.image.padding.right]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo .pageLogo img]]></selector>\r
-                       <name><![CDATA[margin-top]]></name>\r
-                       <value><![CDATA[page.logo.image.padding.top]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[global.title.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1]]></selector>\r
-                       <name><![CDATA[text-align]]></name>\r
-                       <value><![CDATA[global.title.font.alignment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[global.title.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[global.title.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1]]></selector>\r
-                       <name><![CDATA[font-style]]></name>\r
-                       <value><![CDATA[global.title.font.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1]]></selector>\r
-                       <name><![CDATA[font-weight]]></name>\r
-                       <value><![CDATA[global.title.font.weight]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[global.title.hide]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1 a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[global.title.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1 a]]></selector>\r
-                       <name><![CDATA[padding-left]]></name>\r
-                       <value><![CDATA[global.title.font.padding.left]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1 a]]></selector>\r
-                       <name><![CDATA[padding-right]]></name>\r
-                       <value><![CDATA[global.title.font.padding.right]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#logo h1 a]]></selector>\r
-                       <name><![CDATA[padding-top]]></name>\r
-                       <value><![CDATA[global.title.font.padding.top]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#userPanel]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[page.alignment.margin]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[page.alignment.margin]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footer]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[page.alignment.margin]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#main]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[page.alignment.margin]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#userPanel]]></selector>\r
-                       <name><![CDATA[width]]></name>\r
-                       <value><![CDATA[page.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[width]]></name>\r
-                       <value><![CDATA[page.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footer]]></selector>\r
-                       <name><![CDATA[width]]></name>\r
-                       <value><![CDATA[page.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.footerOptions li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.footerOptions li.extraButton]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.footerMenu li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#main]]></selector>\r
-                       <name><![CDATA[width]]></name>\r
-                       <value><![CDATA[page.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#userPanel]]></selector>\r
-                       <name><![CDATA[max-width]]></name>\r
-                       <value><![CDATA[page.width.max]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[max-width]]></name>\r
-                       <value><![CDATA[page.width.max]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footer]]></selector>\r
-                       <name><![CDATA[max-width]]></name>\r
-                       <value><![CDATA[page.width.max]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#main]]></selector>\r
-                       <name><![CDATA[max-width]]></name>\r
-                       <value><![CDATA[page.width.max]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#userPanel]]></selector>\r
-                       <name><![CDATA[min-width]]></name>\r
-                       <value><![CDATA[page.width.min]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[min-width]]></name>\r
-                       <value><![CDATA[page.width.min]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footer]]></selector>\r
-                       <name><![CDATA[min-width]]></name>\r
-                       <value><![CDATA[page.width.min]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#main]]></selector>\r
-                       <name><![CDATA[min-width]]></name>\r
-                       <value><![CDATA[page.width.min]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footer]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.columnContainer]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[* a.externalURL]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.external.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[* a.externalURL:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.external.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[selection.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[selection.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeContainer a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeMessage]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.activeMessage]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[selection.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.attachmentFile ul li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.attachmentPreview ul li a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.attachmentPreview ul li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.attachmentPreview ul li:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarDisplay div]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarDisplay div]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarDisplay div]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect li label]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect li label]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect li label]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect li label:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[selection.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect li label:hover]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect li label:hover]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.boardlistCounter]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.boardlistDescription]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.boardlistLastPost]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.boardlistSubboards]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.boardlistUsersOnline]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border .container-1 a:active]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.active]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border .container-2 a:active]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.active]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border .container-3 a:active]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.active]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border .containerHead a:active]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.active]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border .tableList td]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.border .tableList th]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.breadCrumbs]]></selector>\r
-                       <name><![CDATA[line-height]]></name>\r
-                       <value><![CDATA[page.font.line.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.dynBoxInner]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .signature]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover .columnTitle a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover .columnTopic .topic a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover .columnUsername a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 fieldset fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 fieldset fieldset.noJavaScript fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 legend]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .formFieldDesc]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.color-1 legend]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 .formFieldDesc]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 .signature]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover .columnTitle a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover .columnTopic .topic a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover .columnUsername a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 fieldset fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 legend]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.color-2 legend]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 fieldset fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-4]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container4.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-4]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container4.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-4 .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container4.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-4 .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container4.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-4 a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container4.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-4 a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container4.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.itemList .itemListCategory]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.itemList .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.itemList .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.itemList .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-top-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-top-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-top-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-top-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-top-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>\r
-                       <name><![CDATA[border-top-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>\r
-                       <name><![CDATA[border-top-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>\r
-                       <name><![CDATA[border-top-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>\r
-                       <name><![CDATA[border-top-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.simpleBar ul]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.simpleBar ul li]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.simpleBar ul li a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.simpleBar ul li a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.simpleBar ul li a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container4.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.simpleBar ul li.selected a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container4.background.color]]></value>\r
-               </attribute>            \r
-               <attribute>\r
-                       <selector><![CDATA[.containerHead]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.head.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.containerHead]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[container.head.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.containerHead]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.containerHead .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.containerHead .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.containerHead a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.containerHead a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 .containerHead a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 .containerHead a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footer]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.dividers .messageAuthor]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.dividers .userAvatar]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.dividers .userCredits]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.dividers .userMessenger]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.dividers .userSymbols]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.editNote]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.editNote]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.editNote]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.editNote]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.deleteNote]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.deleteNote]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.deleteNote]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.deleteNote]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.editor textarea]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[input.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.editor textarea]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[input.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.editor textarea]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.editor textarea:focus]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.error]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.error]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.error]]></selector>\r
-                       <name><![CDATA[line-height]]></name>\r
-                       <value><![CDATA[page.font.line.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.firstPost]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.formField label]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.formFieldDesc]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.formFieldDesc]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.iframeBody]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[page.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.iframeBody]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.iframeBody]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.info]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.info]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.info]]></selector>\r
-                       <name><![CDATA[line-height]]></name>\r
-                       <value><![CDATA[page.font.line.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter td]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.head.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter td]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[container.head.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter td a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter td a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter td span]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarFooter td span]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader td]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.head.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader td]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[container.head.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader td a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader td a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader td span]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarHeader td span]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[selection.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[input.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[input.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[input.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[input.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[input.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText:focus]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText:focus]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[input.border.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText:focus]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[input.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.inputText:focus]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.large.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.large.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.large.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.large.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.large.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.large.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.large.border.inner.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.large.border.inner.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.large.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a span]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[buttons.large.caption.hide]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.large.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.large.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.large.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.large.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.large.border.outer.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainMenu]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[page.alignment.margin]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainMenu]]></selector>\r
-                       <name><![CDATA[width]]></name>\r
-                       <value><![CDATA[page.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainMenu]]></selector>\r
-                       <name><![CDATA[max-width]]></name>\r
-                       <value><![CDATA[page.width.max]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainMenu]]></selector>\r
-                       <name><![CDATA[min-width]]></name>\r
-                       <value><![CDATA[page.width.min]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.bar.hide]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .active a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.active.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .active a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.main.active.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .active a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.main.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .active a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.active.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .active a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.main.active.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .firstActive a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.active.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .firstActive a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.main.active.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .firstActive a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.main.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .firstActive a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.active.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .firstActive a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.main.active.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .lastActive a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.active.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .lastActive a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.main.active.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .lastActive a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.main.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .lastActive a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.active.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .lastActive a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.main.active.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.main.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.main.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.main.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.main.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.main.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu .mainMenuInner]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[menu.main.position]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[selection.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>\r
-                       <name><![CDATA[border-bottom-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>\r
-                       <name><![CDATA[border-top-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mainMenu span]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[menu.main.caption.hide]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.marked]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.markedDayField a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.markedDayField a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[selection.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.markedDayField a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[selection.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.markedDayField a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.markedDayField a]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.markedDayField a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mceEditor .mceColors li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mceResizeBox]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.mceResizeBox]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberName]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberName]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberName]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberName]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberName:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberName:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberName:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberRemove]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li .memberRemove:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.memberList li:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.message]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.message]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.message]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.message .messageSidebar]]></selector>\r
-                       <name><![CDATA[text-align]]></name>\r
-                       <value><![CDATA[messages.sidebar.text.alignment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.message h3]]></selector>\r
-                       <name><![CDATA[line-height]]></name>\r
-                       <value><![CDATA[page.font.line.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.message h4]]></selector>\r
-                       <name><![CDATA[line-height]]></name>\r
-                       <value><![CDATA[page.font.line.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageBody]]></selector>\r
-                       <name><![CDATA[line-height]]></name>\r
-                       <value><![CDATA[page.font.line.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageContainer]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageContainerFooter]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageContent]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageContentInner]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooter]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooter]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooter]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooterLeft]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooterLeft]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooterLeft]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooterRight]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooterRight]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageFooterRight]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageHeader]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageHeader]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageHeader]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 .signature]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 .smallButtons a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 .smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 .memberName]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 .memberName:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 .memberName]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 .memberName:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-1 a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 .signature]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 .smallButtons a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 .smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageInner .color-2 a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.moderators]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons li span]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons li]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons li]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons li div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons li div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons li:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .optionButtons a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .optionButtons a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation .active]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[selection.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation .active]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation .active]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation .active span]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation .active span]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[selection.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation .active span]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation input]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li span]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li span]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li span]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li span]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li span:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li ul]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li ul]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li ul]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li ul]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li.children span]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li.children span]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li.children span]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li.children:hover > span]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li.children:hover > span]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li.children:hover span]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li.children:hover span]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pageNavigation li:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.large.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.large.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.large.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.large.border.inner.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.large.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.large.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.large.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.large.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmEditFolders a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.large.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmMove p]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmUsage]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmUsageBar]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmUsageBar]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.pmUsageBar]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.popupMenu]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.popupMenu]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.popupMenu]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.popupMenu]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#userCardCredits]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.friendsConnection]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.friendsNetwork]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.friendsNone]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.guestAdvice]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.buttonBar]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.buttonBar]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu li.container-1 a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu li.container-2 a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .twoRows a span]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .twoRows a:hover span]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .twoRows a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.quoteBox]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.quoteBox]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.quoteBox]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.quoteBox]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.signature]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.signature]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.signature]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons span]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[buttons.small.caption.hide]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .smallButtons a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 .smallButtons a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 .smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 .smallButtons a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-3 .smallButtons a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li span]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.extraButton span]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.inner.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[li.extraButton]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallFont]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.loginPopup]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.statusDisplay]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subHeadline]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subHeadline]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subHeadline]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu div.containerHead]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.button.active.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.button.active.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[menu.tab.button.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[menu.tab.button.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.button.active.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.button.active.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[menu.tab.button.border.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul li]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul li a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.button.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul li a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[menu.tab.button.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul li a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.button.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.button.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[menu.tab.button.border.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[menu.tab.button.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.button.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.success]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.success]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.success]]></selector>\r
-                       <name><![CDATA[line-height]]></name>\r
-                       <value><![CDATA[page.font.line.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active .emptyHead]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.active.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active .emptyHead]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.active.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active .emptyHead]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active .emptyHead]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[table.head.active.border.bottom.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.active.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.active.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[table.head.active.border.bottom.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.active.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.active.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[table.head.active.border.bottom.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .emptyHead]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .emptyHead]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[table.head.border.bottom.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .emptyHead]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .emptyHead]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[table.head.border.bottom.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead a:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[table.head.border.bottom.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList th]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.tab.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.tab.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.tab.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.head.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.tab.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li.activeTabMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.head.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu li.activeTabMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container.head.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.active.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.active.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.tab.active.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.active.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.tab.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.threadStarterPost .poll .container-3]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList tbody tr:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userAvatar]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userAvatar a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userAvatarFramed]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userAvatarFramed]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container4.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userAvatarFramed a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userCredits]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userExtras]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userPanel]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userPanel a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userPanel a:active]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.active]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.warning]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.warning]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.warning]]></selector>\r
-                       <name><![CDATA[line-height]]></name>\r
-                       <value><![CDATA[page.font.line.height]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.weekDays]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.weekDays]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[a:active]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.active]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container4.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[page.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[page.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[background-position]]></name>\r
-                       <value><![CDATA[page.background.image.alignment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[background-attachment]]></name>\r
-                       <value><![CDATA[page.background.image.attachment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[background-repeat]]></name>\r
-                       <value><![CDATA[page.background.image.repeat]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[page.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.inlineCalendar]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu li.active a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu li.active a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[selection.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu li.active a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>\r
-                       <name><![CDATA[border-bottom-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>\r
-                       <name><![CDATA[border-top-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>\r
-                       <name><![CDATA[border-top-color]]></name>\r
-                       <value><![CDATA[divider.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>\r
-                       <name><![CDATA[border-top-style]]></name>\r
-                       <value><![CDATA[divider.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>\r
-                       <name><![CDATA[border-top-width]]></name>\r
-                       <value><![CDATA[divider.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList tr div.pageMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList tr div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[fieldset]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[fieldset]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[fieldset]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container1.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[fieldset fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container2.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[h2]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[page.title.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[h2]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.title.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[h2]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.title.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[h2]]></selector>\r
-                       <name><![CDATA[font-style]]></name>\r
-                       <value><![CDATA[page.title.font.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[h2]]></selector>\r
-                       <name><![CDATA[font-weight]]></name>\r
-                       <value><![CDATA[page.title.font.weight]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[h2 a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.title.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[h2 a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.title.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[html]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[page.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[html]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[page.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[html]]></selector>\r
-                       <name><![CDATA[background-position]]></name>\r
-                       <value><![CDATA[page.background.image.alignment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[html]]></selector>\r
-                       <name><![CDATA[background-attachment]]></name>\r
-                       <value><![CDATA[page.background.image.attachment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[html]]></selector>\r
-                       <name><![CDATA[background-repeat]]></name>\r
-                       <value><![CDATA[page.background.image.repeat]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[legend]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[input.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[input.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[input.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[input.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[input.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select:focus]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select:focus]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[input.border.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select:focus]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[input.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[select:focus]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[td.columnLastActivity]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[td.columnLocation]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[td.columnRegistrationDate]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[td.columnUserAgent]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[input.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[input.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[input.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[input.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[input.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea]]></selector>\r
-                       <name><![CDATA[font-family]]></name>\r
-                       <value><![CDATA[page.font]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea:focus]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea:focus]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[input.border.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea:focus]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[input.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[textarea:focus]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color.focus]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[buttons.small.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.messageNumber:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#search]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#search .searchContainer p a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.button.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#search .searchContainer p a]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#search .searchContainer p a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.tab.button.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.searchContainer]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.searchContainer]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.searchContainer]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[page.frame.general]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[page.frame.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[page.frame.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[border-top-width]]></name>\r
-                       <value><![CDATA[page.frame.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[border-right-width]]></name>\r
-                       <value><![CDATA[page.frame.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[border-left-width]]></name>\r
-                       <value><![CDATA[page.frame.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[page.frame.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[margin-top]]></name>\r
-                       <value><![CDATA[page.frame.margin]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[padding-top]]></name>\r
-                       <value><![CDATA[page.frame.padding.vertical]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[padding-right]]></name>\r
-                       <value><![CDATA[page.frame.padding.horizontal]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#headerContainer]]></selector>\r
-                       <name><![CDATA[padding-left]]></name>\r
-                       <value><![CDATA[page.frame.padding.horizontal]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainContainer]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[page.frame.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainContainer]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[page.frame.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainContainer]]></selector>\r
-                       <name><![CDATA[border-right-width]]></name>\r
-                       <value><![CDATA[page.frame.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainContainer]]></selector>\r
-                       <name><![CDATA[border-left-width]]></name>\r
-                       <value><![CDATA[page.frame.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainContainer]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[page.frame.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainContainer]]></selector>\r
-                       <name><![CDATA[padding-right]]></name>\r
-                       <value><![CDATA[page.frame.padding.horizontal]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#mainContainer]]></selector>\r
-                       <name><![CDATA[padding-left]]></name>\r
-                       <value><![CDATA[page.frame.padding.horizontal]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[page.frame.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[page.frame.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[border-right-width]]></name>\r
-                       <value><![CDATA[page.frame.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[border-bottom-width]]></name>\r
-                       <value><![CDATA[page.frame.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[border-left-width]]></name>\r
-                       <value><![CDATA[page.frame.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[page.frame.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[margin-bottom]]></name>\r
-                       <value><![CDATA[page.frame.margin]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[padding-right]]></name>\r
-                       <value><![CDATA[page.frame.padding.horizontal]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[padding-bottom]]></name>\r
-                       <value><![CDATA[page.frame.padding.vertical]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#footerContainer]]></selector>\r
-                       <name><![CDATA[padding-left]]></name>\r
-                       <value><![CDATA[page.frame.padding.horizontal]]></value>\r
-               </attribute>\r
-       </import>\r
-       \r
-       <!-- these obsolete declarations will be deleted -->\r
-       <delete>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.active.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.active.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead .active]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.caption.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead label:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[table.head.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead label:hover]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[table.head.background.image.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead label:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[table.head.caption.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead div]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[table.head.border.bottom.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead div]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[table.head.border.bottom.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableHead div:hover]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[table.head.border.bottom.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList tbody tr:hover .columnUsername a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList tbody tr:hover .columnTopic .topic a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList tbody tr:hover .columnTitle a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover .columnUsername a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-1:hover .columnTopic .topic a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover .columnUsername a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-2:hover .columnTopic .topic a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-3:hover .columnUsername a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr.container-3:hover .columnTopic .topic a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr:hover .columnTopic .topic a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr:hover .columnUsername a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr:hover a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr:hover .light]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr:hover .light a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[tr:hover .columnTitle a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[page.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .active a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .active a]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[selection.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[div.pageMenu .active a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.copyright]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#header]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#page]]></selector>\r
-                       <name><![CDATA[]]></name>\r
-                       <value><![CDATA[page.alignment.margin]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#page]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#page]]></selector>\r
-                       <name><![CDATA[width]]></name>\r
-                       <value><![CDATA[page.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#page]]></selector>\r
-                       <name><![CDATA[max-width]]></name>\r
-                       <value><![CDATA[page.width.max]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[#page]]></selector>\r
-                       <name><![CDATA[min-width]]></name>\r
-                       <value><![CDATA[page.width.min]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallPages]]></selector>\r
-                       <name><![CDATA[font-size]]></name>\r
-                       <value><![CDATA[page.font.2nd.size]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[body]]></selector>\r
-                       <name><![CDATA[text-align]]></name>\r
-                       <value><![CDATA[page.alignment]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[buttons.small.background.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.profileDisplay fieldset]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userProfileBox #userProfileAvatar fieldset div]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .disabled]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-1 .disabled a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container1.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 .disabled]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.container-2 .disabled a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container2.font.2nd.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeBox]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeBox]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeBox]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[messages.boxes.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeBox]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[messages.boxes.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.quoteBox]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.quoteBox]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[input.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.quoteBox]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[messages.boxes.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.attachmentPreview ul li a:hover]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarDisplay div]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userAvatarFramed]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[input.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userAvatarFramed]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[messages.boxes.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeLineNumbers]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container3.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeLineNumbers]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[container3.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeBox]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeBox]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[container.border.outer.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.codeBox]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[container.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userProfileContent .fieldTitle]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.userProfileContent .fieldValue]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect li label]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container.border.inner.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
-                       <name><![CDATA[background-image]]></name>\r
-                       <value><![CDATA[selection.background.image]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[selection.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li.selected]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[selection.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li.selected]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li.selected]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li.selected > a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.largeButtons li.selected > a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li.selected]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[selection.border.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li.selected]]></selector>\r
-                       <name><![CDATA[border-style]]></name>\r
-                       <value><![CDATA[selection.border.style]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li.selected]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[selection.border.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li.selected > a]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[selection.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.smallButtons li.selected > a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[selection.link.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.optionButtons li]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[menu.dropdown.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.li.extraButton]]></selector>\r
-                       <name><![CDATA[border-width]]></name>\r
-                       <value><![CDATA[buttons.small.border.outer.width]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.attachmentPreview ul li a]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container.border.outer.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.galleryAlbumCover img]]></selector>\r
-                       <name><![CDATA[background-color]]></name>\r
-                       <value><![CDATA[container4.background.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
-                       <name><![CDATA[border-color]]></name>\r
-                       <value><![CDATA[container1.font.color]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList div.pageMenu a:hover]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
-               </attribute>\r
-               <attribute>\r
-                       <selector><![CDATA[.tableList div.pageMenu a]]></selector>\r
-                       <name><![CDATA[color]]></name>\r
-                       <value><![CDATA[menu.dropdown.link.color]]></value>\r
-               </attribute>\r
-       </delete>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/styleattributes.xsd">
+       <import>
+               <attribute>
+                       <selector><![CDATA[]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[user.additional.style.input1.use]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[user.additional.style.input2.use]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[page.header.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[page.header.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[background-position]]></name>
+                       <value><![CDATA[page.header.background.image.alignment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[background-repeat]]></name>
+                       <value><![CDATA[page.header.background.image.repeat]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo]]></selector>
+                       <name><![CDATA[border-bottom-width]]></name>
+                       <value><![CDATA[menu.main.bar.divider.show]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo]]></selector>
+                       <name><![CDATA[height]]></name>
+                       <value><![CDATA[page.header.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo .pageLogo]]></selector>
+                       <name><![CDATA[text-align]]></name>
+                       <value><![CDATA[page.logo.image.alignment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo .pageLogo img]]></selector>
+                       <name><![CDATA[margin-left]]></name>
+                       <value><![CDATA[page.logo.image.padding.left]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo .pageLogo img]]></selector>
+                       <name><![CDATA[margin-right]]></name>
+                       <value><![CDATA[page.logo.image.padding.right]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo .pageLogo img]]></selector>
+                       <name><![CDATA[margin-top]]></name>
+                       <value><![CDATA[page.logo.image.padding.top]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[global.title.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1]]></selector>
+                       <name><![CDATA[text-align]]></name>
+                       <value><![CDATA[global.title.font.alignment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[global.title.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[global.title.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1]]></selector>
+                       <name><![CDATA[font-style]]></name>
+                       <value><![CDATA[global.title.font.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1]]></selector>
+                       <name><![CDATA[font-weight]]></name>
+                       <value><![CDATA[global.title.font.weight]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[global.title.hide]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1 a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[global.title.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1 a]]></selector>
+                       <name><![CDATA[padding-left]]></name>
+                       <value><![CDATA[global.title.font.padding.left]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1 a]]></selector>
+                       <name><![CDATA[padding-right]]></name>
+                       <value><![CDATA[global.title.font.padding.right]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#logo h1 a]]></selector>
+                       <name><![CDATA[padding-top]]></name>
+                       <value><![CDATA[global.title.font.padding.top]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#userPanel]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[page.alignment.margin]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[page.alignment.margin]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footer]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[page.alignment.margin]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#main]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[page.alignment.margin]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#userPanel]]></selector>
+                       <name><![CDATA[width]]></name>
+                       <value><![CDATA[page.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[width]]></name>
+                       <value><![CDATA[page.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footer]]></selector>
+                       <name><![CDATA[width]]></name>
+                       <value><![CDATA[page.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.footerOptions li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.footerOptions li.extraButton]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.footerMenu li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#main]]></selector>
+                       <name><![CDATA[width]]></name>
+                       <value><![CDATA[page.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#userPanel]]></selector>
+                       <name><![CDATA[max-width]]></name>
+                       <value><![CDATA[page.width.max]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[max-width]]></name>
+                       <value><![CDATA[page.width.max]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footer]]></selector>
+                       <name><![CDATA[max-width]]></name>
+                       <value><![CDATA[page.width.max]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#main]]></selector>
+                       <name><![CDATA[max-width]]></name>
+                       <value><![CDATA[page.width.max]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#userPanel]]></selector>
+                       <name><![CDATA[min-width]]></name>
+                       <value><![CDATA[page.width.min]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[min-width]]></name>
+                       <value><![CDATA[page.width.min]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footer]]></selector>
+                       <name><![CDATA[min-width]]></name>
+                       <value><![CDATA[page.width.min]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#main]]></selector>
+                       <name><![CDATA[min-width]]></name>
+                       <value><![CDATA[page.width.min]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footer]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.columnContainer]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[* a.externalURL]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.external.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[* a.externalURL:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.external.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[selection.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[selection.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeContainer a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeMessage]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.activeMessage]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[selection.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.attachmentFile ul li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.attachmentPreview ul li a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.attachmentPreview ul li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.attachmentPreview ul li:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarDisplay div]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarDisplay div]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarDisplay div]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect li label]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect li label]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect li label]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect li label:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[selection.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect li label:hover]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect li label:hover]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.boardlistCounter]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.boardlistDescription]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.boardlistLastPost]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.boardlistSubboards]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.boardlistUsersOnline]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border .container-1 a:active]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.active]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border .container-2 a:active]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.active]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border .container-3 a:active]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.active]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border .containerHead a:active]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.active]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border .tableList td]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.border .tableList th]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.breadCrumbs]]></selector>
+                       <name><![CDATA[line-height]]></name>
+                       <value><![CDATA[page.font.line.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.dynBoxInner]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .signature]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover .columnTitle a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover .columnTopic .topic a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover .columnUsername a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 fieldset fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 fieldset fieldset.noJavaScript fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 legend]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .formFieldDesc]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.color-1 legend]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 .formFieldDesc]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 .signature]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover .columnTitle a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover .columnTopic .topic a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover .columnUsername a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 fieldset fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 legend]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.color-2 legend]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 fieldset fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-4]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container4.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-4]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container4.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-4 .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container4.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-4 .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container4.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-4 a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container4.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-4 a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container4.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.itemList .itemListCategory]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.itemList .itemListTitle]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.itemList .itemListTitle]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.itemList .itemListTitle]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>
+                       <name><![CDATA[border-top-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>
+                       <name><![CDATA[border-top-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>
+                       <name><![CDATA[border-top-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>
+                       <name><![CDATA[border-top-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>
+                       <name><![CDATA[border-top-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>
+                       <name><![CDATA[border-top-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>
+                       <name><![CDATA[border-top-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>
+                       <name><![CDATA[border-top-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>
+                       <name><![CDATA[border-top-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.simpleBar ul]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.simpleBar ul li]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.simpleBar ul li a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.simpleBar ul li a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.simpleBar ul li a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container4.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.simpleBar ul li.selected a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container4.background.color]]></value>
+               </attribute>            
+               <attribute>
+                       <selector><![CDATA[.containerHead]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.head.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.containerHead]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[container.head.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.containerHead]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.containerHead .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.containerHead .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.containerHead a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.containerHead a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 .containerHead a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 .containerHead a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footer]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.dividers .messageAuthor]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.dividers .userAvatar]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.dividers .userCredits]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.dividers .userMessenger]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.dividers .userSymbols]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.editNote]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.editNote]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.editNote]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.editNote]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.deleteNote]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.deleteNote]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.deleteNote]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.deleteNote]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.editor textarea]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[input.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.editor textarea]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[input.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.editor textarea]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.editor textarea:focus]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.error]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.error]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.error]]></selector>
+                       <name><![CDATA[line-height]]></name>
+                       <value><![CDATA[page.font.line.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.firstPost]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.formField label]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.formFieldDesc]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.formFieldDesc]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.iframeBody]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[page.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.iframeBody]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.iframeBody]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.info]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.info]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.info]]></selector>
+                       <name><![CDATA[line-height]]></name>
+                       <value><![CDATA[page.font.line.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter td]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.head.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter td]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[container.head.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter td a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter td a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter td span]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarFooter td span]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader td]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.head.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader td]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[container.head.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader td a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader td a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader td span]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarHeader td span]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[selection.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[input.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[input.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[input.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[input.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[input.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText:focus]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText:focus]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[input.border.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText:focus]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[input.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.inputText:focus]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.large.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.large.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.large.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.large.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.large.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.large.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.large.border.inner.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.large.border.inner.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.large.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a span]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[buttons.large.caption.hide]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.large.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.large.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.large.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.large.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.large.border.outer.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainMenu]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[page.alignment.margin]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainMenu]]></selector>
+                       <name><![CDATA[width]]></name>
+                       <value><![CDATA[page.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainMenu]]></selector>
+                       <name><![CDATA[max-width]]></name>
+                       <value><![CDATA[page.width.max]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainMenu]]></selector>
+                       <name><![CDATA[min-width]]></name>
+                       <value><![CDATA[page.width.min]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.bar.hide]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .active a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.active.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .active a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.main.active.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .active a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.main.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .active a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.active.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .active a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.main.active.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .firstActive a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.active.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .firstActive a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.main.active.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .firstActive a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.main.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .firstActive a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.active.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .firstActive a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.main.active.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .lastActive a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.active.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .lastActive a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.main.active.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .lastActive a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.main.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .lastActive a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.active.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .lastActive a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.main.active.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.main.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.main.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.main.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.main.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.main.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu .mainMenuInner]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[menu.main.position]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[selection.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>
+                       <name><![CDATA[border-bottom-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>
+                       <name><![CDATA[border-top-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mainMenu span]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[menu.main.caption.hide]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.marked]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.markedDayField a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.markedDayField a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[selection.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.markedDayField a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[selection.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.markedDayField a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.markedDayField a]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.markedDayField a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mceEditor .mceColors li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mceResizeBox]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.mceResizeBox]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberName]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberName]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberName]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberName]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberName:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberName:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberName:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberRemove]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li .memberRemove:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.memberList li:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.message]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.message]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.message]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.message .messageSidebar]]></selector>
+                       <name><![CDATA[text-align]]></name>
+                       <value><![CDATA[messages.sidebar.text.alignment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.message h3]]></selector>
+                       <name><![CDATA[line-height]]></name>
+                       <value><![CDATA[page.font.line.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.message h4]]></selector>
+                       <name><![CDATA[line-height]]></name>
+                       <value><![CDATA[page.font.line.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageBody]]></selector>
+                       <name><![CDATA[line-height]]></name>
+                       <value><![CDATA[page.font.line.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageContainer]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageContainerFooter]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageContent]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageContentInner]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooter]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooter]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooter]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooterLeft]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooterLeft]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooterLeft]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooterRight]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooterRight]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageFooterRight]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageHeader]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageHeader]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageHeader]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 .signature]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 .smallButtons a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 .smallButtons a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 .memberName]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 .memberName:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 .memberName]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 .memberName:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-1 a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 .signature]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 .smallButtons a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 .smallButtons a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageInner .color-2 a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.moderators]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons li span]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.inner.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.inner.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons li]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons li]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons li div.pageMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons li div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons li:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .optionButtons a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .optionButtons a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation .active]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[selection.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation .active]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation .active]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation .active span]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation .active span]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[selection.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation .active span]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.inner.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.inner.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation input]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li span]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li span]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.inner.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li span]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.inner.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li span]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li span:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li ul]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li ul]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li ul]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li ul]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li.children span]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li.children span]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li.children span]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li.children:hover > span]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li.children:hover > span]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li.children:hover span]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li.children:hover span]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pageNavigation li:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.large.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.large.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.large.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.large.border.inner.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.large.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.large.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.large.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.large.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmEditFolders a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.large.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmMove p]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmUsage]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmUsageBar]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmUsageBar]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.pmUsageBar]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.popupMenu]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.popupMenu]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.popupMenu]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.popupMenu]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#userCardCredits]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.friendsConnection]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.friendsNetwork]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.friendsNone]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.guestAdvice]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.buttonBar]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.buttonBar]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu li.container-1 a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu li.container-2 a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .twoRows a span]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .twoRows a:hover span]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .twoRows a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.quoteBox]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.quoteBox]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.quoteBox]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.quoteBox]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.signature]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.signature]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.signature]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons span]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[buttons.small.caption.hide]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.inner.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.inner.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .smallButtons a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .smallButtons a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 .smallButtons a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 .smallButtons a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 .smallButtons a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-3 .smallButtons a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li span]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.extraButton span]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.inner.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.inner.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[li.extraButton]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallFont]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.loginPopup]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.statusDisplay]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subHeadline]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subHeadline]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subHeadline]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu div.containerHead]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.button.active.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.button.active.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[menu.tab.button.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[menu.tab.button.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.button.active.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.button.active.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[menu.tab.button.border.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul li]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul li a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.button.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul li a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[menu.tab.button.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul li a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.button.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.button.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[menu.tab.button.border.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[menu.tab.button.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.button.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.success]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.success]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.success]]></selector>
+                       <name><![CDATA[line-height]]></name>
+                       <value><![CDATA[page.font.line.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active .emptyHead]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.active.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active .emptyHead]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.active.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active .emptyHead]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active .emptyHead]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[table.head.active.border.bottom.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.active.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.active.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[table.head.active.border.bottom.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.active.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.active.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[table.head.active.border.bottom.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .emptyHead]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .emptyHead]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[table.head.border.bottom.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .emptyHead]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .emptyHead]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[table.head.border.bottom.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead a:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[table.head.border.bottom.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList th]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.tab.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.tab.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.tab.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.head.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.tab.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li.activeTabMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.head.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu li.activeTabMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container.head.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.active.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.active.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.tab.active.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.active.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.tab.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.threadStarterPost .poll .container-3]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList tbody tr:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userAvatar]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userAvatar a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userAvatarFramed]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userAvatarFramed]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container4.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userAvatarFramed a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userCredits]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userExtras]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userPanel]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userPanel a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userPanel a:active]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.active]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.warning]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.warning]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.warning]]></selector>
+                       <name><![CDATA[line-height]]></name>
+                       <value><![CDATA[page.font.line.height]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.weekDays]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.weekDays]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[a:active]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.active]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container4.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[page.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[page.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[background-position]]></name>
+                       <value><![CDATA[page.background.image.alignment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[background-attachment]]></name>
+                       <value><![CDATA[page.background.image.attachment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[background-repeat]]></name>
+                       <value><![CDATA[page.background.image.repeat]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[page.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.inlineCalendar]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu li.active a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu li.active a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[selection.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu li.active a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>
+                       <name><![CDATA[border-bottom-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>
+                       <name><![CDATA[border-top-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>
+                       <name><![CDATA[border-top-color]]></name>
+                       <value><![CDATA[divider.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>
+                       <name><![CDATA[border-top-style]]></name>
+                       <value><![CDATA[divider.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>
+                       <name><![CDATA[border-top-width]]></name>
+                       <value><![CDATA[divider.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList tr div.pageMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList tr div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[fieldset]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[fieldset]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[fieldset]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container1.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[fieldset fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container2.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[h2]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[page.title.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[h2]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.title.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[h2]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.title.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[h2]]></selector>
+                       <name><![CDATA[font-style]]></name>
+                       <value><![CDATA[page.title.font.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[h2]]></selector>
+                       <name><![CDATA[font-weight]]></name>
+                       <value><![CDATA[page.title.font.weight]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[h2 a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.title.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[h2 a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.title.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[html]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[page.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[html]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[page.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[html]]></selector>
+                       <name><![CDATA[background-position]]></name>
+                       <value><![CDATA[page.background.image.alignment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[html]]></selector>
+                       <name><![CDATA[background-attachment]]></name>
+                       <value><![CDATA[page.background.image.attachment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[html]]></selector>
+                       <name><![CDATA[background-repeat]]></name>
+                       <value><![CDATA[page.background.image.repeat]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[legend]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[input.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[input.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[input.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[input.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[input.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select:focus]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select:focus]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[input.border.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select:focus]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[input.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[select:focus]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[td.columnLastActivity]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[td.columnLocation]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[td.columnRegistrationDate]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[td.columnUserAgent]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[input.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[input.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[input.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[input.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[input.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea]]></selector>
+                       <name><![CDATA[font-family]]></name>
+                       <value><![CDATA[page.font]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea:focus]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea:focus]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[input.border.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea:focus]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[input.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[textarea:focus]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color.focus]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[buttons.small.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[buttons.small.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[buttons.small.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.messageNumber:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#search]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#search .searchContainer p a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.button.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#search .searchContainer p a]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#search .searchContainer p a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.tab.button.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.searchContainer]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.searchContainer]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.searchContainer]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[page.frame.general]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[page.frame.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[page.frame.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[border-top-width]]></name>
+                       <value><![CDATA[page.frame.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[border-right-width]]></name>
+                       <value><![CDATA[page.frame.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[border-left-width]]></name>
+                       <value><![CDATA[page.frame.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[page.frame.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[margin-top]]></name>
+                       <value><![CDATA[page.frame.margin]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[padding-top]]></name>
+                       <value><![CDATA[page.frame.padding.vertical]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[padding-right]]></name>
+                       <value><![CDATA[page.frame.padding.horizontal]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#headerContainer]]></selector>
+                       <name><![CDATA[padding-left]]></name>
+                       <value><![CDATA[page.frame.padding.horizontal]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainContainer]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[page.frame.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainContainer]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[page.frame.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainContainer]]></selector>
+                       <name><![CDATA[border-right-width]]></name>
+                       <value><![CDATA[page.frame.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainContainer]]></selector>
+                       <name><![CDATA[border-left-width]]></name>
+                       <value><![CDATA[page.frame.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainContainer]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[page.frame.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainContainer]]></selector>
+                       <name><![CDATA[padding-right]]></name>
+                       <value><![CDATA[page.frame.padding.horizontal]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#mainContainer]]></selector>
+                       <name><![CDATA[padding-left]]></name>
+                       <value><![CDATA[page.frame.padding.horizontal]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[page.frame.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[page.frame.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[border-right-width]]></name>
+                       <value><![CDATA[page.frame.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[border-bottom-width]]></name>
+                       <value><![CDATA[page.frame.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[border-left-width]]></name>
+                       <value><![CDATA[page.frame.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[page.frame.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[margin-bottom]]></name>
+                       <value><![CDATA[page.frame.margin]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[padding-right]]></name>
+                       <value><![CDATA[page.frame.padding.horizontal]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[padding-bottom]]></name>
+                       <value><![CDATA[page.frame.padding.vertical]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#footerContainer]]></selector>
+                       <name><![CDATA[padding-left]]></name>
+                       <value><![CDATA[page.frame.padding.horizontal]]></value>
+               </attribute>
+       </import>
+       
+       <!-- these obsolete declarations will be deleted -->
+       <delete>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.active.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.active.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead .active]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.caption.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead label:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[table.head.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead label:hover]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[table.head.background.image.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead label:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[table.head.caption.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead div]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[table.head.border.bottom.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead div]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[table.head.border.bottom.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableHead div:hover]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[table.head.border.bottom.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList tbody tr:hover .columnUsername a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList tbody tr:hover .columnTopic .topic a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList tbody tr:hover .columnTitle a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover .columnUsername a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-1:hover .columnTopic .topic a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover .columnUsername a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-2:hover .columnTopic .topic a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-3:hover .columnUsername a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr.container-3:hover .columnTopic .topic a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr:hover .columnTopic .topic a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr:hover .columnUsername a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr:hover a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr:hover .light]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr:hover .light a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[tr:hover .columnTitle a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[page.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .active a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .active a]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[selection.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[div.pageMenu .active a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.copyright]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#header]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#page]]></selector>
+                       <name><![CDATA[]]></name>
+                       <value><![CDATA[page.alignment.margin]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#page]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#page]]></selector>
+                       <name><![CDATA[width]]></name>
+                       <value><![CDATA[page.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#page]]></selector>
+                       <name><![CDATA[max-width]]></name>
+                       <value><![CDATA[page.width.max]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[#page]]></selector>
+                       <name><![CDATA[min-width]]></name>
+                       <value><![CDATA[page.width.min]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallPages]]></selector>
+                       <name><![CDATA[font-size]]></name>
+                       <value><![CDATA[page.font.2nd.size]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[body]]></selector>
+                       <name><![CDATA[text-align]]></name>
+                       <value><![CDATA[page.alignment]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[buttons.small.background.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.profileDisplay fieldset]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userProfileBox #userProfileAvatar fieldset div]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .disabled]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-1 .disabled a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container1.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 .disabled]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.container-2 .disabled a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container2.font.2nd.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeBox]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeBox]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeBox]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[messages.boxes.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeBox]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[messages.boxes.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.quoteBox]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.quoteBox]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[input.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.quoteBox]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[messages.boxes.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.attachmentPreview ul li a:hover]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarDisplay div]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userAvatarFramed]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[input.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userAvatarFramed]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[messages.boxes.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeLineNumbers]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container3.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeLineNumbers]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[container3.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeBox]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeBox]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[container.border.outer.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.codeBox]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[container.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userProfileContent .fieldTitle]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.userProfileContent .fieldValue]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect li label]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container.border.inner.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect .selected label]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect .selected label]]></selector>
+                       <name><![CDATA[background-image]]></name>
+                       <value><![CDATA[selection.background.image]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect .selected label]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[selection.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect .selected label]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.avatarSelect .selected label]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li.selected]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[selection.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li.selected]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li.selected]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li.selected > a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.largeButtons li.selected > a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li.selected]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[selection.border.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li.selected]]></selector>
+                       <name><![CDATA[border-style]]></name>
+                       <value><![CDATA[selection.border.style]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li.selected]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[selection.border.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li.selected > a]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[selection.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.smallButtons li.selected > a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[selection.link.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.optionButtons li]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[menu.dropdown.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.li.extraButton]]></selector>
+                       <name><![CDATA[border-width]]></name>
+                       <value><![CDATA[buttons.small.border.outer.width]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.attachmentPreview ul li a]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container.border.outer.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.galleryAlbumCover img]]></selector>
+                       <name><![CDATA[background-color]]></name>
+                       <value><![CDATA[container4.background.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+                       <name><![CDATA[border-color]]></name>
+                       <value><![CDATA[container1.font.color]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList div.pageMenu a:hover]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+               </attribute>
+               <attribute>
+                       <selector><![CDATA[.tableList div.pageMenu a]]></selector>
+                       <name><![CDATA[color]]></name>
+                       <value><![CDATA[menu.dropdown.link.color]]></value>
+               </attribute>
+       </delete>
 </data>
\ No newline at end of file
index e39f180c096bd2c0b1b4e740dc513a36082ba42a..fc49ada05df7ca8444c7d3b0f0e2eb2bba1fb69e 100644 (file)
@@ -1,2 +1,2 @@
-<!DOCTYPE html>\r
-<html dir="{lang}wcf.global.pageDirection{/lang}" lang="{@LANGUAGE_CODE}">\r
+<!DOCTYPE html>
+<html dir="{lang}wcf.global.pageDirection{/lang}" lang="{@LANGUAGE_CODE}">
index 9f17042f6f02bbfe5b7b5af319b865f555f855fe..9d2d260af0b9afad61a514e73d9ebec99d2b05af 100644 (file)
@@ -1,5 +1,5 @@
-<div id="footerContainer">\r
-       <div id="footer">\r
-               {include file=footerMenu}\r
-       </div>\r
+<div id="footerContainer">
+       <div id="footer">
+               {include file=footerMenu}
+       </div>
 </div>
\ No newline at end of file
index 162c75db79877481e07dc707faf604c97d0b91dd..c0f40af94e2f65c0b34d06a00693363400cb646f 100644 (file)
@@ -1,5 +1,5 @@
-<meta charset="utf-8" />\r
-<meta http-equiv="content-type" content="text/html; charset=UTF-8" />\r
-<meta name="description" content="{META_DESCRIPTION}" />\r
-<meta name="keywords" content="{META_KEYWORDS}" />\r
+<meta charset="utf-8" />
+<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+<meta name="description" content="{META_DESCRIPTION}" />
+<meta name="keywords" content="{META_KEYWORDS}" />
 <meta http-equiv="X-UA-Compatible" content="IE=edge" />
\ No newline at end of file
index e63f3358e636b8e6b0d247f1c4d0eaa9677e29c1..eae1cf6dda31fd8a929029020b745ec4f58aee06 100644 (file)
@@ -1,5 +1,5 @@
-<a id="top" name="top"></a>\r
-<div id="page">\r
-       <div id="header" class="border">\r
-               {include file=headerMenu}\r
+<a id="top" name="top"></a>
+<div id="page">
+       <div id="header" class="border">
+               {include file=headerMenu}
        </div>
\ No newline at end of file
index 43ee6c78af3cc9b52fb88beb8d2e7e01d45da3d7..6b4bf7d5d26f1b2b25cf91e455767e214f711f8d 100644 (file)
@@ -1,21 +1,21 @@
-{if $__wcf->getPageMenu()->getMenuItems('header')|count > 0}\r
-       <div id="mainMenu" class="mainMenu">\r
-               <div class="mainMenuInner">\r
-                       <ul>\r
-                               {foreach from=$__wcf->getPageMenu()->getMenuItems('header') item=menuItem}\r
-                                       <li><a href="{$menuItem->menuItemLink}">{$menuItem->menuItem} ({#$menuItem->getProvider()->getNotifications()})</a>\r
-                                       \r
-                                       {if $__wcf->getPageMenu()->getMenuItems($menuItem->menuItem)|count > 0}\r
-                                               <ul>\r
-                                                       {foreach from=$__wcf->getPageMenu()->getMenuItems($menuItem->menuItem) item=subMenuItem}\r
-                                                               <li><a href="{$subMenuItem->menuItemLink}">{$subMenuItem->menuItem} ({#$subMenuItem->getProvider()->getNotifications()})</a></li>\r
-                                                       {/foreach}\r
-                                               </ul>\r
-                                       {/if}\r
-                                       \r
-                                       </li>\r
-                               {/foreach}\r
-                       </ul>\r
-               </div>\r
-       </div>\r
-{/if}\r
+{if $__wcf->getPageMenu()->getMenuItems('header')|count > 0}
+       <div id="mainMenu" class="mainMenu">
+               <div class="mainMenuInner">
+                       <ul>
+                               {foreach from=$__wcf->getPageMenu()->getMenuItems('header') item=menuItem}
+                                       <li><a href="{$menuItem->menuItemLink}">{$menuItem->menuItem} ({#$menuItem->getProvider()->getNotifications()})</a>
+                                       
+                                       {if $__wcf->getPageMenu()->getMenuItems($menuItem->menuItem)|count > 0}
+                                               <ul>
+                                                       {foreach from=$__wcf->getPageMenu()->getMenuItems($menuItem->menuItem) item=subMenuItem}
+                                                               <li><a href="{$subMenuItem->menuItemLink}">{$subMenuItem->menuItem} ({#$subMenuItem->getProvider()->getNotifications()})</a></li>
+                                                       {/foreach}
+                                               </ul>
+                                       {/if}
+                                       
+                                       </li>
+                               {/foreach}
+                       </ul>
+               </div>
+       </div>
+{/if}
index 971044f485816da8326dbf54706a09efe98b482d..905ef437588416551cf5475daa0547ecfad0e43d 100644 (file)
@@ -1,3 +1,3 @@
-<input {if $optionData.enableOptions}onclick="{@$optionData.enableOptions}" {/if}\r
-id="{$optionData.optionName}" type="checkbox" name="values[{$optionData.optionName}]" value="1"\r
+<input {if $optionData.enableOptions}onclick="{@$optionData.enableOptions}" {/if}
+id="{$optionData.optionName}" type="checkbox" name="values[{$optionData.optionName}]" value="1"
 {if $optionData.optionValue}checked="checked" {/if}/>
\ No newline at end of file
index 2668c3f5698cd71aabdfdb102e43246900aa6a76..b9ad12a41babd6cd9cbaef51d06ac99513d2c405 100644 (file)
@@ -1,26 +1,26 @@
-<div class="floatContainer">\r
-       {foreach from=$dateInputOrder item=element}\r
-               <div class="floatedElement">\r
-                       <label for="{$optionData.optionName}{$element|ucfirst}">{lang}wcf.global.date.{$element}{/lang}</label>\r
-                       \r
-                       {if $element == 'day'}\r
-                               <select id="{$optionData.optionName}Day" name="values[{$optionData.optionName}][day]">\r
-                                       {htmlOptions options=$days selected=$day}\r
-                               </select>\r
-                       {/if}\r
-                       \r
-                       {if $element == 'month'}\r
-                               <select id="{$optionData.optionName}Month" name="values[{$optionData.optionName}][month]">\r
-                                       {htmlOptions options=$months selected=$month}\r
-                               </select>\r
-                       {/if}\r
-                       \r
-                       {if $element == 'year'}\r
-                               <input id="{$optionData.optionName}Year" class="inputText fourDigitInput" type="text" name="values[{$optionData.optionName}][year]" value="{$year}" maxlength="4" />\r
-                       {/if}\r
-               </div>\r
-       {/foreach}\r
-</div>\r
-{if !$yearRequired}\r
-       <p class="smallFont light">{lang}wcf.global.date.year.notRequired{/lang}</p>\r
+<div class="floatContainer">
+       {foreach from=$dateInputOrder item=element}
+               <div class="floatedElement">
+                       <label for="{$optionData.optionName}{$element|ucfirst}">{lang}wcf.global.date.{$element}{/lang}</label>
+                       
+                       {if $element == 'day'}
+                               <select id="{$optionData.optionName}Day" name="values[{$optionData.optionName}][day]">
+                                       {htmlOptions options=$days selected=$day}
+                               </select>
+                       {/if}
+                       
+                       {if $element == 'month'}
+                               <select id="{$optionData.optionName}Month" name="values[{$optionData.optionName}][month]">
+                                       {htmlOptions options=$months selected=$month}
+                               </select>
+                       {/if}
+                       
+                       {if $element == 'year'}
+                               <input id="{$optionData.optionName}Year" class="inputText fourDigitInput" type="text" name="values[{$optionData.optionName}][year]" value="{$year}" maxlength="4" />
+                       {/if}
+               </div>
+       {/foreach}
+</div>
+{if !$yearRequired}
+       <p class="smallFont light">{lang}wcf.global.date.year.notRequired{/lang}</p>
 {/if}
\ No newline at end of file
index 56463312953fada7369ddf273274bf04689f3f2c..11bbeb1156f5dc6666b11ccfdd25e468430a11a1 100644 (file)
@@ -1,5 +1,5 @@
-<select name="values[{$optionData.optionName}][]" id="{$optionData.optionName}" multiple="multiple" size="{if $options|count > 10}10{else}{@$options|count}{/if}">\r
-{foreach from=$options item=option key=key}\r
-       <option value="{$key}"{if $key|in_array:$optionData.optionValue} selected="selected"{/if}>{lang}{@$option}{/lang}</option>\r
-{/foreach}\r
+<select name="values[{$optionData.optionName}][]" id="{$optionData.optionName}" multiple="multiple" size="{if $options|count > 10}10{else}{@$options|count}{/if}">
+{foreach from=$options item=option key=key}
+       <option value="{$key}"{if $key|in_array:$optionData.optionValue} selected="selected"{/if}>{lang}{@$option}{/lang}</option>
+{/foreach}
 </select>
\ No newline at end of file
index d91419e0ebb86324757367386b6c941180e9b221..0162d06019a0239ae9d9277840424ac941a22769 100644 (file)
@@ -1,10 +1,10 @@
-<ul class="formOptionsLong">\r
-       {foreach from=$options item=option key=key}\r
-               <li>\r
-                       <label><input {if $option.enableOptions}onclick="if (IS_SAFARI) {@$option.enableOptions}" onfocus="{@$option.enableOptions}" {/if}\r
-                       type="radio" name="values[{$optionData.optionName}]" value="{$key}"\r
-                       {if $optionData.optionValue == $key}checked="checked" {/if}/>\r
-                       {lang}{@$option.value}{/lang}</label>\r
-               </li>\r
-       {/foreach}\r
+<ul class="formOptionsLong">
+       {foreach from=$options item=option key=key}
+               <li>
+                       <label><input {if $option.enableOptions}onclick="if (IS_SAFARI) {@$option.enableOptions}" onfocus="{@$option.enableOptions}" {/if}
+                       type="radio" name="values[{$optionData.optionName}]" value="{$key}"
+                       {if $optionData.optionValue == $key}checked="checked" {/if}/>
+                       {lang}{@$option.value}{/lang}</label>
+               </li>
+       {/foreach}
 </ul>
\ No newline at end of file
index 7bb2ee14e9075eaf55c65dc26ca83286cddec198..255cd2fad6f78db86f22aee3409a1beafc1c8d27 100644 (file)
@@ -1,5 +1,5 @@
-<select name="values[{$optionData.optionName}]" id="{$optionData.optionName}">\r
-{foreach from=$options item=option key=key}\r
-       <option value="{$key}"{if $optionData.optionValue == $key} selected="selected"{/if}>{lang}{@$option}{/lang}</option>\r
-{/foreach}\r
+<select name="values[{$optionData.optionName}]" id="{$optionData.optionName}">
+{foreach from=$options item=option key=key}
+       <option value="{$key}"{if $optionData.optionValue == $key} selected="selected"{/if}>{lang}{@$option}{/lang}</option>
+{/foreach}
 </select>
\ No newline at end of file
index 0aeb5eb4afa9e6dec03f40e11fece267172ccf58..8831f320f0c8e1b1459e26b42c5e107bbce2bb0e 100644 (file)
@@ -1,17 +1,17 @@
-{include file="documentHeader"}\r
-<head>\r
-       <title>{lang}wcf.global.error.permissionDenied.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>\r
-       {include file='headInclude' sandbox=false}\r
-</head>\r
-<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>\r
-{include file='header' sandbox=false}\r
-\r
-<div id="main">\r
-       \r
-       <p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>\r
-\r
-</div>\r
-\r
-{include file='footer' sandbox=false}\r
-</body>\r
+{include file="documentHeader"}
+<head>
+       <title>{lang}wcf.global.error.permissionDenied.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>
+       {include file='headInclude' sandbox=false}
+</head>
+<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>
+{include file='header' sandbox=false}
+
+<div id="main">
+       
+       <p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>
+
+</div>
+
+{include file='footer' sandbox=false}
+</body>
 </html>
\ No newline at end of file
index 98bd676c737a2bd909e46a0dac170238a94d550f..9f7cf9fc34003a9c10d2388b6890785df62a4aa1 100644 (file)
@@ -1,21 +1,21 @@
-{include file="documentHeader"}\r
-<head>\r
-       <title>{lang}wcf.global.redirect.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>\r
-       {include file='headInclude' sandbox=false}\r
-       <meta http-equiv="refresh" content="{if $wait|isset}{@$wait}{else}10{/if};URL={$url}" />\r
-</head>\r
-<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>\r
-{include file='header' sandbox=false}\r
-\r
-<div id="main">\r
-       \r
-       <div class="success">\r
-               <p>{@$message}</p>\r
-               <p><a href="{$url}">{lang}wcf.global.redirect.url{/lang}</a></p>\r
-       </div>\r
-\r
-</div>\r
-\r
-{include file='footer' sandbox=false}\r
-</body>\r
+{include file="documentHeader"}
+<head>
+       <title>{lang}wcf.global.redirect.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>
+       {include file='headInclude' sandbox=false}
+       <meta http-equiv="refresh" content="{if $wait|isset}{@$wait}{else}10{/if};URL={$url}" />
+</head>
+<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>
+{include file='header' sandbox=false}
+
+<div id="main">
+       
+       <div class="success">
+               <p>{@$message}</p>
+               <p><a href="{$url}">{lang}wcf.global.redirect.url{/lang}</a></p>
+       </div>
+
+</div>
+
+{include file='footer' sandbox=false}
+</body>
 </html>
\ No newline at end of file
index d8afeeeb9d5d1a662762471772ea831ce832184a..dcbcda453612fb6d7394a3affb070fa2ccc7dbbd 100644 (file)
@@ -1,30 +1,30 @@
-{include file="documentHeader"}\r
-<head>\r
-       <title>{lang}wcf.global.error.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>\r
-       {include file='headInclude' sandbox=false}\r
-       <script type="text/javascript">\r
-               //<![CDATA[\r
-               if (document.referrer) {\r
-                       onloadEvents.push(function() { document.getElementById('errorMessage').innerHTML += "<br /><a href=\"" + document.referrer + "\">{lang}wcf.global.error.backward{/lang}</a>"; });\r
-               }\r
-               //]]>\r
-       </script>\r
-</head>\r
-<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>\r
-{include file='header' sandbox=false}\r
-\r
-<div id="main">\r
-       <p class="error" id="errorMessage">\r
-               {@$message}\r
-       </p>\r
-</div>\r
-\r
-<!-- \r
-{$name} thrown in {$file} ({@$line})\r
-Stracktrace:\r
-{$stacktrace}\r
--->\r
-\r
-{include file='footer' sandbox=false}\r
-</body>\r
+{include file="documentHeader"}
+<head>
+       <title>{lang}wcf.global.error.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>
+       {include file='headInclude' sandbox=false}
+       <script type="text/javascript">
+               //<![CDATA[
+               if (document.referrer) {
+                       onloadEvents.push(function() { document.getElementById('errorMessage').innerHTML += "<br /><a href=\"" + document.referrer + "\">{lang}wcf.global.error.backward{/lang}</a>"; });
+               }
+               //]]>
+       </script>
+</head>
+<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>
+{include file='header' sandbox=false}
+
+<div id="main">
+       <p class="error" id="errorMessage">
+               {@$message}
+       </p>
+</div>
+
+<!-- 
+{$name} thrown in {$file} ({@$line})
+Stracktrace:
+{$stacktrace}
+-->
+
+{include file='footer' sandbox=false}
+</body>
 </html>
\ No newline at end of file
index 757ca7639eae60b6b54803b5be11e7c10767f15c..1a44a636429f0b3d66a97608d3d3f83b4bf0aeba 100644 (file)
@@ -1,18 +1,18 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/useroptions.xsd">\r
-       <import>\r
-               <categories>\r
-                       <category name="hidden"></category>\r
-               </categories>\r
-                       \r
-               <options>\r
-                       <option name="inlineHelpStatus">\r
-                               <categoryname>hidden</categoryname>\r
-                               <optiontype>text</optiontype>\r
-                               <visible>4</visible>\r
-                               <editable>4</editable>\r
-                               <defaultvalue>all</defaultvalue>\r
-                       </option>\r
-               </options>\r
-       </import>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/useroptions.xsd">
+       <import>
+               <categories>
+                       <category name="hidden"></category>
+               </categories>
+                       
+               <options>
+                       <option name="inlineHelpStatus">
+                               <categoryname>hidden</categoryname>
+                               <optiontype>text</optiontype>
+                               <visible>4</visible>
+                               <editable>4</editable>
+                               <defaultvalue>all</defaultvalue>
+                       </option>
+               </options>
+       </import>
 </data>
\ No newline at end of file
index 73c5cc7f679b69c30eaa194e340749fa77645aa6..9bce470740da47673c43e7f21af9ebe80023eb41 100644 (file)
-<?php\r
-/**\r
- * This script tries to find the temp folder and unzip all setup files into.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-// define constants\r
-define('INSTALL_SCRIPT_DIR', dirname(__FILE__).'/');\r
-define('SETUP_FILE', INSTALL_SCRIPT_DIR . 'WCFSetup.tar.gz');\r
-define('NO_IMPORTS', 1);\r
-\r
-// set exception handler\r
-set_exception_handler('handleException');\r
-// set php error handler\r
-set_error_handler('handleError', E_ALL);\r
-\r
-// define list of needed file\r
-$neededFilesPattern = array(\r
-       '!^setup/.*!',\r
-       '!^install/files/lib/data/.*!',\r
-       '!^install/files/lib/system/.*!',\r
-       '!^install/files/lib/util/.*!',\r
-       '!^install/files/acp/images/setup.*!',\r
-       '!^install/lang/.*!',\r
-       '!^install/packages/.*!');\r
-       \r
-// define needed functions and classes\r
-/**\r
- * WCF::handleException() calls the show method on exceptions that implement this interface.\r
- *\r
- * @package    com.woltlab.wcf.system.exception\r
- * @author     Marcel Werk\r
- */\r
-interface IPrintableException {\r
-       public function show();\r
-}\r
-\r
-// define needed classes\r
-// needed are:\r
-// SystemException, PrintableException, BasicFileUtil, Tar, File, ZipFile\r
-/**\r
- * A SystemException is thrown when an unexpected error occurs.\r
- *\r
- * @package    com.woltlab.wcf.system.exception\r
- * @author     Marcel Werk\r
- */\r
-class SystemException extends \Exception implements IPrintableException {\r
-       protected $description;\r
-       protected $information = '';\r
-       protected $functions = '';\r
-       \r
-       /**\r
-        * Creates a new SystemException.\r
-        *\r
-        * @param       message         string          error message\r
-        * @param       code            integer         error code\r
-        * @param       description     string          description of the error\r
-        */\r
-       public function __construct($message = '', $code = 0, $description = '') {\r
-               parent::__construct($message, $code);\r
-               $this->description = $description;\r
-       }\r
-       \r
-       /**\r
-        * Returns the description of this exception.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getDescription() {\r
-               return $this->description;\r
-       }\r
-       \r
-       /**\r
-        * Prints this exception.\r
-        * This method is called by WCF::handleException().\r
-        */\r
-       public function show() {\r
-               ?>\r
-<html>\r
-<head>\r
-<title>Fatal error: <?php echo htmlspecialchars($this->getMessage()); ?></title>\r
-<style type="text/css">\r
-body {\r
-       font-family: Verdana, Helvetica, sans-serif;\r
-       font-size: 0.8em;\r
-}\r
-div {\r
-       border: 1px outset lightgrey;\r
-       padding: 3px;\r
-       background-color: lightgrey;\r
-}\r
-\r
-div div {\r
-       border: 1px inset lightgrey;\r
-       padding: 4px;\r
-}\r
-\r
-h1 {\r
-       background-color: #154268;\r
-       padding: 4px;\r
-       color: #fff;\r
-       margin: 0 0 3px 0;\r
-       font-size: 1.15em;\r
-}\r
-h2 {\r
-       font-size: 1.1em;\r
-       margin-bottom: 0;\r
-}\r
-\r
-pre, p {\r
-       margin: 0;\r
-}\r
-</style>\r
-</head>\r
-<body>\r
-       <div>\r
-               <h1>Fatal error: <?php echo htmlspecialchars($this->getMessage()); ?></h1>\r
-       \r
-               <div>\r
-                       <p><?php echo $this->getDescription(); ?></p>\r
-                       <?php if ($this->getCode()) { ?><p>You get more information about the problem in our knowledge base: <a href="http://www.woltlab.com/help/?code=<?php echo intval($this->getCode()); ?>">http://www.woltlab.com/help/?code=<?php echo intval($this->getCode()); ?></a></p><?php } ?>\r
-                       \r
-                       <h2>Information:</h2>\r
-                       <p>\r
-                               <b>error message:</b> <?php echo htmlspecialchars($this->getMessage()); ?><br />\r
-                               <b>error code:</b> <?php echo intval($this->getCode()); ?><br />\r
-                               <?php echo $this->information; ?>\r
-                               <b>file:</b> <?php echo htmlspecialchars($this->getFile()); ?> (<?php echo $this->getLine(); ?>)<br />\r
-                               <b>php version:</b> <?php echo htmlspecialchars(phpversion()); ?><br />\r
-                               <b>wcf version:</b> <?php if (defined('WCF_VERSION')) echo WCF_VERSION; ?><br />\r
-                               <b>date:</b> <?php echo gmdate('r'); ?><br />\r
-                               <b>request:</b> <?php if (isset($_SERVER['REQUEST_URI'])) echo htmlspecialchars($_SERVER['REQUEST_URI']); ?><br />\r
-                               <b>referer:</b> <?php if (isset($_SERVER['HTTP_REFERER'])) echo htmlspecialchars($_SERVER['HTTP_REFERER']); ?><br />\r
-                       </p>\r
-                       \r
-                       <h2>Stacktrace:</h2>\r
-                       <pre><?php echo htmlspecialchars($this->getTraceAsString()); ?></pre>\r
-               </div>\r
-               \r
-               <?php echo $this->functions; ?>\r
-       </div>\r
-</body>\r
-</html>\r
-\r
-<?php\r
-       }\r
-}\r
-\r
-\r
-/**\r
- * Loads the required classes automatically.\r
- */\r
-function __autoload($className) {\r
-       $namespaces = explode('\\', $className);\r
-       if (count($namespaces) > 1) {\r
-               // remove 'wcf' component\r
-               array_shift($namespaces);\r
-               \r
-               $className = implode('/', $namespaces);\r
-               $classPath = TMP_DIR . 'install/files/lib/' . $className  . '.class.php';\r
-               if (file_exists($classPath)) {\r
-                       require_once($classPath);\r
-               }\r
-       }\r
-}\r
-\r
-/**\r
- * Escapes strings for execution in sql queries.\r
- */\r
-function escapeString($string) {\r
-       return \wcf\system\WCF::getDB()->escapeString($string);\r
-}\r
-\r
-/**\r
- * Calls the show method on the given exception.\r
- *\r
- * @param      Exception       $e\r
- */\r
-function handleException(\Exception $e) {\r
-       if ($e instanceof IPrintableException || $e instanceof \wcf\system\exception\IPrintableException) {\r
-               $e->show();\r
-               exit;\r
-       }\r
-       \r
-       print $e;\r
-}\r
-\r
-/**\r
- * Catches php errors and throws instead a system exception.\r
- *\r
- * @param      integer         $errorNo\r
- * @param      string          $message\r
- * @param      string          $filename\r
- * @param      integer         $lineNo\r
- */\r
-function handleError($errorNo, $message, $filename, $lineNo) {\r
-       if (error_reporting() != 0) {\r
-               $type = 'error';\r
-               switch ($errorNo) {\r
-                       case 2: $type = 'warning';\r
-                               break;\r
-                       case 8: $type = 'notice';\r
-                               break;\r
-               }\r
-               \r
-               throw new SystemException('PHP '.$type.' in file '.$filename.' ('.$lineNo.'): '.$message, 0);\r
-       }\r
-}\r
-\r
-/**\r
- * BasicFileUtil contains file-related functions.\r
- *\r
- * @package    com.woltlab.wcf.util\r
- * @author     Marcel Werk\r
- */\r
-class BasicFileUtil {\r
-       /**\r
-        * Tries to find the temp folder.\r
-        *\r
-        * @return      string\r
-        */\r
-       public static function getTempFolder() {\r
-               $tmpDirName = TMP_FILE_PREFIX.'/';\r
-               \r
-               // use tmp folder in document root by default\r
-               if (!empty($_SERVER['DOCUMENT_ROOT'])) {\r
-                       if (!@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName)) {\r
-                               @mkdir($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName, 0777, true);\r
-                               @chmod($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName, 0777);\r
-                       }\r
-                       \r
-                       if (@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName) && @is_writable($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName)) {\r
-                               return $_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName;\r
-                       }\r
-               }\r
-               \r
-               foreach (array('TMP', 'TEMP', 'TMPDIR') as $tmpDir) {\r
-                       if (isset($_ENV[$tmpDir]) && @is_writable($_ENV[$tmpDir])) {\r
-                               $dir = $_ENV[$tmpDir] . '/' . $tmpDirName;\r
-                               @mkdir($dir, 0777);\r
-                               @chmod($dir, 0777);\r
-                               \r
-                               if (@file_exists($dir) && @is_writable($dir)) {\r
-                                       return $dir;\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               $dir = INSTALL_SCRIPT_DIR . 'tmp/' . $tmpDirName;\r
-               @mkdir($dir, 0777);\r
-               @chmod($dir, 0777);\r
-               \r
-               if (!@file_exists($dir) || !@is_writable($dir)) {\r
-                       $tmpDir = explode('/', $dir);\r
-                       array_pop($tmpDir);\r
-                       $dir = implode('/', $tmpDir);\r
-                       \r
-                       throw new SystemException('There is no access to the system temporary folder due to an unknown reason and no user specific temporary folder exists in '.INSTALL_SCRIPT_DIR.'! This is a misconfiguration of your webserver software! Please create a folder called '.$dir.' using your favorite ftp program, make it writable and then retry this installation.', 10000);\r
-               }\r
-               \r
-               return $dir;\r
-       }\r
-}\r
-\r
-/**\r
- * Opens tar or tar.gz archives.\r
- *\r
- * Usage:\r
- * ------\r
- * $tar = new Tar('archive.tar');\r
- * $contentList = $tar->getContentList();\r
- * foreach ($contentList as $key => $val) {\r
- *     $tar->extract($key, DESTINATION);\r
- * }\r
- */\r
-class Tar {\r
-       protected $archiveName = '';\r
-       protected $contentList = array();\r
-       protected $opened = false;\r
-       protected $read = false;\r
-       protected $file = null;\r
-       protected $isZipped = false;\r
-       protected $mode = 'rb';\r
-       \r
-       /**\r
-        * Creates a new Tar object.\r
-        * archiveName must be tarball or gzipped tarball\r
-        *\r
-        * @param       string          $archiveName\r
-        */\r
-       public function __construct($archiveName) {\r
-               $match = array();\r
-               if (!is_file($archiveName)) {\r
-                       throw new SystemException("unable to find tar archive '".$archiveName."'", 11002);\r
-               }\r
-               \r
-               $this->archiveName = $archiveName;\r
-               $this->open();\r
-               $this->readContent();\r
-       }\r
-       \r
-       /**\r
-        * Destructor of this class, closes tar archive.\r
-        */\r
-       public function __destruct() {\r
-               $this->close();\r
-       }\r
-       \r
-       /**\r
-        * Opens the tar archive and stores filehandle.\r
-        */\r
-       public function open() {\r
-               if (!$this->opened) {\r
-                       if ($this->isZipped) $this->file = new ZipFile($this->archiveName, $this->mode);\r
-                       else {\r
-                               // test compression\r
-                               $this->file = new File($this->archiveName, $this->mode);\r
-                               if ($this->file->read(2) == "\37\213") {\r
-                                       $this->file->close();\r
-                                       $this->isZipped = true;\r
-                                       $this->file = new ZipFile($this->archiveName, $this->mode);\r
-                               }\r
-                               else {\r
-                                       $this->file->seek(0);\r
-                               }\r
-                       }\r
-                       $this->opened = true;\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Closes the opened file.\r
-        */\r
-       public function close() {\r
-               if ($this->opened) {\r
-                       $this->file->close();\r
-                       $this->opened = false;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the table of contents (TOC) list for this tar archive.\r
-        *\r
-        * @return      array           list of content\r
-        */\r
-       public function getContentList() {\r
-               if (!$this->read) {\r
-                       $this->open();\r
-                       $this->readContent();\r
-               }\r
-               return $this->contentList;\r
-       }\r
-       \r
-       /**\r
-        * Returns an associative array with information\r
-        * about a specific file in the archive.\r
-        *\r
-        * @param       mixed   $fileindex      index or name of the requested file\r
-        * @return      array   $fileInfo\r
-        */\r
-       public function getFileInfo($fileIndex) {\r
-               if (!is_int($fileIndex)) {\r
-                       $fileIndex = $this->getIndexByFilename($fileIndex);\r
-               }\r
-               \r
-               if (!isset($this->contentList[$fileIndex])) {\r
-                       throw new SystemException("Tar: could find file '$index' in archive", 11013);\r
-               }\r
-               return $this->contentList[$fileIndex];\r
-       }\r
-       \r
-       /**\r
-        * Searchs a file in the tar archive\r
-        * and returns the numeric fileindex.\r
-        * Returns false if not found.\r
-        *\r
-        * @param       string          $filename\r
-        * @return      integer                         index of the requested file\r
-        */\r
-       public function getIndexByFilename($filename) {\r
-               foreach ($this->contentList as $index => $file) {\r
-                       if ($file['filename'] == $filename) {\r
-                               return $index;\r
-                       }\r
-               }\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * Extracts a specific file and returns the content as string.\r
-        * Returns false if extraction failed.\r
-        *\r
-        * @param       mixed           $index          index or name of the requested file\r
-        * @return      string                          content of the requested file\r
-        */\r
-       public function extractToString($index) {\r
-               if (!$this->read) {\r
-                       $this->open();\r
-                       $this->readContent();\r
-               }\r
-               $header = $this->getFileInfo($index);\r
-               \r
-               // can not extract a folder\r
-               if ($header['type'] != 'file') {\r
-                       return false;\r
-               }\r
-               \r
-               // seek to offset\r
-               $this->file->seek($header['offset']);\r
-               \r
-               // read data\r
-               $content = '';\r
-               $n = floor($header['size'] / 512);\r
-               for($i = 0; $i < $n; $i++) {\r
-                       $content .= $this->file->read(512);\r
-               }\r
-               if(($header['size'] % 512) != 0) {\r
-                       $buffer = $this->file->read(512);\r
-                       $content .= substr($buffer, 0, ($header['size'] % 512));\r
-               }\r
-               \r
-               return $content;\r
-       }\r
-       \r
-       /**\r
-        * Extracts a specific file and writes it's content\r
-        * to the file specified with $destination.\r
-        *\r
-        * @param       mixed           $index          index or name of the requested file\r
-        * @param       string          $destination\r
-        * @return      boolean         $success\r
-        */\r
-       public function extract($index, $destination) {\r
-               if (!$this->read) {\r
-                       $this->open();\r
-                       $this->readContent();\r
-               }\r
-               $header = $this->getFileInfo($index);\r
-               \r
-               // can not extract a folder\r
-               if ($header['type'] != 'file') {\r
-                       return false;\r
-               }\r
-               \r
-               // seek to offset\r
-               $this->file->seek($header['offset']);\r
-               \r
-               $targetFile = new File($destination);\r
-               \r
-               // read data\r
-               $n = floor($header['size'] / 512);\r
-               for ($i = 0; $i < $n; $i++) {\r
-                       $content = $this->file->read(512);\r
-                       $targetFile->write($content, 512);\r
-               }\r
-               if (($header['size'] % 512) != 0) {\r
-                       $content = $this->file->read(512);\r
-                       $targetFile->write($content, ($header['size'] % 512));\r
-               }\r
-               \r
-               $targetFile->close();\r
-               if (function_exists('apache_get_version') || !@$targetFile->is_writable()) {\r
-                       @$targetFile->chmod(0777);\r
-               }\r
-               else {\r
-                       @$targetFile->chmod(0755);\r
-               }\r
-               \r
-               if ($header['mtime']) {\r
-                       @$targetFile->touch($header['mtime']);\r
-               }\r
-               \r
-               // check filesize\r
-               if (filesize($destination) != $header['size']) {\r
-                       throw new SystemException("Could not untar file '".$header['filename']."' to '".$destination."'. Maybe disk quota exceeded in folder '".dirname($destination)."'.", 11015);\r
-               }\r
-               \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Reads table of contents (TOC) from tar archive.\r
-        * This does not get the entire to memory but only parts of it.\r
-        */\r
-       protected function readContent() {\r
-               $this->contentList = array();\r
-               $this->read = true;\r
-               $i = 0;\r
-               \r
-               // Read the 512 bytes header\r
-               while (strlen($binaryData = $this->file->read(512)) != 0) {\r
-                       // read header\r
-                       $header = $this->readHeader($binaryData);\r
-                       if ($header === false) {\r
-                               continue;\r
-                       }\r
-                       $this->contentList[$i] = $header;\r
-                       $this->contentList[$i]['index'] = $i;\r
-                       $i++;\r
-                       \r
-                       $this->file->seek($this->file->tell() + (512 * ceil(($header['size'] / 512))));\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Unpacks file header for one file entry.\r
-        *\r
-        * @param       string          $binaryData\r
-        * @return      array           $fileheader\r
-        */\r
-       protected function readHeader($binaryData) {\r
-               if (strlen($binaryData) != 512) {\r
-                       return false;\r
-               }\r
-\r
-               $header = array();\r
-               $checksum = 0;\r
-               // First part of the header\r
-               for ($i = 0; $i < 148; $i++) {\r
-                       $checksum += ord(substr($binaryData, $i, 1));\r
-               }\r
-               // Calculate the checksum\r
-               // Ignore the checksum value and replace it by ' ' (space)\r
-               for ($i = 148; $i < 156; $i++) {\r
-                       $checksum += ord(' ');\r
-               }\r
-               // Last part of the header\r
-               for ($i = 156; $i < 512; $i++) {\r
-                       $checksum += ord(substr($binaryData, $i, 1));\r
-               }\r
-\r
-               // Extract the values\r
-               //$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $binaryData);\r
-               $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $binaryData);\r
-               \r
-               // Extract the properties\r
-               $header['checksum'] = octDec(trim($data['checksum']));\r
-               if ($header['checksum'] == $checksum) {\r
-                       $header['filename'] = trim($data['filename']);\r
-                       $header['mode'] = octDec(trim($data['mode']));\r
-                       $header['uid'] = octDec(trim($data['uid']));\r
-                       $header['gid'] = octDec(trim($data['gid']));\r
-                       $header['size'] = octDec(trim($data['size']));\r
-                       $header['mtime'] = octDec(trim($data['mtime']));\r
-                       $header['prefix'] = trim($data['prefix']);\r
-                       if ($header['prefix']) {\r
-                               $header['filename'] = $header['prefix'].'/'.$header['filename'];\r
-                       }\r
-                       if (($header['typeflag'] = $data['typeflag']) == '5') {\r
-                               $header['size'] = 0;\r
-                               $header['type'] = 'folder';\r
-                       }\r
-                       else {\r
-                               $header['type'] = 'file';\r
-                       }\r
-                       $header['offset'] = $this->file->tell();\r
-                       \r
-                       return $header;\r
-               }\r
-               else {\r
-                       return false;\r
-               }\r
-       }\r
-}\r
-\r
-/**\r
- * The File class handles all file operations.\r
- *\r
- * Example:\r
- * using php functions:\r
- * $fp = fopen('filename', 'wb');\r
- * fwrite($fp, '...');\r
- * fclose($fp);\r
- *\r
- * using this class:\r
- * $file = new File('filename');\r
- * $file->write('...');\r
- * $file->close();\r
- *\r
- * @author     Marcel Werk\r
- */\r
-class File {\r
-       protected $resource = null;\r
-       protected $filename;\r
-       \r
-       /**\r
-        * Opens a new file.\r
-        *\r
-        * @param       string          $filename\r
-        * @param       string          $mode\r
-        */\r
-       public function __construct($filename, $mode = 'wb') {\r
-               $this->filename = $filename;\r
-               $this->resource = fopen($filename, $mode);\r
-               if ($this->resource === false) {\r
-                       throw new SystemException('Can not open file ' . $filename, 11012);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Calls the specified function on the open file.\r
-        * Do not call this function directly. Use $file->write('') instead.\r
-        *\r
-        * @param       string          $function\r
-        * @param       array           $arguments\r
-        */\r
-       public function __call($function, $arguments) {\r
-               if (function_exists('f' . $function)) {\r
-                       array_unshift($arguments, $this->resource);\r
-                       return call_user_func_array('f' . $function, $arguments);\r
-               }\r
-               else if (function_exists($function)) {\r
-                       array_unshift($arguments, $this->filename);\r
-                       return call_user_func_array($function, $arguments);\r
-               }\r
-               else {\r
-                       throw new SystemException('Can not call file method ' . $function, 11003);\r
-               }\r
-       }\r
-}\r
-\r
-/**\r
- * The File class handles all file operations on a zipped file.\r
- *\r
- * @author     Marcel Werk\r
- */\r
-class ZipFile extends File {\r
-       /**\r
-        * Opens a new zipped file.\r
-        *\r
-        * @param       string          $filename\r
-        * @param       string          $mode\r
-        */\r
-       public function __construct($filename, $mode = 'wb') {\r
-               $this->filename = $filename;\r
-               if (!function_exists('gzopen')) {\r
-                       throw new SystemException('Can not find functions of the zlib extension', 11004);\r
-               }\r
-               $this->resource = @gzopen($filename, $mode);\r
-               if ($this->resource === false) {\r
-                       throw new SystemException('Can not open file ' . $filename, 11012);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Calls the specified function on the open file.\r
-        *\r
-        * @param       string          $function\r
-        * @param       array           $arguments\r
-        */\r
-       public function __call($function, $arguments) {\r
-               if (function_exists('gz' . $function)) {\r
-                       array_unshift($arguments, $this->resource);\r
-                       return call_user_func_array('gz' . $function, $arguments);\r
-               }\r
-               else if (function_exists($function)) {\r
-                       array_unshift($arguments, $this->filename);\r
-                       return call_user_func_array($function, $arguments);\r
-               }\r
-               else {\r
-                       throw new SystemException('Can not call method ' . $function, 11003);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the filesize of the unzipped file\r
-        */\r
-       public function getFileSize() {\r
-               $byteBlock = 1<<14;\r
-               $eof = $byteBlock;\r
-               \r
-               // the correction is for zip files that are too small\r
-               // to get in the first while loop\r
-               $correction = 1;\r
-               while ($this->seek($eof) == 0) {\r
-                       $eof += $byteBlock;\r
-                       $correction = 0;\r
-               }\r
-               \r
-               while ($byteBlock > 1) {\r
-                       $byteBlock >>= 1;\r
-                       $eof += $byteBlock * ($this->seek($eof) ? -1 : 1);\r
-               }\r
-               \r
-               if ($this->seek($eof) == -1) $eof -= 1;\r
-               \r
-               $this->rewind();\r
-               return $eof - $correction;\r
-       }\r
-}\r
-\r
-// let's go\r
-// get temp file prefix\r
-if (isset($_REQUEST['tmpFilePrefix'])) {\r
-       $prefix = preg_replace('/[^a-f0-9_]+/', '', $_REQUEST['tmpFilePrefix']);\r
-}\r
-else {\r
-       $prefix = substr(sha1(uniqid(microtime())), 0, 8);\r
-}\r
-define('TMP_FILE_PREFIX', $prefix);\r
-\r
-// try to find the temp folder\r
-define('TMP_DIR', BasicFileUtil::getTempFolder());\r
-\r
-// show image from temp folder\r
-if (isset($_GET['showImage'])) {\r
-       if (preg_match('~[\w\-]+\.(jpg|png)~', $_GET['showImage'], $match)) {\r
-               if ($match[1] == 'jpg') header('Content-Type: image/jpg');\r
-               else header('Content-Type: image/png');\r
-               readfile(TMP_DIR . 'install/files/acp/images/' . $_GET['showImage']);\r
-       }\r
-       exit;\r
-}\r
-\r
-// check whether setup files already unzipped\r
-if (!file_exists(TMP_DIR . 'install/files/lib/system/WCFSetup.class.php')) {\r
-       // try to unzip all setup files into temp folder\r
-       $tar = new Tar(SETUP_FILE);\r
-       $contentList = $tar->getContentList();\r
-       if (!count($contentList)) {\r
-               throw new SystemException("Can not unpack 'WCFSetup.tar.gz'. File is probably broken.", 11016);\r
-       }\r
-       \r
-       foreach ($contentList as $file) {\r
-               foreach ($neededFilesPattern as $pattern) {\r
-                       if (preg_match($pattern, $file['filename'])) {\r
-                               // create directory if not exists\r
-                               $dir = TMP_DIR . dirname($file['filename']);\r
-                               if (!@is_dir($dir)) {\r
-                                       @mkdir($dir, 0777, true);\r
-                                       @chmod($dir, 0777);\r
-                               }\r
-                               \r
-                               $tar->extract($file['index'], TMP_DIR . $file['filename']);\r
-                       }\r
-               }\r
-       }\r
-       $tar->close();\r
-       \r
-       // create cache folders\r
-       @mkdir(TMP_DIR . 'setup/lang/cache/', 0777);\r
-       @chmod(TMP_DIR . 'setup/lang/cache/', 0777);\r
-       \r
-       @mkdir(TMP_DIR . 'setup/template/compiled/', 0777);\r
-       @chmod(TMP_DIR . 'setup/template/compiled/', 0777);\r
-}\r
-\r
-if (!class_exists('wcf\system\WCFSetup')) {\r
-       throw new SystemException("Can not find class 'WCFSetup'", 11006);\r
-}\r
-\r
-// start setup\r
+<?php
+/**
+ * This script tries to find the temp folder and unzip all setup files into.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+// define constants
+define('INSTALL_SCRIPT_DIR', dirname(__FILE__).'/');
+define('SETUP_FILE', INSTALL_SCRIPT_DIR . 'WCFSetup.tar.gz');
+define('NO_IMPORTS', 1);
+
+// set exception handler
+set_exception_handler('handleException');
+// set php error handler
+set_error_handler('handleError', E_ALL);
+
+// define list of needed file
+$neededFilesPattern = array(
+       '!^setup/.*!',
+       '!^install/files/lib/data/.*!',
+       '!^install/files/lib/system/.*!',
+       '!^install/files/lib/util/.*!',
+       '!^install/files/acp/images/setup.*!',
+       '!^install/lang/.*!',
+       '!^install/packages/.*!');
+       
+// define needed functions and classes
+/**
+ * WCF::handleException() calls the show method on exceptions that implement this interface.
+ *
+ * @package    com.woltlab.wcf.system.exception
+ * @author     Marcel Werk
+ */
+interface IPrintableException {
+       public function show();
+}
+
+// define needed classes
+// needed are:
+// SystemException, PrintableException, BasicFileUtil, Tar, File, ZipFile
+/**
+ * A SystemException is thrown when an unexpected error occurs.
+ *
+ * @package    com.woltlab.wcf.system.exception
+ * @author     Marcel Werk
+ */
+class SystemException extends \Exception implements IPrintableException {
+       protected $description;
+       protected $information = '';
+       protected $functions = '';
+       
+       /**
+        * Creates a new SystemException.
+        *
+        * @param       message         string          error message
+        * @param       code            integer         error code
+        * @param       description     string          description of the error
+        */
+       public function __construct($message = '', $code = 0, $description = '') {
+               parent::__construct($message, $code);
+               $this->description = $description;
+       }
+       
+       /**
+        * Returns the description of this exception.
+        *
+        * @return      string
+        */
+       public function getDescription() {
+               return $this->description;
+       }
+       
+       /**
+        * Prints this exception.
+        * This method is called by WCF::handleException().
+        */
+       public function show() {
+               ?>
+<html>
+<head>
+<title>Fatal error: <?php echo htmlspecialchars($this->getMessage()); ?></title>
+<style type="text/css">
+body {
+       font-family: Verdana, Helvetica, sans-serif;
+       font-size: 0.8em;
+}
+div {
+       border: 1px outset lightgrey;
+       padding: 3px;
+       background-color: lightgrey;
+}
+
+div div {
+       border: 1px inset lightgrey;
+       padding: 4px;
+}
+
+h1 {
+       background-color: #154268;
+       padding: 4px;
+       color: #fff;
+       margin: 0 0 3px 0;
+       font-size: 1.15em;
+}
+h2 {
+       font-size: 1.1em;
+       margin-bottom: 0;
+}
+
+pre, p {
+       margin: 0;
+}
+</style>
+</head>
+<body>
+       <div>
+               <h1>Fatal error: <?php echo htmlspecialchars($this->getMessage()); ?></h1>
+       
+               <div>
+                       <p><?php echo $this->getDescription(); ?></p>
+                       <?php if ($this->getCode()) { ?><p>You get more information about the problem in our knowledge base: <a href="http://www.woltlab.com/help/?code=<?php echo intval($this->getCode()); ?>">http://www.woltlab.com/help/?code=<?php echo intval($this->getCode()); ?></a></p><?php } ?>
+                       
+                       <h2>Information:</h2>
+                       <p>
+                               <b>error message:</b> <?php echo htmlspecialchars($this->getMessage()); ?><br />
+                               <b>error code:</b> <?php echo intval($this->getCode()); ?><br />
+                               <?php echo $this->information; ?>
+                               <b>file:</b> <?php echo htmlspecialchars($this->getFile()); ?> (<?php echo $this->getLine(); ?>)<br />
+                               <b>php version:</b> <?php echo htmlspecialchars(phpversion()); ?><br />
+                               <b>wcf version:</b> <?php if (defined('WCF_VERSION')) echo WCF_VERSION; ?><br />
+                               <b>date:</b> <?php echo gmdate('r'); ?><br />
+                               <b>request:</b> <?php if (isset($_SERVER['REQUEST_URI'])) echo htmlspecialchars($_SERVER['REQUEST_URI']); ?><br />
+                               <b>referer:</b> <?php if (isset($_SERVER['HTTP_REFERER'])) echo htmlspecialchars($_SERVER['HTTP_REFERER']); ?><br />
+                       </p>
+                       
+                       <h2>Stacktrace:</h2>
+                       <pre><?php echo htmlspecialchars($this->getTraceAsString()); ?></pre>
+               </div>
+               
+               <?php echo $this->functions; ?>
+       </div>
+</body>
+</html>
+
+<?php
+       }
+}
+
+
+/**
+ * Loads the required classes automatically.
+ */
+function __autoload($className) {
+       $namespaces = explode('\\', $className);
+       if (count($namespaces) > 1) {
+               // remove 'wcf' component
+               array_shift($namespaces);
+               
+               $className = implode('/', $namespaces);
+               $classPath = TMP_DIR . 'install/files/lib/' . $className  . '.class.php';
+               if (file_exists($classPath)) {
+                       require_once($classPath);
+               }
+       }
+}
+
+/**
+ * Escapes strings for execution in sql queries.
+ */
+function escapeString($string) {
+       return \wcf\system\WCF::getDB()->escapeString($string);
+}
+
+/**
+ * Calls the show method on the given exception.
+ *
+ * @param      Exception       $e
+ */
+function handleException(\Exception $e) {
+       if ($e instanceof IPrintableException || $e instanceof \wcf\system\exception\IPrintableException) {
+               $e->show();
+               exit;
+       }
+       
+       print $e;
+}
+
+/**
+ * Catches php errors and throws instead a system exception.
+ *
+ * @param      integer         $errorNo
+ * @param      string          $message
+ * @param      string          $filename
+ * @param      integer         $lineNo
+ */
+function handleError($errorNo, $message, $filename, $lineNo) {
+       if (error_reporting() != 0) {
+               $type = 'error';
+               switch ($errorNo) {
+                       case 2: $type = 'warning';
+                               break;
+                       case 8: $type = 'notice';
+                               break;
+               }
+               
+               throw new SystemException('PHP '.$type.' in file '.$filename.' ('.$lineNo.'): '.$message, 0);
+       }
+}
+
+/**
+ * BasicFileUtil contains file-related functions.
+ *
+ * @package    com.woltlab.wcf.util
+ * @author     Marcel Werk
+ */
+class BasicFileUtil {
+       /**
+        * Tries to find the temp folder.
+        *
+        * @return      string
+        */
+       public static function getTempFolder() {
+               $tmpDirName = TMP_FILE_PREFIX.'/';
+               
+               // use tmp folder in document root by default
+               if (!empty($_SERVER['DOCUMENT_ROOT'])) {
+                       if (!@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName)) {
+                               @mkdir($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName, 0777, true);
+                               @chmod($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName, 0777);
+                       }
+                       
+                       if (@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName) && @is_writable($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName)) {
+                               return $_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName;
+                       }
+               }
+               
+               foreach (array('TMP', 'TEMP', 'TMPDIR') as $tmpDir) {
+                       if (isset($_ENV[$tmpDir]) && @is_writable($_ENV[$tmpDir])) {
+                               $dir = $_ENV[$tmpDir] . '/' . $tmpDirName;
+                               @mkdir($dir, 0777);
+                               @chmod($dir, 0777);
+                               
+                               if (@file_exists($dir) && @is_writable($dir)) {
+                                       return $dir;
+                               }
+                       }
+               }
+               
+               $dir = INSTALL_SCRIPT_DIR . 'tmp/' . $tmpDirName;
+               @mkdir($dir, 0777);
+               @chmod($dir, 0777);
+               
+               if (!@file_exists($dir) || !@is_writable($dir)) {
+                       $tmpDir = explode('/', $dir);
+                       array_pop($tmpDir);
+                       $dir = implode('/', $tmpDir);
+                       
+                       throw new SystemException('There is no access to the system temporary folder due to an unknown reason and no user specific temporary folder exists in '.INSTALL_SCRIPT_DIR.'! This is a misconfiguration of your webserver software! Please create a folder called '.$dir.' using your favorite ftp program, make it writable and then retry this installation.', 10000);
+               }
+               
+               return $dir;
+       }
+}
+
+/**
+ * Opens tar or tar.gz archives.
+ *
+ * Usage:
+ * ------
+ * $tar = new Tar('archive.tar');
+ * $contentList = $tar->getContentList();
+ * foreach ($contentList as $key => $val) {
+ *     $tar->extract($key, DESTINATION);
+ * }
+ */
+class Tar {
+       protected $archiveName = '';
+       protected $contentList = array();
+       protected $opened = false;
+       protected $read = false;
+       protected $file = null;
+       protected $isZipped = false;
+       protected $mode = 'rb';
+       
+       /**
+        * Creates a new Tar object.
+        * archiveName must be tarball or gzipped tarball
+        *
+        * @param       string          $archiveName
+        */
+       public function __construct($archiveName) {
+               $match = array();
+               if (!is_file($archiveName)) {
+                       throw new SystemException("unable to find tar archive '".$archiveName."'", 11002);
+               }
+               
+               $this->archiveName = $archiveName;
+               $this->open();
+               $this->readContent();
+       }
+       
+       /**
+        * Destructor of this class, closes tar archive.
+        */
+       public function __destruct() {
+               $this->close();
+       }
+       
+       /**
+        * Opens the tar archive and stores filehandle.
+        */
+       public function open() {
+               if (!$this->opened) {
+                       if ($this->isZipped) $this->file = new ZipFile($this->archiveName, $this->mode);
+                       else {
+                               // test compression
+                               $this->file = new File($this->archiveName, $this->mode);
+                               if ($this->file->read(2) == "\37\213") {
+                                       $this->file->close();
+                                       $this->isZipped = true;
+                                       $this->file = new ZipFile($this->archiveName, $this->mode);
+                               }
+                               else {
+                                       $this->file->seek(0);
+                               }
+                       }
+                       $this->opened = true;
+               }
+       }
+
+       /**
+        * Closes the opened file.
+        */
+       public function close() {
+               if ($this->opened) {
+                       $this->file->close();
+                       $this->opened = false;
+               }
+       }
+       
+       /**
+        * Returns the table of contents (TOC) list for this tar archive.
+        *
+        * @return      array           list of content
+        */
+       public function getContentList() {
+               if (!$this->read) {
+                       $this->open();
+                       $this->readContent();
+               }
+               return $this->contentList;
+       }
+       
+       /**
+        * Returns an associative array with information
+        * about a specific file in the archive.
+        *
+        * @param       mixed   $fileindex      index or name of the requested file
+        * @return      array   $fileInfo
+        */
+       public function getFileInfo($fileIndex) {
+               if (!is_int($fileIndex)) {
+                       $fileIndex = $this->getIndexByFilename($fileIndex);
+               }
+               
+               if (!isset($this->contentList[$fileIndex])) {
+                       throw new SystemException("Tar: could find file '$index' in archive", 11013);
+               }
+               return $this->contentList[$fileIndex];
+       }
+       
+       /**
+        * Searchs a file in the tar archive
+        * and returns the numeric fileindex.
+        * Returns false if not found.
+        *
+        * @param       string          $filename
+        * @return      integer                         index of the requested file
+        */
+       public function getIndexByFilename($filename) {
+               foreach ($this->contentList as $index => $file) {
+                       if ($file['filename'] == $filename) {
+                               return $index;
+                       }
+               }
+               return false;
+       }
+       
+       /**
+        * Extracts a specific file and returns the content as string.
+        * Returns false if extraction failed.
+        *
+        * @param       mixed           $index          index or name of the requested file
+        * @return      string                          content of the requested file
+        */
+       public function extractToString($index) {
+               if (!$this->read) {
+                       $this->open();
+                       $this->readContent();
+               }
+               $header = $this->getFileInfo($index);
+               
+               // can not extract a folder
+               if ($header['type'] != 'file') {
+                       return false;
+               }
+               
+               // seek to offset
+               $this->file->seek($header['offset']);
+               
+               // read data
+               $content = '';
+               $n = floor($header['size'] / 512);
+               for($i = 0; $i < $n; $i++) {
+                       $content .= $this->file->read(512);
+               }
+               if(($header['size'] % 512) != 0) {
+                       $buffer = $this->file->read(512);
+                       $content .= substr($buffer, 0, ($header['size'] % 512));
+               }
+               
+               return $content;
+       }
+       
+       /**
+        * Extracts a specific file and writes it's content
+        * to the file specified with $destination.
+        *
+        * @param       mixed           $index          index or name of the requested file
+        * @param       string          $destination
+        * @return      boolean         $success
+        */
+       public function extract($index, $destination) {
+               if (!$this->read) {
+                       $this->open();
+                       $this->readContent();
+               }
+               $header = $this->getFileInfo($index);
+               
+               // can not extract a folder
+               if ($header['type'] != 'file') {
+                       return false;
+               }
+               
+               // seek to offset
+               $this->file->seek($header['offset']);
+               
+               $targetFile = new File($destination);
+               
+               // read data
+               $n = floor($header['size'] / 512);
+               for ($i = 0; $i < $n; $i++) {
+                       $content = $this->file->read(512);
+                       $targetFile->write($content, 512);
+               }
+               if (($header['size'] % 512) != 0) {
+                       $content = $this->file->read(512);
+                       $targetFile->write($content, ($header['size'] % 512));
+               }
+               
+               $targetFile->close();
+               if (function_exists('apache_get_version') || !@$targetFile->is_writable()) {
+                       @$targetFile->chmod(0777);
+               }
+               else {
+                       @$targetFile->chmod(0755);
+               }
+               
+               if ($header['mtime']) {
+                       @$targetFile->touch($header['mtime']);
+               }
+               
+               // check filesize
+               if (filesize($destination) != $header['size']) {
+                       throw new SystemException("Could not untar file '".$header['filename']."' to '".$destination."'. Maybe disk quota exceeded in folder '".dirname($destination)."'.", 11015);
+               }
+               
+               return true;
+       }
+       
+       /**
+        * Reads table of contents (TOC) from tar archive.
+        * This does not get the entire to memory but only parts of it.
+        */
+       protected function readContent() {
+               $this->contentList = array();
+               $this->read = true;
+               $i = 0;
+               
+               // Read the 512 bytes header
+               while (strlen($binaryData = $this->file->read(512)) != 0) {
+                       // read header
+                       $header = $this->readHeader($binaryData);
+                       if ($header === false) {
+                               continue;
+                       }
+                       $this->contentList[$i] = $header;
+                       $this->contentList[$i]['index'] = $i;
+                       $i++;
+                       
+                       $this->file->seek($this->file->tell() + (512 * ceil(($header['size'] / 512))));
+               }
+       }
+       
+       /**
+        * Unpacks file header for one file entry.
+        *
+        * @param       string          $binaryData
+        * @return      array           $fileheader
+        */
+       protected function readHeader($binaryData) {
+               if (strlen($binaryData) != 512) {
+                       return false;
+               }
+
+               $header = array();
+               $checksum = 0;
+               // First part of the header
+               for ($i = 0; $i < 148; $i++) {
+                       $checksum += ord(substr($binaryData, $i, 1));
+               }
+               // Calculate the checksum
+               // Ignore the checksum value and replace it by ' ' (space)
+               for ($i = 148; $i < 156; $i++) {
+                       $checksum += ord(' ');
+               }
+               // Last part of the header
+               for ($i = 156; $i < 512; $i++) {
+                       $checksum += ord(substr($binaryData, $i, 1));
+               }
+
+               // Extract the values
+               //$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $binaryData);
+               $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $binaryData);
+               
+               // Extract the properties
+               $header['checksum'] = octDec(trim($data['checksum']));
+               if ($header['checksum'] == $checksum) {
+                       $header['filename'] = trim($data['filename']);
+                       $header['mode'] = octDec(trim($data['mode']));
+                       $header['uid'] = octDec(trim($data['uid']));
+                       $header['gid'] = octDec(trim($data['gid']));
+                       $header['size'] = octDec(trim($data['size']));
+                       $header['mtime'] = octDec(trim($data['mtime']));
+                       $header['prefix'] = trim($data['prefix']);
+                       if ($header['prefix']) {
+                               $header['filename'] = $header['prefix'].'/'.$header['filename'];
+                       }
+                       if (($header['typeflag'] = $data['typeflag']) == '5') {
+                               $header['size'] = 0;
+                               $header['type'] = 'folder';
+                       }
+                       else {
+                               $header['type'] = 'file';
+                       }
+                       $header['offset'] = $this->file->tell();
+                       
+                       return $header;
+               }
+               else {
+                       return false;
+               }
+       }
+}
+
+/**
+ * The File class handles all file operations.
+ *
+ * Example:
+ * using php functions:
+ * $fp = fopen('filename', 'wb');
+ * fwrite($fp, '...');
+ * fclose($fp);
+ *
+ * using this class:
+ * $file = new File('filename');
+ * $file->write('...');
+ * $file->close();
+ *
+ * @author     Marcel Werk
+ */
+class File {
+       protected $resource = null;
+       protected $filename;
+       
+       /**
+        * Opens a new file.
+        *
+        * @param       string          $filename
+        * @param       string          $mode
+        */
+       public function __construct($filename, $mode = 'wb') {
+               $this->filename = $filename;
+               $this->resource = fopen($filename, $mode);
+               if ($this->resource === false) {
+                       throw new SystemException('Can not open file ' . $filename, 11012);
+               }
+       }
+       
+       /**
+        * Calls the specified function on the open file.
+        * Do not call this function directly. Use $file->write('') instead.
+        *
+        * @param       string          $function
+        * @param       array           $arguments
+        */
+       public function __call($function, $arguments) {
+               if (function_exists('f' . $function)) {
+                       array_unshift($arguments, $this->resource);
+                       return call_user_func_array('f' . $function, $arguments);
+               }
+               else if (function_exists($function)) {
+                       array_unshift($arguments, $this->filename);
+                       return call_user_func_array($function, $arguments);
+               }
+               else {
+                       throw new SystemException('Can not call file method ' . $function, 11003);
+               }
+       }
+}
+
+/**
+ * The File class handles all file operations on a zipped file.
+ *
+ * @author     Marcel Werk
+ */
+class ZipFile extends File {
+       /**
+        * Opens a new zipped file.
+        *
+        * @param       string          $filename
+        * @param       string          $mode
+        */
+       public function __construct($filename, $mode = 'wb') {
+               $this->filename = $filename;
+               if (!function_exists('gzopen')) {
+                       throw new SystemException('Can not find functions of the zlib extension', 11004);
+               }
+               $this->resource = @gzopen($filename, $mode);
+               if ($this->resource === false) {
+                       throw new SystemException('Can not open file ' . $filename, 11012);
+               }
+       }
+       
+       /**
+        * Calls the specified function on the open file.
+        *
+        * @param       string          $function
+        * @param       array           $arguments
+        */
+       public function __call($function, $arguments) {
+               if (function_exists('gz' . $function)) {
+                       array_unshift($arguments, $this->resource);
+                       return call_user_func_array('gz' . $function, $arguments);
+               }
+               else if (function_exists($function)) {
+                       array_unshift($arguments, $this->filename);
+                       return call_user_func_array($function, $arguments);
+               }
+               else {
+                       throw new SystemException('Can not call method ' . $function, 11003);
+               }
+       }
+       
+       /**
+        * Returns the filesize of the unzipped file
+        */
+       public function getFileSize() {
+               $byteBlock = 1<<14;
+               $eof = $byteBlock;
+               
+               // the correction is for zip files that are too small
+               // to get in the first while loop
+               $correction = 1;
+               while ($this->seek($eof) == 0) {
+                       $eof += $byteBlock;
+                       $correction = 0;
+               }
+               
+               while ($byteBlock > 1) {
+                       $byteBlock >>= 1;
+                       $eof += $byteBlock * ($this->seek($eof) ? -1 : 1);
+               }
+               
+               if ($this->seek($eof) == -1) $eof -= 1;
+               
+               $this->rewind();
+               return $eof - $correction;
+       }
+}
+
+// let's go
+// get temp file prefix
+if (isset($_REQUEST['tmpFilePrefix'])) {
+       $prefix = preg_replace('/[^a-f0-9_]+/', '', $_REQUEST['tmpFilePrefix']);
+}
+else {
+       $prefix = substr(sha1(uniqid(microtime())), 0, 8);
+}
+define('TMP_FILE_PREFIX', $prefix);
+
+// try to find the temp folder
+define('TMP_DIR', BasicFileUtil::getTempFolder());
+
+// show image from temp folder
+if (isset($_GET['showImage'])) {
+       if (preg_match('~[\w\-]+\.(jpg|png)~', $_GET['showImage'], $match)) {
+               if ($match[1] == 'jpg') header('Content-Type: image/jpg');
+               else header('Content-Type: image/png');
+               readfile(TMP_DIR . 'install/files/acp/images/' . $_GET['showImage']);
+       }
+       exit;
+}
+
+// check whether setup files already unzipped
+if (!file_exists(TMP_DIR . 'install/files/lib/system/WCFSetup.class.php')) {
+       // try to unzip all setup files into temp folder
+       $tar = new Tar(SETUP_FILE);
+       $contentList = $tar->getContentList();
+       if (!count($contentList)) {
+               throw new SystemException("Can not unpack 'WCFSetup.tar.gz'. File is probably broken.", 11016);
+       }
+       
+       foreach ($contentList as $file) {
+               foreach ($neededFilesPattern as $pattern) {
+                       if (preg_match($pattern, $file['filename'])) {
+                               // create directory if not exists
+                               $dir = TMP_DIR . dirname($file['filename']);
+                               if (!@is_dir($dir)) {
+                                       @mkdir($dir, 0777, true);
+                                       @chmod($dir, 0777);
+                               }
+                               
+                               $tar->extract($file['index'], TMP_DIR . $file['filename']);
+                       }
+               }
+       }
+       $tar->close();
+       
+       // create cache folders
+       @mkdir(TMP_DIR . 'setup/lang/cache/', 0777);
+       @chmod(TMP_DIR . 'setup/lang/cache/', 0777);
+       
+       @mkdir(TMP_DIR . 'setup/template/compiled/', 0777);
+       @chmod(TMP_DIR . 'setup/template/compiled/', 0777);
+}
+
+if (!class_exists('wcf\system\WCFSetup')) {
+       throw new SystemException("Can not find class 'WCFSetup'", 11006);
+}
+
+// start setup
 new \wcf\system\WCFSetup();
index 11ea0ce80a8b73c9ae6d0575dd872dd324edf854..add314c82e03de464526cac4d9de185f8b5b13c8 100644 (file)
@@ -1,28 +1,28 @@
-<?php\r
-/**\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @category   Community Framework\r
- */\r
-// get url\r
-$url = '';\r
-if (isset($_GET['url'])) $url = htmlspecialchars(str_replace(';', '', trim($_GET['url'])));\r
-if (empty($url)) exit;\r
-// check url\r
-$testURL = preg_replace('/[^a-z0-9:\/]+/', '', strtolower($url));\r
-if (strpos($testURL, 'script:') !== false || !preg_match('/^https?:\/\//', $testURL)) {\r
-       exit;\r
-}\r
-echo '<?xml version="1.0" encoding="UTF-8"?>';\r
-?>\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="de"><head>\r
-       <title>Dereferer</title>\r
-       <meta http-equiv="refresh" content="0;URL=<?php echo $url; ?>" />\r
-</head>\r
-<body>\r
-       <p><a href="<?php echo $url; ?>"><?php echo $url; ?></a></p>\r
-</body>\r
+<?php
+/**
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @category   Community Framework
+ */
+// get url
+$url = '';
+if (isset($_GET['url'])) $url = htmlspecialchars(str_replace(';', '', trim($_GET['url'])));
+if (empty($url)) exit;
+// check url
+$testURL = preg_replace('/[^a-z0-9:\/]+/', '', strtolower($url));
+if (strpos($testURL, 'script:') !== false || !preg_match('/^https?:\/\//', $testURL)) {
+       exit;
+}
+echo '<?xml version="1.0" encoding="UTF-8"?>';
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="de"><head>
+       <title>Dereferer</title>
+       <meta http-equiv="refresh" content="0;URL=<?php echo $url; ?>" />
+</head>
+<body>
+       <p><a href="<?php echo $url; ?>"><?php echo $url; ?></a></p>
+</body>
 </html>
\ No newline at end of file
index 4d270e0ecf3fb4864d31f6016b8eaf69fa866e40..e1551a5a6d29a4cbe02564ec14414632c4e6d6b2 100644 (file)
@@ -1,19 +1,19 @@
-<?php\r
-/**\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @category   Community Framework\r
- */\r
-// Constant to get relative path to the wcf-root-dir.\r
-// This constant is already set in each package which got an own config.inc.php \r
-if (!defined('RELATIVE_WCF_DIR')) define('RELATIVE_WCF_DIR', '../');\r
-\r
-// define the wcf-root-dir\r
-define('WCF_DIR', dirname(dirname(__FILE__)).'/');\r
-\r
-// starting wcf acp\r
-require_once(WCF_DIR.'lib/system/WCF.class.php');\r
-require_once(WCF_DIR.'lib/system/WCFACP.class.php');\r
+<?php
+/**
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @category   Community Framework
+ */
+// Constant to get relative path to the wcf-root-dir.
+// This constant is already set in each package which got an own config.inc.php 
+if (!defined('RELATIVE_WCF_DIR')) define('RELATIVE_WCF_DIR', '../');
+
+// define the wcf-root-dir
+define('WCF_DIR', dirname(dirname(__FILE__)).'/');
+
+// starting wcf acp
+require_once(WCF_DIR.'lib/system/WCF.class.php');
+require_once(WCF_DIR.'lib/system/WCFACP.class.php');
 new wcf\system\WCFACP();
index df335fd9b5a9ec2b471e7ed2c2a9de6d1200056d..76e8fb1dcfa2efd83d4454b136c064148bef2dc9 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>\r
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="83px" height="16px" viewBox="0 0 83 16" xml:space="preserve">\r
-       <title>WoltLab Community Framework</title>\r
-       <desc>WoltLab Community Framework Logo</desc>\r
-       \r
-       <defs>\r
-               \r
-       </defs>\r
-       \r
-       <g id="LogoWCF">\r
-               <path id="Upper_2_" style="fill:#fff;" d="M21.7739258,6.6103516c0,0.0166016-0.0043945,0.0336914-0.012207,0.0498047\r
-                       l-0.6391602,1.3535156c-0.0385742,0.0786133-0.1000977,0.1201172-0.1831055,0.1201172\r
-                       c-0.0810547,0-0.1391602-0.0375977-0.1733398-0.1118164l-0.5107422-1.0942383l-0.5268555,1.097168\r
-                       c-0.0317383,0.0639648-0.0898438,0.0976562-0.171875,0.0976562c-0.0898438,0-0.1503906-0.0351562-0.1821289-0.1049805\r
-                       L18.7382812,6.659668c-0.0083008-0.0161133-0.0112305-0.03125-0.0112305-0.0454102\r
-                       c0-0.0351562,0.0175781-0.0634766,0.0537109-0.0839844c0.0307617-0.0166016,0.065918-0.0253906,0.1040039-0.0253906\r
-                       c0.0625,0,0.1054688,0.0209961,0.1269531,0.0649414l0.5449219,1.1606445l0.5175781-1.1152344\r
-                       c0.0371094-0.0786133,0.0961914-0.1201172,0.1782227-0.1201172c0.027832,0,0.0605469,0.012207,0.0961914,0.034668\r
-                       c0.0361328,0.0229492,0.0610352,0.0473633,0.0732422,0.0756836l0.5258789,1.125l0.5361328-1.1567383\r
-                       c0.0205078-0.0458984,0.0664062-0.0664062,0.1386719-0.0664062c0.0351562,0,0.0693359,0.0078125,0.0986328,0.0229492\r
-                       C21.7568359,6.5498047,21.7739258,6.5766602,21.7739258,6.6103516L21.7739258,6.6103516z M30.7270508,7.7226562\r
-                       c0,0.0849609-0.0458984,0.1386719-0.1396484,0.1611328c-0.0214844,0.003418-0.0507812,0.0078125-0.090332,0.0112305\r
-                       c-0.0390625,0.0014648-0.0893555,0.0039062-0.1508789,0.0039062h-0.3999023c-0.0424805,0-0.0854492-0.0024414-0.1279297-0.0073242\r
-                       c-0.0424805-0.0078125-0.0854492-0.0126953-0.128418-0.0224609c-0.1210938-0.0288086-0.1801758-0.0737305-0.1801758-0.1328125\r
-                       V7.1044922h0.8388672c0.2524414,0,0.378418,0.0551758,0.378418,0.1645508V7.7226562L30.7270508,7.7226562z M31.0083008,7.7314453\r
-                       V7.2641602c0-0.2636719-0.2216797-0.3955078-0.6640625-0.3955078h-0.8344727V6.6201172\r
-                       c0-0.0703125-0.0356445-0.1049805-0.1040039-0.1049805c-0.0698242,0-0.1103516,0.0029297-0.1210938,0.0078125\r
-                       c-0.0371094,0.0131836-0.0551758,0.0449219-0.0551758,0.0957031v1.1176758c0,0.1376953,0.0839844,0.2426758,0.253418,0.3134766\r
-                       c0.1303711,0.0551758,0.2749023,0.0839844,0.4321289,0.0839844h0.4291992C30.7866211,8.1337891,31.0083008,8,31.0083008,7.7314453\r
-                       L31.0083008,7.7314453z M28.7851562,7.684082c0,0.0947266-0.0268555,0.15625-0.0800781,0.1850586\r
-                       C28.6665039,7.887207,28.59375,7.8989258,28.4902344,7.8989258h-0.6948242c-0.0703125,0-0.1318359-0.0087891-0.1855469-0.0288086\r
-                       c-0.081543-0.0249023-0.1235352-0.0600586-0.1235352-0.1083984V7.6005859c0-0.0424805,0.0400391-0.0800781,0.1191406-0.1079102\r
-                       c0.0625-0.0209961,0.1230469-0.0332031,0.1821289-0.0332031h0.9931641L28.78125,7.5078125l0.0024414,0.0634766l0.0014648,0.0664062\r
-                       V7.684082L28.7851562,7.684082z M29.0600586,7.7490234V7.2495117c0-0.1728516-0.1010742-0.2866211-0.3051758-0.3452148\r
-                       c-0.1186523-0.0297852-0.2895508-0.0463867-0.5131836-0.0463867c-0.0693359,0-0.1040039,0.0341797-0.1040039,0.1030273\r
-                       c0,0.0878906,0.034668,0.1318359,0.1040039,0.1318359h0.0327148h0.0205078h0.0126953h0.0126953l0.0478516-0.0009766\r
-                       l0.0351562-0.0024414c0.2387695,0,0.3647461,0.0449219,0.3803711,0.137207H27.793457\r
-                       c-0.152832,0-0.2797852,0.0249023-0.3813477,0.0761719c-0.1376953,0.0678711-0.2070312,0.1655273-0.2070312,0.2988281v0.1625977\r
-                       c0,0.1230469,0.0732422,0.2197266,0.2172852,0.2871094c0.1064453,0.0546875,0.2333984,0.0825195,0.3798828,0.0825195h0.6855469\r
-                       C28.8691406,8.1337891,29.0600586,8.0048828,29.0600586,7.7490234L29.0600586,7.7490234z M27.0146484,8.0288086\r
-                       c0-0.0922852-0.0356445-0.137207-0.1044922-0.137207H25.980957c-0.1582031,0-0.2592773-0.0078125-0.3032227-0.0175781\r
-                       c-0.1347656-0.0263672-0.2041016-0.0825195-0.2041016-0.1679688V6.6162109c0-0.0517578-0.0219727-0.0834961-0.0625-0.0957031\r
-                       c-0.019043-0.0053711-0.0605469-0.0087891-0.1274414-0.0087891c-0.0693359,0-0.1040039,0.034668-0.1040039,0.1035156v1.0908203\r
-                       c0,0.1811523,0.0932617,0.3051758,0.2797852,0.3691406c0.121582,0.0390625,0.2895508,0.0585938,0.5058594,0.0585938h0.9448242\r
-                       C26.9790039,8.1337891,27.0146484,8.1000977,27.0146484,8.0288086L27.0146484,8.0288086z M25.0913086,6.9985352\r
-                       c0-0.0854492-0.0356445-0.1298828-0.1054688-0.1298828h-0.4438477V6.6166992c0-0.0488281-0.019043-0.0800781-0.0566406-0.09375\r
-                       c-0.012207-0.0068359-0.0517578-0.0112305-0.1201172-0.0112305S24.262207,6.5473633,24.262207,6.6162109v0.2524414\r
-                       c-0.0366211,0-0.0673828,0.0014648-0.090332,0.0019531c-0.0239258,0.0019531-0.0410156,0.0039062-0.0493164,0.0058594\r
-                       c-0.0458984,0.0136719-0.0668945,0.0512695-0.0668945,0.1098633s0.0209961,0.0952148,0.0668945,0.1103516\r
-                       c0.0083008,0.0014648,0.0253906,0.0043945,0.0493164,0.0053711c0.0229492,0.0024414,0.0537109,0.0024414,0.090332,0.0024414\r
-                       v0.921875c0,0.0498047,0.0180664,0.0830078,0.0571289,0.0961914c0.0117188,0.0073242,0.0507812,0.0112305,0.1196289,0.0112305\r
-                       c0.0693359,0,0.1030273-0.0336914,0.1030273-0.1049805V7.1044922h0.4438477\r
-                       C25.0556641,7.1044922,25.0913086,7.0683594,25.0913086,6.9985352L25.0913086,6.9985352z M23.9208984,8.0288086V6.6152344\r
-                       c0-0.0507812-0.0185547-0.0825195-0.0561523-0.0947266c-0.0161133-0.0053711-0.0561523-0.0087891-0.1206055-0.0087891\r
-                       c-0.0693359,0-0.1035156,0.034668-0.1035156,0.1035156v1.4111328c0,0.0498047,0.0185547,0.0830078,0.0576172,0.0961914\r
-                       C23.7080078,8.1298828,23.75,8.1337891,23.8168945,8.1337891C23.8857422,8.1337891,23.9208984,8.0976562,23.9208984,8.0288086\r
-                       L23.9208984,8.0288086z M23.1572266,7.7363281c0,0.0576172-0.0458984,0.1015625-0.1347656,0.1298828\r
-                       c-0.0664062,0.0209961-0.1357422,0.0327148-0.2094727,0.0327148h-0.4550781c-0.0869141,0-0.1621094-0.0087891-0.2275391-0.0288086\r
-                       c-0.0961914-0.0268555-0.1464844-0.0727539-0.1464844-0.1337891v-0.46875c0-0.0625,0.0483398-0.1079102,0.144043-0.1411133\r
-                       c0.0678711-0.0205078,0.144043-0.0322266,0.2280273-0.0322266h0.4550781c0.2304688,0,0.3461914,0.0527344,0.3461914,0.1513672\r
-                       V7.7363281L23.1572266,7.7363281z M23.4394531,7.7363281v-0.472168c0-0.2705078-0.206543-0.40625-0.6206055-0.40625h-0.4672852\r
-                       c-0.1655273,0-0.3051758,0.0288086-0.4165039,0.0859375c-0.1542969,0.0732422-0.2304688,0.1816406-0.2304688,0.3237305v0.46875\r
-                       c0,0.1425781,0.0761719,0.25,0.230957,0.3188477c0.1245117,0.0507812,0.2636719,0.0786133,0.4179688,0.0786133h0.465332\r
-                       c0.1689453,0,0.3041992-0.0244141,0.4057617-0.0761719C23.3681641,7.9887695,23.4394531,7.8828125,23.4394531,7.7363281\r
-                       L23.4394531,7.7363281z M31.5537109,6.1171875v0.0517578c0,0.0253906-0.0209961,0.0375977-0.0625,0.0375977h-0.1767578V6.0766602\r
-                       h0.1674805C31.5302734,6.0766602,31.5537109,6.0898438,31.5537109,6.1171875L31.5537109,6.1171875z M31.6123047,6.1689453\r
-                       V6.1171875c0-0.0639648-0.046875-0.0981445-0.140625-0.0981445h-0.2036133c-0.0112305,0-0.0166016,0.0068359-0.0166016,0.0195312\r
-                       v0.3613281c0,0.0219727,0.0097656,0.0332031,0.0292969,0.0332031c0.0224609,0,0.0336914-0.0112305,0.0336914-0.0332031v-0.140625\r
-                       l0.2519531,0.1723633c0.0102539,0.0019531,0.015625,0.003418,0.0166016,0.003418\r
-                       c0.0097656,0,0.0170898-0.0029297,0.0229492-0.0087891c0.0063477-0.0063477,0.0097656-0.0131836,0.0097656-0.0214844\r
-                       c0-0.0112305-0.0043945-0.0170898-0.0146484-0.0200195L31.4213867,6.262207h0.0629883\r
-                       C31.5698242,6.262207,31.6123047,6.2319336,31.6123047,6.1689453L31.6123047,6.1689453z M31.7441406,6.2324219\r
-                       c0,0.0888672-0.0292969,0.1650391-0.090332,0.2285156c-0.0585938,0.0625-0.1308594,0.0942383-0.2158203,0.0942383\r
-                       c-0.0820312,0-0.1552734-0.0317383-0.215332-0.0942383c-0.0600586-0.0629883-0.0888672-0.1376953-0.0888672-0.2285156\r
-                       c0-0.090332,0.0288086-0.1660156,0.0888672-0.2275391c0.0585938-0.0634766,0.1313477-0.0942383,0.215332-0.0942383\r
-                       c0.0849609,0,0.1572266,0.0307617,0.2158203,0.0942383C31.7148438,6.0683594,31.7441406,6.1455078,31.7441406,6.2324219\r
-                       L31.7441406,6.2324219z M31.8085938,6.2319336c0-0.1074219-0.0371094-0.1977539-0.1103516-0.2714844\r
-                       c-0.0722656-0.0751953-0.1577148-0.1142578-0.2602539-0.1142578c-0.1005859,0-0.1865234,0.0390625-0.2573242,0.1142578\r
-                       c-0.0712891,0.0756836-0.1069336,0.1660156-0.1069336,0.2714844c0,0.1074219,0.0356445,0.1992188,0.1069336,0.2753906\r
-                       c0.0708008,0.0737305,0.1582031,0.1103516,0.2573242,0.1103516c0.1025391,0,0.1889648-0.0366211,0.2612305-0.1103516\r
-                       C31.7714844,6.4311523,31.8085938,6.3393555,31.8085938,6.2319336L31.8085938,6.2319336z M15.5976562,9.6166992\r
-                       c0-0.1835938-0.0698242-0.2758789-0.2084961-0.2758789h-2.1367188c-0.1132812,0-0.2104492,0.003418-0.2939453,0.0083008\r
-                       c-0.0825195,0.0063477-0.1513672,0.0151367-0.2094727,0.0249023c-0.2246094,0.0415039-0.4169922,0.1240234-0.5727539,0.2426758\r
-                       c-0.1879883,0.1459961-0.2817383,0.3193359-0.2817383,0.5283203v1.6293945c0,0.1660156,0.0380859,0.3017578,0.1152344,0.4072266\r
-                       c0.0644531,0.0898438,0.1767578,0.1772461,0.3369141,0.2612305c0.1420898,0.0722656,0.2768555,0.1210938,0.4082031,0.1459961\r
-                       c0.1201172,0.0229492,0.3164062,0.0336914,0.5908203,0.0336914H15.375c0.1445312,0,0.2172852-0.0834961,0.2172852-0.2495117\r
-                       c0-0.1655273-0.0727539-0.246582-0.2172852-0.246582h-2.0292969c-0.5717773,0-0.8569336-0.1230469-0.8569336-0.3671875v-1.6176758\r
-                       c0-0.206543,0.2583008-0.3095703,0.7744141-0.3095703h2.1259766C15.527832,9.8320312,15.5976562,9.7602539,15.5976562,9.6166992\r
-                       L15.5976562,9.6166992z M19.5595703,11.8203125v-0.9550781c0-0.550293-0.4179688-0.8237305-1.2563477-0.8237305h-0.9443359\r
-                       c-0.3369141,0-0.6181641,0.0576172-0.8452148,0.1723633c-0.3100586,0.1474609-0.4643555,0.3657227-0.4643555,0.6572266v0.9492188\r
-                       c0,0.2875977,0.1552734,0.5039062,0.4672852,0.6435547c0.2514648,0.1049805,0.5341797,0.1586914,0.8447266,0.1586914h0.9418945\r
-                       c0.3422852,0,0.6166992-0.0537109,0.8217773-0.1572266C19.4150391,12.3291016,19.5595703,12.1152344,19.5595703,11.8203125\r
-                       L19.5595703,11.8203125z M18.9868164,11.8217773c0,0.1162109-0.0908203,0.2021484-0.2734375,0.2607422\r
-                       c-0.1328125,0.0439453-0.2719727,0.0654297-0.421875,0.0654297h-0.9208984c-0.175293,0-0.3286133-0.019043-0.4599609-0.0571289\r
-                       c-0.1967773-0.0581055-0.2939453-0.1469727-0.2939453-0.269043v-0.9506836c0-0.1269531,0.0957031-0.222168,0.2885742-0.2851562\r
-                       c0.1367188-0.0424805,0.2905273-0.0654297,0.4624023-0.0654297h0.9213867c0.4658203,0,0.6977539,0.1030273,0.6977539,0.3071289\r
-                       V11.8217773L18.9868164,11.8217773z M24.8198242,12.4101562v-1.527832c0-0.5595703-0.3964844-0.8408203-1.190918-0.8408203\r
-                       c-0.2954102,0-0.5058594,0.0078125-0.6308594,0.0214844c-0.2368164,0.0297852-0.4360352,0.0961914-0.5976562,0.1972656\r
-                       c-0.1806641-0.1064453-0.3769531-0.1762695-0.5908203-0.2026367c-0.050293-0.0073242-0.1274414-0.0083008-0.2299805-0.012207\r
-                       c-0.1035156-0.0039062-0.2353516-0.0039062-0.3994141-0.0039062c-0.8242188,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832\r
-                       c0,0.1411133,0.0698242,0.2124023,0.2104492,0.2124023c0.1386719,0,0.2202148-0.0073242,0.2441406-0.0234375\r
-                       c0.0742188-0.0263672,0.112793-0.090332,0.112793-0.1923828v-1.5839844c0-0.2080078,0.2431641-0.3129883,0.7285156-0.3129883\r
-                       c0.0185547,0,0.0415039,0.0014648,0.0673828,0.0014648c0.0273438,0,0.0581055,0.0039062,0.09375,0.0039062\r
-                       c0.0019531,0,0.0102539,0,0.0244141,0h0.0239258h0.0463867h0.0693359c0.1699219,0,0.2910156,0.0185547,0.3671875,0.0561523\r
-                       c0.109375,0.0561523,0.1625977,0.1582031,0.1625977,0.3110352v1.5268555c0,0.1420898,0.0712891,0.2133789,0.2128906,0.2133789\r
-                       c0.1401367,0,0.2211914-0.0073242,0.2446289-0.0234375c0.0771484-0.0263672,0.1162109-0.090332,0.1162109-0.1923828v-1.5185547\r
-                       c0-0.168457,0.0839844-0.2792969,0.2519531-0.3291016c0.0756836-0.0229492,0.2290039-0.0400391,0.4609375-0.0493164\r
-                       c0.0019531,0,0.012207,0,0.0317383,0h0.0351562h0.0751953c0.4819336,0,0.7236328,0.1030273,0.7236328,0.3071289v1.5898438\r
-                       c0,0.1020508,0.0390625,0.1660156,0.1162109,0.1923828c0.0234375,0.0161133,0.105957,0.0234375,0.2460938,0.0234375\r
-                       C24.7490234,12.6225586,24.8198242,12.5512695,24.8198242,12.4101562L24.8198242,12.4101562z M30.0795898,12.4101562v-1.527832\r
-                       c0-0.5595703-0.3969727-0.8408203-1.1914062-0.8408203c-0.2954102,0-0.5058594,0.0078125-0.6303711,0.0214844\r
-                       c-0.2373047,0.0297852-0.4360352,0.0961914-0.5976562,0.1972656c-0.1806641-0.1064453-0.3774414-0.1762695-0.5913086-0.2026367\r
-                       c-0.050293-0.0073242-0.1264648-0.0083008-0.2299805-0.012207c-0.1025391-0.0039062-0.2348633-0.0039062-0.3989258-0.0039062\r
-                       c-0.8232422,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832c0,0.1411133,0.0693359,0.2124023,0.2099609,0.2124023\r
-                       c0.1391602,0,0.2207031-0.0073242,0.2441406-0.0234375c0.0751953-0.0263672,0.1137695-0.090332,0.1137695-0.1923828v-1.5839844\r
-                       c0-0.2080078,0.2431641-0.3129883,0.7290039-0.3129883c0.0175781,0,0.0400391,0.0014648,0.0664062,0.0014648\r
-                       c0.0268555,0,0.0576172,0.0039062,0.09375,0.0039062c0.0019531,0,0.0097656,0,0.0249023,0h0.0229492h0.0463867h0.0708008\r
-                       c0.1694336,0,0.2905273,0.0185547,0.3662109,0.0561523c0.109375,0.0561523,0.1640625,0.1582031,0.1640625,0.3110352v1.5268555\r
-                       c0,0.1420898,0.0698242,0.2133789,0.2114258,0.2133789c0.1401367,0,0.2216797-0.0073242,0.2451172-0.0234375\r
-                       c0.0761719-0.0263672,0.1157227-0.090332,0.1157227-0.1923828v-1.5185547c0-0.168457,0.0844727-0.2792969,0.253418-0.3291016\r
-                       c0.0742188-0.0229492,0.2280273-0.0400391,0.4589844-0.0493164c0.0019531,0,0.0126953,0,0.0317383,0h0.0356445h0.0756836\r
-                       c0.4829102,0,0.7226562,0.1030273,0.7226562,0.3071289v1.5898438c0,0.1020508,0.0395508,0.1660156,0.1171875,0.1923828\r
-                       c0.0229492,0.0161133,0.1049805,0.0234375,0.2451172,0.0234375C30.0092773,12.6225586,30.0795898,12.5512695,30.0795898,12.4101562\r
-                       L30.0795898,12.4101562z M34.0786133,11.8505859v-1.5966797c0-0.1411133-0.0703125-0.2124023-0.2114258-0.2124023\r
-                       c-0.1401367,0-0.2226562,0.0048828-0.2456055,0.0161133c-0.0771484,0.0263672-0.1152344,0.0927734-0.1152344,0.1962891v1.6064453\r
-                       c0,0.1928711-0.2661133,0.2875977-0.7978516,0.2875977h-0.8476562c-0.5419922,0-0.8144531-0.0986328-0.8144531-0.2939453\r
-                       v-1.6000977c0-0.1035156-0.0375977-0.1699219-0.112793-0.1962891c-0.0234375-0.0112305-0.1049805-0.0161133-0.2436523-0.0161133\r
-                       c-0.1401367,0-0.2094727,0.0712891-0.2094727,0.2124023v1.5976562c0,0.5126953,0.4589844,0.7709961,1.3798828,0.7709961h0.1206055\r
-                       h0.078125h0.0429688h0.0244141c0.0131836,0,0.0195312,0,0.0214844,0c0.0649414,0.0014648,0.1201172,0.0039062,0.1699219,0.0048828\r
-                       c0.0483398,0,0.0878906,0,0.1171875,0C33.5302734,12.6274414,34.0786133,12.3676758,34.0786133,11.8505859L34.0786133,11.8505859z\r
-                        M37.9907227,12.4101562v-1.6391602c0-0.4858398-0.4277344-0.7294922-1.2851562-0.7294922h-0.9257812\r
-                       c-0.8671875,0-1.2998047,0.2436523-1.2998047,0.7333984v1.6318359c0,0.1020508,0.0380859,0.1660156,0.1123047,0.1923828\r
-                       c0.0234375,0.0161133,0.1049805,0.0234375,0.2446289,0.0234375c0.1401367,0,0.2094727-0.0712891,0.2094727-0.2124023v-1.6391602\r
-                       c0-0.1157227,0.0917969-0.1923828,0.2744141-0.2275391c0.0395508-0.0073242,0.0922852-0.012207,0.1591797-0.0161133\r
-                       c0.0673828-0.0039062,0.1508789-0.0068359,0.2485352-0.0068359h0.9770508c0.1074219,0,0.1953125,0.0024414,0.2661133,0.0043945\r
-                       c0.0712891,0.0024414,0.1230469,0.0073242,0.1572266,0.0151367c0.1933594,0.034668,0.2895508,0.1113281,0.2895508,0.2270508\r
-                       v1.6396484c0,0.1020508,0.0385742,0.1660156,0.1157227,0.1923828c0.0234375,0.0161133,0.1044922,0.0234375,0.2451172,0.0234375\r
-                       C37.9204102,12.6225586,37.9907227,12.5512695,37.9907227,12.4101562L37.9907227,12.4101562z M39.0961914,9.6855469\r
-                       c0-0.0927734-0.0395508-0.1645508-0.1181641-0.2182617c-0.0673828-0.0473633-0.1518555-0.0717773-0.2495117-0.0717773\r
-                       c-0.0996094,0-0.1821289,0.0244141-0.2495117,0.0717773c-0.0795898,0.0537109-0.1186523,0.1254883-0.1186523,0.2182617\r
-                       c0,0.0952148,0.0390625,0.1694336,0.1186523,0.2226562c0.0673828,0.0458984,0.1499023,0.0693359,0.2495117,0.0693359\r
-                       c0.0976562,0,0.1821289-0.0234375,0.2495117-0.0693359C39.0566406,9.8549805,39.0961914,9.7807617,39.0961914,9.6855469\r
-                       L39.0961914,9.6855469z M39.0185547,12.4067383v-2.1679688c0-0.1010742-0.0366211-0.1635742-0.1123047-0.1894531\r
-                       c-0.0239258-0.0151367-0.1035156-0.0205078-0.2407227-0.0205078c-0.1425781,0-0.2138672,0.0703125-0.2138672,0.2099609v2.1679688\r
-                       c0,0.1020508,0.0375977,0.1660156,0.1108398,0.1923828c0.0229492,0.0161133,0.1049805,0.0234375,0.2431641,0.0234375\r
-                       C38.9482422,12.6225586,39.0185547,12.5488281,39.0185547,12.4067383L39.0185547,12.4067383z M41.4208984,10.3276367\r
-                       c0-0.1762695-0.0703125-0.2646484-0.2124023-0.2646484h-0.8974609V9.5546875c0-0.1005859-0.0385742-0.1640625-0.1162109-0.1904297\r
-                       c-0.0229492-0.0151367-0.1030273-0.0234375-0.2407227-0.0234375c-0.140625,0-0.2099609,0.0708008-0.2099609,0.2124023v0.5097656\r
-                       c-0.0751953,0-0.1362305,0.0024414-0.184082,0.0053711c-0.0483398,0.0014648-0.081543,0.0053711-0.1010742,0.0092773\r
-                       c-0.0898438,0.0302734-0.1342773,0.1049805-0.1342773,0.2236328c0,0.1176758,0.0444336,0.1923828,0.1342773,0.222168\r
-                       c0.0195312,0.0039062,0.0527344,0.0078125,0.1010742,0.0087891c0.0478516,0.0039062,0.1088867,0.0053711,0.184082,0.0053711\r
-                       v1.8691406c0,0.0996094,0.0390625,0.1660156,0.1147461,0.1923828c0.0244141,0.0161133,0.1044922,0.0234375,0.2431641,0.0234375\r
-                       s0.2089844-0.0712891,0.2089844-0.2124023v-1.8725586h0.8974609\r
-                       C41.3505859,10.5375977,41.4208984,10.4663086,41.4208984,10.3276367L41.4208984,10.3276367z M45.2436523,12.5825195v-2.3286133\r
-                       c0-0.1035156-0.0375977-0.1699219-0.1113281-0.1962891c-0.0244141-0.0112305-0.1069336-0.0161133-0.2460938-0.0161133\r
-                       c-0.1425781,0-0.2133789,0.0712891-0.2133789,0.2124023v1.8725586h-1.6923828c-0.4760742,0-0.7128906-0.1000977-0.7128906-0.296875\r
-                       v-1.5756836c0-0.1411133-0.0693359-0.2124023-0.2089844-0.2124023s-0.2207031,0.0048828-0.2456055,0.0161133\r
-                       c-0.0742188,0.0263672-0.1118164,0.0927734-0.1118164,0.1938477v1.578125c0,0.5126953,0.425293,0.7695312,1.2792969,0.7695312\r
-                       h1.6923828c0,0.1660156-0.2519531,0.2480469-0.7583008,0.2480469c-0.019043,0-0.0439453-0.0009766-0.0708008-0.0009766\r
-                       c-0.027832,0-0.0615234-0.0014648-0.1010742-0.0039062c-0.0014648,0-0.0102539,0-0.0288086,0h-0.0273438h-0.0449219h-0.0727539\r
-                       c-0.1416016,0-0.2128906,0.0712891-0.2128906,0.2143555c0,0.097168,0.0126953,0.1630859,0.0351562,0.1977539\r
-                       c0.0297852,0.0527344,0.0898438,0.0791016,0.1777344,0.0791016c0.5351562,0,0.8833008-0.0224609,1.0375977-0.0678711\r
-                       C45.0327148,13.159668,45.2436523,12.9316406,45.2436523,12.5825195L45.2436523,12.5825195z M50.8115234,10.9975586\r
-                       c0-0.1625977-0.0742188-0.2441406-0.2231445-0.2441406h-2.855957v-0.6230469c0-0.1987305,0.4013672-0.2983398,1.2050781-0.2983398\r
-                       c0.1401367,0,0.2109375-0.0717773,0.2109375-0.215332c0-0.1835938-0.0708008-0.2758789-0.2109375-0.2758789h-0.4472656\r
-                       c-0.309082,0-0.5908203,0.0532227-0.8500977,0.1621094c-0.3344727,0.1401367-0.5029297,0.3398438-0.5029297,0.6025391v2.3012695\r
-                       c0,0.1020508,0.0424805,0.1660156,0.1289062,0.1923828c0.0229492,0.0161133,0.1098633,0.0234375,0.2563477,0.0234375\r
-                       c0.1381836,0,0.2099609-0.0712891,0.2099609-0.2124023v-1.1665039h2.855957\r
-                       C50.7373047,11.2436523,50.8115234,11.1616211,50.8115234,10.9975586L50.8115234,10.9975586z M52.4326172,10.3100586\r
-                       c0-0.1796875-0.0712891-0.2685547-0.2128906-0.2685547c-0.4179688,0-0.7324219,0.0375977-0.9428711,0.1123047\r
-                       c-0.347168,0.1210938-0.519043,0.3486328-0.519043,0.6860352v1.5668945c0,0.1445312,0.0668945,0.2158203,0.2026367,0.2158203\r
-                       c0.1323242,0,0.2128906-0.0063477,0.2446289-0.0161133c0.0805664-0.0288086,0.1191406-0.0922852,0.1191406-0.1972656v-1.5693359\r
-                       c0-0.2163086,0.2182617-0.324707,0.6533203-0.324707c0.0239258,0,0.0571289,0.0014648,0.1010742,0.0039062\r
-                       c0.0444336,0.0014648,0.078125,0.0014648,0.1010742,0.0014648C52.3466797,10.5205078,52.4326172,10.4511719,52.4326172,10.3100586\r
-                       L52.4326172,10.3100586z M56.5,11.8466797v-1.0117188c0-0.3500977-0.2060547-0.5810547-0.6171875-0.6982422\r
-                       c-0.2416992-0.0654297-0.5878906-0.0952148-1.0400391-0.0952148c-0.1411133,0-0.2094727,0.0698242-0.2094727,0.2099609\r
-                       c0,0.1762695,0.0683594,0.2636719,0.2094727,0.2636719h0.0673828h0.0424805h0.0244141c0.0136719,0,0.0224609,0,0.0263672,0\r
-                       c0.0361328,0,0.0673828-0.0039062,0.0947266-0.0039062s0.0527344-0.0014648,0.0712891-0.0014648\r
-                       c0.4824219,0,0.7397461,0.0932617,0.769043,0.277832H53.9375c-0.3105469,0-0.5698242,0.0488281-0.7744141,0.1533203\r
-                       c-0.277832,0.1357422-0.4174805,0.3374023-0.4174805,0.6044922v0.3305664c0,0.2480469,0.1479492,0.4418945,0.4389648,0.5830078\r
-                       c0.2167969,0.109375,0.4726562,0.1635742,0.7705078,0.1635742h1.3862305C56.1132812,12.6225586,56.5,12.3642578,56.5,11.8466797\r
-                       L56.5,11.8466797z M55.9448242,11.7128906c0,0.1938477-0.0546875,0.3173828-0.1660156,0.3720703\r
-                       c-0.0776367,0.0415039-0.222168,0.0629883-0.4350586,0.0629883h-1.4047852c-0.1401367,0-0.265625-0.0205078-0.3735352-0.0585938\r
-                       c-0.1674805-0.050293-0.2514648-0.1235352-0.2514648-0.21875v-0.3276367c0-0.0898438,0.081543-0.1621094,0.2426758-0.2172852\r
-                       c0.1264648-0.0449219,0.2470703-0.065918,0.3657227-0.065918h2.0097656c0,0.0249023,0,0.0571289,0.0014648,0.0947266\r
-                       c0.0024414,0.0375977,0.0024414,0.0810547,0.0048828,0.1323242c0,0.050293,0.0024414,0.0952148,0.0039062,0.1323242\r
-                       C55.9423828,11.6572266,55.9448242,11.6879883,55.9448242,11.7128906L55.9448242,11.7128906z M61.7548828,12.4101562v-1.527832\r
-                       c0-0.5595703-0.3979492-0.8408203-1.1904297-0.8408203c-0.2973633,0-0.5068359,0.0078125-0.6323242,0.0214844\r
-                       c-0.2353516,0.0297852-0.4360352,0.0961914-0.5961914,0.1972656c-0.1801758-0.1064453-0.3779297-0.1762695-0.5932617-0.2026367\r
-                       c-0.0473633-0.0073242-0.1259766-0.0083008-0.2265625-0.012207c-0.1054688-0.0039062-0.2373047-0.0039062-0.4003906-0.0039062\r
-                       c-0.8242188,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832c0,0.1411133,0.0693359,0.2124023,0.2104492,0.2124023\r
-                       c0.1386719,0,0.2192383-0.0073242,0.2441406-0.0234375c0.074707-0.0263672,0.1118164-0.090332,0.1118164-0.1923828v-1.5839844\r
-                       c0-0.2080078,0.2431641-0.3129883,0.7294922-0.3129883c0.0170898,0,0.0415039,0.0014648,0.0673828,0.0014648\r
-                       c0.0263672,0,0.0585938,0.0039062,0.0947266,0.0039062c0.0009766,0,0.0097656,0,0.0224609,0h0.0249023h0.0463867h0.0683594\r
-                       c0.1694336,0,0.2915039,0.0185547,0.3676758,0.0561523c0.1083984,0.0561523,0.1635742,0.1582031,0.1635742,0.3110352v1.5268555\r
-                       c0,0.1420898,0.0708008,0.2133789,0.2109375,0.2133789c0.140625,0,0.2216797-0.0073242,0.2456055-0.0234375\r
-                       c0.078125-0.0263672,0.1166992-0.090332,0.1166992-0.1923828v-1.5185547c0-0.168457,0.0839844-0.2792969,0.2524414-0.3291016\r
-                       c0.0742188-0.0229492,0.2294922-0.0400391,0.4594727-0.0493164c0.0009766,0,0.012207,0,0.0341797,0h0.0336914h0.0751953\r
-                       c0.4833984,0,0.722168,0.1030273,0.722168,0.3071289v1.5898438c0,0.1020508,0.0395508,0.1660156,0.1176758,0.1923828\r
-                       c0.0234375,0.0161133,0.1040039,0.0234375,0.2451172,0.0234375C61.6831055,12.6225586,61.7548828,12.5512695,61.7548828,12.4101562\r
-                       L61.7548828,12.4101562z M65.6176758,11.3735352v-0.6225586c0-0.2524414-0.1376953-0.440918-0.4057617-0.5668945\r
-                       c-0.1943359-0.1000977-0.4404297-0.1474609-0.737793-0.1474609h-1.0561523c-0.3637695,0-0.6547852,0.0512695-0.8754883,0.15625\r
-                       c-0.3203125,0.1420898-0.480957,0.3637695-0.480957,0.6616211v0.949707c0,0.2197266,0.1040039,0.4121094,0.3139648,0.5761719\r
-                       c0.1464844,0.1137695,0.3759766,0.1879883,0.6855469,0.21875c0.0625,0.0083008,0.1552734,0.0161133,0.2768555,0.0170898\r
-                       c0.1186523,0.0039062,0.2758789,0.0063477,0.465332,0.0063477c0.1396484,0,0.2094727-0.0712891,0.2094727-0.2124023\r
-                       c0-0.1757812-0.0698242-0.262207-0.2094727-0.262207c-0.184082,0-0.3354492-0.003418-0.4560547-0.012207\r
-                       c-0.1171875-0.0083008-0.2099609-0.0205078-0.2719727-0.0327148c-0.2866211-0.0727539-0.4287109-0.2294922-0.4287109-0.4760742\r
-                       v-0.0185547h2.8125C65.5634766,11.6083984,65.6176758,11.5307617,65.6176758,11.3735352L65.6176758,11.3735352z\r
-                        M65.0600586,11.1166992H62.628418v-0.2978516c0-0.1313477,0.1191406-0.2202148,0.3569336-0.2651367\r
-                       c0.1660156-0.0332031,0.4750977-0.050293,0.9277344-0.050293c0.765625,0,1.1469727,0.0996094,1.1469727,0.2939453V11.1166992\r
-                       L65.0600586,11.1166992z M70.9165039,10.2138672c0-0.1225586-0.0898438-0.1850586-0.269043-0.1850586\r
-                       c-0.1552734,0-0.2548828,0.0424805-0.2988281,0.1264648l-0.8676758,1.6845703l-0.8486328-1.5722656\r
-                       c-0.0673828-0.1225586-0.1757812-0.1845703-0.3237305-0.1845703c-0.1513672,0-0.2597656,0.0620117-0.3261719,0.1884766\r
-                       l-0.8505859,1.5683594l-0.8691406-1.6845703c-0.0483398-0.0839844-0.1464844-0.1264648-0.3012695-0.1264648\r
-                       c-0.1757812,0-0.2670898,0.0625-0.2670898,0.1850586c0,0.0200195,0.0131836,0.0649414,0.0400391,0.1337891l1.0273438,2.043457\r
-                       c0.0600586,0.1240234,0.1796875,0.1865234,0.3520508,0.1865234c0.168457,0,0.2822266-0.0585938,0.3476562-0.1772461\r
-                       l0.847168-1.5742188l0.8369141,1.5717773c0.0639648,0.1162109,0.1762695,0.1748047,0.3354492,0.1748047\r
-                       c0.1689453,0,0.2832031-0.0610352,0.3442383-0.1816406l1.0512695-2.0424805\r
-                       C70.902832,10.2973633,70.9165039,10.2539062,70.9165039,10.2138672L70.9165039,10.2138672z M74.6005859,11.8203125v-0.9550781\r
-                       c0-0.550293-0.4189453-0.8237305-1.2558594-0.8237305h-0.9448242c-0.3369141,0-0.6166992,0.0576172-0.8461914,0.1723633\r
-                       c-0.3081055,0.1474609-0.4628906,0.3657227-0.4628906,0.6572266v0.9492188c0,0.2875977,0.1557617,0.5039062,0.4667969,0.6435547\r
-                       c0.2509766,0.1049805,0.534668,0.1586914,0.8447266,0.1586914h0.9423828c0.3422852,0,0.6166992-0.0537109,0.8222656-0.1572266\r
-                       C74.4560547,12.3291016,74.6005859,12.1152344,74.6005859,11.8203125L74.6005859,11.8203125z M74.027832,11.8217773\r
-                       c0,0.1162109-0.0908203,0.2021484-0.2739258,0.2607422c-0.1308594,0.0439453-0.2729492,0.0654297-0.4208984,0.0654297h-0.921875\r
-                       c-0.1743164,0-0.3291016-0.019043-0.4575195-0.0571289c-0.1972656-0.0581055-0.2973633-0.1469727-0.2973633-0.269043v-0.9506836\r
-                       c0-0.1269531,0.0976562-0.222168,0.2910156-0.2851562c0.1347656-0.0424805,0.2895508-0.0654297,0.4614258-0.0654297h0.9213867\r
-                       c0.4672852,0,0.6977539,0.1030273,0.6977539,0.3071289V11.8217773L74.027832,11.8217773z M76.5820312,10.3100586\r
-                       c0-0.1796875-0.0693359-0.2685547-0.2104492-0.2685547c-0.418457,0-0.7333984,0.0375977-0.9458008,0.1123047\r
-                       c-0.3457031,0.1210938-0.5166016,0.3486328-0.5166016,0.6860352v1.5668945c0,0.1445312,0.0664062,0.2158203,0.2011719,0.2158203\r
-                       c0.1333008,0,0.2148438-0.0063477,0.2470703-0.0161133c0.0776367-0.0288086,0.1166992-0.0922852,0.1166992-0.1972656v-1.5693359\r
-                       c0-0.2163086,0.2177734-0.324707,0.6538086-0.324707c0.0224609,0,0.0561523,0.0014648,0.1010742,0.0039062\r
-                       c0.043457,0.0014648,0.0776367,0.0014648,0.1005859,0.0014648C76.4980469,10.5205078,76.5820312,10.4511719,76.5820312,10.3100586\r
-                       L76.5820312,10.3100586z M79.909668,12.4228516c0-0.0888672-0.0473633-0.15625-0.1459961-0.2036133l-1.7768555-0.8935547\r
-                       l1.7373047-0.8657227c0.0957031-0.0488281,0.144043-0.1162109,0.144043-0.2036133\r
-                       c0-0.128418-0.0800781-0.1948242-0.2387695-0.1948242c-0.1230469,0-0.2099609,0.0068359-0.2573242,0.0214844l-1.9106445,0.9580078\r
-                       h-0.0029297V9.5507812c0-0.1030273-0.0380859-0.168457-0.1098633-0.1914062\r
-                       c-0.0297852-0.0126953-0.1123047-0.0185547-0.2416992-0.0185547c-0.1401367,0-0.2114258,0.0708008-0.2114258,0.2099609v2.859375\r
-                       c0,0.1411133,0.0712891,0.2124023,0.2114258,0.2124023c0.1352539,0,0.2158203-0.0073242,0.237793-0.0234375\r
-                       c0.0742188-0.0263672,0.1137695-0.0927734,0.1137695-0.1923828v-0.7797852l1.9360352,0.972168\r
-                       c0.0336914,0.0161133,0.1240234,0.0234375,0.2758789,0.0234375C79.8291016,12.6225586,79.909668,12.5551758,79.909668,12.4228516\r
-                       L79.909668,12.4228516z M82,8.6796875V8.1425781c0-0.0795898-0.0385742-0.1186523-0.1171875-0.1186523\r
-                       c-0.0214844,0-0.0410156,0.0048828-0.0585938,0.0112305c-0.015625,0.0097656-0.0322266,0.0224609-0.0458984,0.0371094\r
-                       l-0.3515625,0.4414062l-0.3603516-0.4384766c-0.0258789-0.0341797-0.0629883-0.0512695-0.1049805-0.0512695h-0.7661133\r
-                       c-0.0390625,0-0.0639648,0.0146484-0.0776367,0.0439453c-0.0087891,0.0131836-0.0151367,0.0371094-0.0151367,0.065918\r
-                       c0,0.0629883,0.0327148,0.09375,0.0927734,0.09375h0.1992188v0.4521484c0,0.0249023,0.0048828,0.0439453,0.0141602,0.059082\r
-                       c0.0107422,0.0131836,0.0258789,0.0258789,0.050293,0.03125c0.0039062,0.0024414,0.0112305,0.003418,0.0200195,0.003418\r
-                       s0.0234375,0,0.0410156,0c0.03125,0,0.0537109-0.0063477,0.0693359-0.0229492\r
-                       c0.0146484-0.0141602,0.0205078-0.0400391,0.0205078-0.0708008V8.2275391h0.2348633v0.4521484\r
-                       c0,0.0463867,0.0234375,0.0756836,0.065918,0.090332c0.003418,0.0024414,0.012207,0.003418,0.0209961,0.003418\r
-                       c0.0112305,0,0.0234375,0,0.0410156,0c0.0600586,0,0.090332-0.0297852,0.090332-0.09375V8.4082031l0.2529297,0.3178711\r
-                       c0.0273438,0.0332031,0.0634766,0.0512695,0.1108398,0.0512695c0.0458984,0,0.0834961-0.0180664,0.1123047-0.0512695\r
-                       l0.2426758-0.3071289v0.2607422c0,0.0639648,0.0307617,0.09375,0.0913086,0.09375h0.0380859c0.0039062,0,0.0053711,0,0.0087891,0\r
-                       c0.0039062,0,0.0078125-0.0009766,0.0102539-0.003418C81.9760742,8.7553711,82,8.7260742,82,8.6796875L82,8.6796875z\r
-                        M10.1689453,9.0756836c-0.6611328,2.0117188-1.2885742,2.6499023-3.7602539,3.3994141\r
-                       C7.5439453,10.1674805,8.2143555,9.5195312,10.1689453,9.0756836L10.1689453,9.0756836z M10.4858398,8.7475586H5.2431641\r
-                       c-0.9643555,0-1.7470703,0.7841797-1.7470703,1.7509766v3.5019531h5.2426758c0.965332,0,1.7470703-0.7822266,1.7470703-1.75\r
-                       V8.7475586L10.4858398,8.7475586z M4.9526367,2.9604492c2.6518555,0.5991211,3.5625,1.4804688,5.1035156,4.6108398\r
-                       C6.7021484,6.5551758,5.8486328,5.6879883,4.9526367,2.9604492L4.9526367,2.9604492z M10.4858398,3.3769531\r
-                       C10.4858398,2.0639648,9.425293,1,8.1142578,1H1v4.7529297c0,1.3115234,1.0625,2.3769531,2.371582,2.3769531h7.1142578V3.3769531\r
-                       L10.4858398,3.3769531z M14.3266602,5.0581055c-0.5327148,1.6206055-1.0395508,2.1362305-3.0317383,2.7392578\r
-                       C12.2099609,5.9379883,12.7504883,5.4140625,14.3266602,5.0581055L14.3266602,5.0581055z M11.1020508,5.3056641v2.8242188\r
-                       h4.2275391c0.7783203,0,1.409668-0.6333008,1.409668-1.4121094v-2.824707H12.512207\r
-                       C11.7338867,3.8930664,11.1020508,4.5253906,11.1020508,5.3056641L11.1020508,5.3056641z"/>\r
-       </g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="83px" height="16px" viewBox="0 0 83 16" xml:space="preserve">
+       <title>WoltLab Community Framework</title>
+       <desc>WoltLab Community Framework Logo</desc>
+       
+       <defs>
+               
+       </defs>
+       
+       <g id="LogoWCF">
+               <path id="Upper_2_" style="fill:#fff;" d="M21.7739258,6.6103516c0,0.0166016-0.0043945,0.0336914-0.012207,0.0498047
+                       l-0.6391602,1.3535156c-0.0385742,0.0786133-0.1000977,0.1201172-0.1831055,0.1201172
+                       c-0.0810547,0-0.1391602-0.0375977-0.1733398-0.1118164l-0.5107422-1.0942383l-0.5268555,1.097168
+                       c-0.0317383,0.0639648-0.0898438,0.0976562-0.171875,0.0976562c-0.0898438,0-0.1503906-0.0351562-0.1821289-0.1049805
+                       L18.7382812,6.659668c-0.0083008-0.0161133-0.0112305-0.03125-0.0112305-0.0454102
+                       c0-0.0351562,0.0175781-0.0634766,0.0537109-0.0839844c0.0307617-0.0166016,0.065918-0.0253906,0.1040039-0.0253906
+                       c0.0625,0,0.1054688,0.0209961,0.1269531,0.0649414l0.5449219,1.1606445l0.5175781-1.1152344
+                       c0.0371094-0.0786133,0.0961914-0.1201172,0.1782227-0.1201172c0.027832,0,0.0605469,0.012207,0.0961914,0.034668
+                       c0.0361328,0.0229492,0.0610352,0.0473633,0.0732422,0.0756836l0.5258789,1.125l0.5361328-1.1567383
+                       c0.0205078-0.0458984,0.0664062-0.0664062,0.1386719-0.0664062c0.0351562,0,0.0693359,0.0078125,0.0986328,0.0229492
+                       C21.7568359,6.5498047,21.7739258,6.5766602,21.7739258,6.6103516L21.7739258,6.6103516z M30.7270508,7.7226562
+                       c0,0.0849609-0.0458984,0.1386719-0.1396484,0.1611328c-0.0214844,0.003418-0.0507812,0.0078125-0.090332,0.0112305
+                       c-0.0390625,0.0014648-0.0893555,0.0039062-0.1508789,0.0039062h-0.3999023c-0.0424805,0-0.0854492-0.0024414-0.1279297-0.0073242
+                       c-0.0424805-0.0078125-0.0854492-0.0126953-0.128418-0.0224609c-0.1210938-0.0288086-0.1801758-0.0737305-0.1801758-0.1328125
+                       V7.1044922h0.8388672c0.2524414,0,0.378418,0.0551758,0.378418,0.1645508V7.7226562L30.7270508,7.7226562z M31.0083008,7.7314453
+                       V7.2641602c0-0.2636719-0.2216797-0.3955078-0.6640625-0.3955078h-0.8344727V6.6201172
+                       c0-0.0703125-0.0356445-0.1049805-0.1040039-0.1049805c-0.0698242,0-0.1103516,0.0029297-0.1210938,0.0078125
+                       c-0.0371094,0.0131836-0.0551758,0.0449219-0.0551758,0.0957031v1.1176758c0,0.1376953,0.0839844,0.2426758,0.253418,0.3134766
+                       c0.1303711,0.0551758,0.2749023,0.0839844,0.4321289,0.0839844h0.4291992C30.7866211,8.1337891,31.0083008,8,31.0083008,7.7314453
+                       L31.0083008,7.7314453z M28.7851562,7.684082c0,0.0947266-0.0268555,0.15625-0.0800781,0.1850586
+                       C28.6665039,7.887207,28.59375,7.8989258,28.4902344,7.8989258h-0.6948242c-0.0703125,0-0.1318359-0.0087891-0.1855469-0.0288086
+                       c-0.081543-0.0249023-0.1235352-0.0600586-0.1235352-0.1083984V7.6005859c0-0.0424805,0.0400391-0.0800781,0.1191406-0.1079102
+                       c0.0625-0.0209961,0.1230469-0.0332031,0.1821289-0.0332031h0.9931641L28.78125,7.5078125l0.0024414,0.0634766l0.0014648,0.0664062
+                       V7.684082L28.7851562,7.684082z M29.0600586,7.7490234V7.2495117c0-0.1728516-0.1010742-0.2866211-0.3051758-0.3452148
+                       c-0.1186523-0.0297852-0.2895508-0.0463867-0.5131836-0.0463867c-0.0693359,0-0.1040039,0.0341797-0.1040039,0.1030273
+                       c0,0.0878906,0.034668,0.1318359,0.1040039,0.1318359h0.0327148h0.0205078h0.0126953h0.0126953l0.0478516-0.0009766
+                       l0.0351562-0.0024414c0.2387695,0,0.3647461,0.0449219,0.3803711,0.137207H27.793457
+                       c-0.152832,0-0.2797852,0.0249023-0.3813477,0.0761719c-0.1376953,0.0678711-0.2070312,0.1655273-0.2070312,0.2988281v0.1625977
+                       c0,0.1230469,0.0732422,0.2197266,0.2172852,0.2871094c0.1064453,0.0546875,0.2333984,0.0825195,0.3798828,0.0825195h0.6855469
+                       C28.8691406,8.1337891,29.0600586,8.0048828,29.0600586,7.7490234L29.0600586,7.7490234z M27.0146484,8.0288086
+                       c0-0.0922852-0.0356445-0.137207-0.1044922-0.137207H25.980957c-0.1582031,0-0.2592773-0.0078125-0.3032227-0.0175781
+                       c-0.1347656-0.0263672-0.2041016-0.0825195-0.2041016-0.1679688V6.6162109c0-0.0517578-0.0219727-0.0834961-0.0625-0.0957031
+                       c-0.019043-0.0053711-0.0605469-0.0087891-0.1274414-0.0087891c-0.0693359,0-0.1040039,0.034668-0.1040039,0.1035156v1.0908203
+                       c0,0.1811523,0.0932617,0.3051758,0.2797852,0.3691406c0.121582,0.0390625,0.2895508,0.0585938,0.5058594,0.0585938h0.9448242
+                       C26.9790039,8.1337891,27.0146484,8.1000977,27.0146484,8.0288086L27.0146484,8.0288086z M25.0913086,6.9985352
+                       c0-0.0854492-0.0356445-0.1298828-0.1054688-0.1298828h-0.4438477V6.6166992c0-0.0488281-0.019043-0.0800781-0.0566406-0.09375
+                       c-0.012207-0.0068359-0.0517578-0.0112305-0.1201172-0.0112305S24.262207,6.5473633,24.262207,6.6162109v0.2524414
+                       c-0.0366211,0-0.0673828,0.0014648-0.090332,0.0019531c-0.0239258,0.0019531-0.0410156,0.0039062-0.0493164,0.0058594
+                       c-0.0458984,0.0136719-0.0668945,0.0512695-0.0668945,0.1098633s0.0209961,0.0952148,0.0668945,0.1103516
+                       c0.0083008,0.0014648,0.0253906,0.0043945,0.0493164,0.0053711c0.0229492,0.0024414,0.0537109,0.0024414,0.090332,0.0024414
+                       v0.921875c0,0.0498047,0.0180664,0.0830078,0.0571289,0.0961914c0.0117188,0.0073242,0.0507812,0.0112305,0.1196289,0.0112305
+                       c0.0693359,0,0.1030273-0.0336914,0.1030273-0.1049805V7.1044922h0.4438477
+                       C25.0556641,7.1044922,25.0913086,7.0683594,25.0913086,6.9985352L25.0913086,6.9985352z M23.9208984,8.0288086V6.6152344
+                       c0-0.0507812-0.0185547-0.0825195-0.0561523-0.0947266c-0.0161133-0.0053711-0.0561523-0.0087891-0.1206055-0.0087891
+                       c-0.0693359,0-0.1035156,0.034668-0.1035156,0.1035156v1.4111328c0,0.0498047,0.0185547,0.0830078,0.0576172,0.0961914
+                       C23.7080078,8.1298828,23.75,8.1337891,23.8168945,8.1337891C23.8857422,8.1337891,23.9208984,8.0976562,23.9208984,8.0288086
+                       L23.9208984,8.0288086z M23.1572266,7.7363281c0,0.0576172-0.0458984,0.1015625-0.1347656,0.1298828
+                       c-0.0664062,0.0209961-0.1357422,0.0327148-0.2094727,0.0327148h-0.4550781c-0.0869141,0-0.1621094-0.0087891-0.2275391-0.0288086
+                       c-0.0961914-0.0268555-0.1464844-0.0727539-0.1464844-0.1337891v-0.46875c0-0.0625,0.0483398-0.1079102,0.144043-0.1411133
+                       c0.0678711-0.0205078,0.144043-0.0322266,0.2280273-0.0322266h0.4550781c0.2304688,0,0.3461914,0.0527344,0.3461914,0.1513672
+                       V7.7363281L23.1572266,7.7363281z M23.4394531,7.7363281v-0.472168c0-0.2705078-0.206543-0.40625-0.6206055-0.40625h-0.4672852
+                       c-0.1655273,0-0.3051758,0.0288086-0.4165039,0.0859375c-0.1542969,0.0732422-0.2304688,0.1816406-0.2304688,0.3237305v0.46875
+                       c0,0.1425781,0.0761719,0.25,0.230957,0.3188477c0.1245117,0.0507812,0.2636719,0.0786133,0.4179688,0.0786133h0.465332
+                       c0.1689453,0,0.3041992-0.0244141,0.4057617-0.0761719C23.3681641,7.9887695,23.4394531,7.8828125,23.4394531,7.7363281
+                       L23.4394531,7.7363281z M31.5537109,6.1171875v0.0517578c0,0.0253906-0.0209961,0.0375977-0.0625,0.0375977h-0.1767578V6.0766602
+                       h0.1674805C31.5302734,6.0766602,31.5537109,6.0898438,31.5537109,6.1171875L31.5537109,6.1171875z M31.6123047,6.1689453
+                       V6.1171875c0-0.0639648-0.046875-0.0981445-0.140625-0.0981445h-0.2036133c-0.0112305,0-0.0166016,0.0068359-0.0166016,0.0195312
+                       v0.3613281c0,0.0219727,0.0097656,0.0332031,0.0292969,0.0332031c0.0224609,0,0.0336914-0.0112305,0.0336914-0.0332031v-0.140625
+                       l0.2519531,0.1723633c0.0102539,0.0019531,0.015625,0.003418,0.0166016,0.003418
+                       c0.0097656,0,0.0170898-0.0029297,0.0229492-0.0087891c0.0063477-0.0063477,0.0097656-0.0131836,0.0097656-0.0214844
+                       c0-0.0112305-0.0043945-0.0170898-0.0146484-0.0200195L31.4213867,6.262207h0.0629883
+                       C31.5698242,6.262207,31.6123047,6.2319336,31.6123047,6.1689453L31.6123047,6.1689453z M31.7441406,6.2324219
+                       c0,0.0888672-0.0292969,0.1650391-0.090332,0.2285156c-0.0585938,0.0625-0.1308594,0.0942383-0.2158203,0.0942383
+                       c-0.0820312,0-0.1552734-0.0317383-0.215332-0.0942383c-0.0600586-0.0629883-0.0888672-0.1376953-0.0888672-0.2285156
+                       c0-0.090332,0.0288086-0.1660156,0.0888672-0.2275391c0.0585938-0.0634766,0.1313477-0.0942383,0.215332-0.0942383
+                       c0.0849609,0,0.1572266,0.0307617,0.2158203,0.0942383C31.7148438,6.0683594,31.7441406,6.1455078,31.7441406,6.2324219
+                       L31.7441406,6.2324219z M31.8085938,6.2319336c0-0.1074219-0.0371094-0.1977539-0.1103516-0.2714844
+                       c-0.0722656-0.0751953-0.1577148-0.1142578-0.2602539-0.1142578c-0.1005859,0-0.1865234,0.0390625-0.2573242,0.1142578
+                       c-0.0712891,0.0756836-0.1069336,0.1660156-0.1069336,0.2714844c0,0.1074219,0.0356445,0.1992188,0.1069336,0.2753906
+                       c0.0708008,0.0737305,0.1582031,0.1103516,0.2573242,0.1103516c0.1025391,0,0.1889648-0.0366211,0.2612305-0.1103516
+                       C31.7714844,6.4311523,31.8085938,6.3393555,31.8085938,6.2319336L31.8085938,6.2319336z M15.5976562,9.6166992
+                       c0-0.1835938-0.0698242-0.2758789-0.2084961-0.2758789h-2.1367188c-0.1132812,0-0.2104492,0.003418-0.2939453,0.0083008
+                       c-0.0825195,0.0063477-0.1513672,0.0151367-0.2094727,0.0249023c-0.2246094,0.0415039-0.4169922,0.1240234-0.5727539,0.2426758
+                       c-0.1879883,0.1459961-0.2817383,0.3193359-0.2817383,0.5283203v1.6293945c0,0.1660156,0.0380859,0.3017578,0.1152344,0.4072266
+                       c0.0644531,0.0898438,0.1767578,0.1772461,0.3369141,0.2612305c0.1420898,0.0722656,0.2768555,0.1210938,0.4082031,0.1459961
+                       c0.1201172,0.0229492,0.3164062,0.0336914,0.5908203,0.0336914H15.375c0.1445312,0,0.2172852-0.0834961,0.2172852-0.2495117
+                       c0-0.1655273-0.0727539-0.246582-0.2172852-0.246582h-2.0292969c-0.5717773,0-0.8569336-0.1230469-0.8569336-0.3671875v-1.6176758
+                       c0-0.206543,0.2583008-0.3095703,0.7744141-0.3095703h2.1259766C15.527832,9.8320312,15.5976562,9.7602539,15.5976562,9.6166992
+                       L15.5976562,9.6166992z M19.5595703,11.8203125v-0.9550781c0-0.550293-0.4179688-0.8237305-1.2563477-0.8237305h-0.9443359
+                       c-0.3369141,0-0.6181641,0.0576172-0.8452148,0.1723633c-0.3100586,0.1474609-0.4643555,0.3657227-0.4643555,0.6572266v0.9492188
+                       c0,0.2875977,0.1552734,0.5039062,0.4672852,0.6435547c0.2514648,0.1049805,0.5341797,0.1586914,0.8447266,0.1586914h0.9418945
+                       c0.3422852,0,0.6166992-0.0537109,0.8217773-0.1572266C19.4150391,12.3291016,19.5595703,12.1152344,19.5595703,11.8203125
+                       L19.5595703,11.8203125z M18.9868164,11.8217773c0,0.1162109-0.0908203,0.2021484-0.2734375,0.2607422
+                       c-0.1328125,0.0439453-0.2719727,0.0654297-0.421875,0.0654297h-0.9208984c-0.175293,0-0.3286133-0.019043-0.4599609-0.0571289
+                       c-0.1967773-0.0581055-0.2939453-0.1469727-0.2939453-0.269043v-0.9506836c0-0.1269531,0.0957031-0.222168,0.2885742-0.2851562
+                       c0.1367188-0.0424805,0.2905273-0.0654297,0.4624023-0.0654297h0.9213867c0.4658203,0,0.6977539,0.1030273,0.6977539,0.3071289
+                       V11.8217773L18.9868164,11.8217773z M24.8198242,12.4101562v-1.527832c0-0.5595703-0.3964844-0.8408203-1.190918-0.8408203
+                       c-0.2954102,0-0.5058594,0.0078125-0.6308594,0.0214844c-0.2368164,0.0297852-0.4360352,0.0961914-0.5976562,0.1972656
+                       c-0.1806641-0.1064453-0.3769531-0.1762695-0.5908203-0.2026367c-0.050293-0.0073242-0.1274414-0.0083008-0.2299805-0.012207
+                       c-0.1035156-0.0039062-0.2353516-0.0039062-0.3994141-0.0039062c-0.8242188,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832
+                       c0,0.1411133,0.0698242,0.2124023,0.2104492,0.2124023c0.1386719,0,0.2202148-0.0073242,0.2441406-0.0234375
+                       c0.0742188-0.0263672,0.112793-0.090332,0.112793-0.1923828v-1.5839844c0-0.2080078,0.2431641-0.3129883,0.7285156-0.3129883
+                       c0.0185547,0,0.0415039,0.0014648,0.0673828,0.0014648c0.0273438,0,0.0581055,0.0039062,0.09375,0.0039062
+                       c0.0019531,0,0.0102539,0,0.0244141,0h0.0239258h0.0463867h0.0693359c0.1699219,0,0.2910156,0.0185547,0.3671875,0.0561523
+                       c0.109375,0.0561523,0.1625977,0.1582031,0.1625977,0.3110352v1.5268555c0,0.1420898,0.0712891,0.2133789,0.2128906,0.2133789
+                       c0.1401367,0,0.2211914-0.0073242,0.2446289-0.0234375c0.0771484-0.0263672,0.1162109-0.090332,0.1162109-0.1923828v-1.5185547
+                       c0-0.168457,0.0839844-0.2792969,0.2519531-0.3291016c0.0756836-0.0229492,0.2290039-0.0400391,0.4609375-0.0493164
+                       c0.0019531,0,0.012207,0,0.0317383,0h0.0351562h0.0751953c0.4819336,0,0.7236328,0.1030273,0.7236328,0.3071289v1.5898438
+                       c0,0.1020508,0.0390625,0.1660156,0.1162109,0.1923828c0.0234375,0.0161133,0.105957,0.0234375,0.2460938,0.0234375
+                       C24.7490234,12.6225586,24.8198242,12.5512695,24.8198242,12.4101562L24.8198242,12.4101562z M30.0795898,12.4101562v-1.527832
+                       c0-0.5595703-0.3969727-0.8408203-1.1914062-0.8408203c-0.2954102,0-0.5058594,0.0078125-0.6303711,0.0214844
+                       c-0.2373047,0.0297852-0.4360352,0.0961914-0.5976562,0.1972656c-0.1806641-0.1064453-0.3774414-0.1762695-0.5913086-0.2026367
+                       c-0.050293-0.0073242-0.1264648-0.0083008-0.2299805-0.012207c-0.1025391-0.0039062-0.2348633-0.0039062-0.3989258-0.0039062
+                       c-0.8232422,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832c0,0.1411133,0.0693359,0.2124023,0.2099609,0.2124023
+                       c0.1391602,0,0.2207031-0.0073242,0.2441406-0.0234375c0.0751953-0.0263672,0.1137695-0.090332,0.1137695-0.1923828v-1.5839844
+                       c0-0.2080078,0.2431641-0.3129883,0.7290039-0.3129883c0.0175781,0,0.0400391,0.0014648,0.0664062,0.0014648
+                       c0.0268555,0,0.0576172,0.0039062,0.09375,0.0039062c0.0019531,0,0.0097656,0,0.0249023,0h0.0229492h0.0463867h0.0708008
+                       c0.1694336,0,0.2905273,0.0185547,0.3662109,0.0561523c0.109375,0.0561523,0.1640625,0.1582031,0.1640625,0.3110352v1.5268555
+                       c0,0.1420898,0.0698242,0.2133789,0.2114258,0.2133789c0.1401367,0,0.2216797-0.0073242,0.2451172-0.0234375
+                       c0.0761719-0.0263672,0.1157227-0.090332,0.1157227-0.1923828v-1.5185547c0-0.168457,0.0844727-0.2792969,0.253418-0.3291016
+                       c0.0742188-0.0229492,0.2280273-0.0400391,0.4589844-0.0493164c0.0019531,0,0.0126953,0,0.0317383,0h0.0356445h0.0756836
+                       c0.4829102,0,0.7226562,0.1030273,0.7226562,0.3071289v1.5898438c0,0.1020508,0.0395508,0.1660156,0.1171875,0.1923828
+                       c0.0229492,0.0161133,0.1049805,0.0234375,0.2451172,0.0234375C30.0092773,12.6225586,30.0795898,12.5512695,30.0795898,12.4101562
+                       L30.0795898,12.4101562z M34.0786133,11.8505859v-1.5966797c0-0.1411133-0.0703125-0.2124023-0.2114258-0.2124023
+                       c-0.1401367,0-0.2226562,0.0048828-0.2456055,0.0161133c-0.0771484,0.0263672-0.1152344,0.0927734-0.1152344,0.1962891v1.6064453
+                       c0,0.1928711-0.2661133,0.2875977-0.7978516,0.2875977h-0.8476562c-0.5419922,0-0.8144531-0.0986328-0.8144531-0.2939453
+                       v-1.6000977c0-0.1035156-0.0375977-0.1699219-0.112793-0.1962891c-0.0234375-0.0112305-0.1049805-0.0161133-0.2436523-0.0161133
+                       c-0.1401367,0-0.2094727,0.0712891-0.2094727,0.2124023v1.5976562c0,0.5126953,0.4589844,0.7709961,1.3798828,0.7709961h0.1206055
+                       h0.078125h0.0429688h0.0244141c0.0131836,0,0.0195312,0,0.0214844,0c0.0649414,0.0014648,0.1201172,0.0039062,0.1699219,0.0048828
+                       c0.0483398,0,0.0878906,0,0.1171875,0C33.5302734,12.6274414,34.0786133,12.3676758,34.0786133,11.8505859L34.0786133,11.8505859z
+                        M37.9907227,12.4101562v-1.6391602c0-0.4858398-0.4277344-0.7294922-1.2851562-0.7294922h-0.9257812
+                       c-0.8671875,0-1.2998047,0.2436523-1.2998047,0.7333984v1.6318359c0,0.1020508,0.0380859,0.1660156,0.1123047,0.1923828
+                       c0.0234375,0.0161133,0.1049805,0.0234375,0.2446289,0.0234375c0.1401367,0,0.2094727-0.0712891,0.2094727-0.2124023v-1.6391602
+                       c0-0.1157227,0.0917969-0.1923828,0.2744141-0.2275391c0.0395508-0.0073242,0.0922852-0.012207,0.1591797-0.0161133
+                       c0.0673828-0.0039062,0.1508789-0.0068359,0.2485352-0.0068359h0.9770508c0.1074219,0,0.1953125,0.0024414,0.2661133,0.0043945
+                       c0.0712891,0.0024414,0.1230469,0.0073242,0.1572266,0.0151367c0.1933594,0.034668,0.2895508,0.1113281,0.2895508,0.2270508
+                       v1.6396484c0,0.1020508,0.0385742,0.1660156,0.1157227,0.1923828c0.0234375,0.0161133,0.1044922,0.0234375,0.2451172,0.0234375
+                       C37.9204102,12.6225586,37.9907227,12.5512695,37.9907227,12.4101562L37.9907227,12.4101562z M39.0961914,9.6855469
+                       c0-0.0927734-0.0395508-0.1645508-0.1181641-0.2182617c-0.0673828-0.0473633-0.1518555-0.0717773-0.2495117-0.0717773
+                       c-0.0996094,0-0.1821289,0.0244141-0.2495117,0.0717773c-0.0795898,0.0537109-0.1186523,0.1254883-0.1186523,0.2182617
+                       c0,0.0952148,0.0390625,0.1694336,0.1186523,0.2226562c0.0673828,0.0458984,0.1499023,0.0693359,0.2495117,0.0693359
+                       c0.0976562,0,0.1821289-0.0234375,0.2495117-0.0693359C39.0566406,9.8549805,39.0961914,9.7807617,39.0961914,9.6855469
+                       L39.0961914,9.6855469z M39.0185547,12.4067383v-2.1679688c0-0.1010742-0.0366211-0.1635742-0.1123047-0.1894531
+                       c-0.0239258-0.0151367-0.1035156-0.0205078-0.2407227-0.0205078c-0.1425781,0-0.2138672,0.0703125-0.2138672,0.2099609v2.1679688
+                       c0,0.1020508,0.0375977,0.1660156,0.1108398,0.1923828c0.0229492,0.0161133,0.1049805,0.0234375,0.2431641,0.0234375
+                       C38.9482422,12.6225586,39.0185547,12.5488281,39.0185547,12.4067383L39.0185547,12.4067383z M41.4208984,10.3276367
+                       c0-0.1762695-0.0703125-0.2646484-0.2124023-0.2646484h-0.8974609V9.5546875c0-0.1005859-0.0385742-0.1640625-0.1162109-0.1904297
+                       c-0.0229492-0.0151367-0.1030273-0.0234375-0.2407227-0.0234375c-0.140625,0-0.2099609,0.0708008-0.2099609,0.2124023v0.5097656
+                       c-0.0751953,0-0.1362305,0.0024414-0.184082,0.0053711c-0.0483398,0.0014648-0.081543,0.0053711-0.1010742,0.0092773
+                       c-0.0898438,0.0302734-0.1342773,0.1049805-0.1342773,0.2236328c0,0.1176758,0.0444336,0.1923828,0.1342773,0.222168
+                       c0.0195312,0.0039062,0.0527344,0.0078125,0.1010742,0.0087891c0.0478516,0.0039062,0.1088867,0.0053711,0.184082,0.0053711
+                       v1.8691406c0,0.0996094,0.0390625,0.1660156,0.1147461,0.1923828c0.0244141,0.0161133,0.1044922,0.0234375,0.2431641,0.0234375
+                       s0.2089844-0.0712891,0.2089844-0.2124023v-1.8725586h0.8974609
+                       C41.3505859,10.5375977,41.4208984,10.4663086,41.4208984,10.3276367L41.4208984,10.3276367z M45.2436523,12.5825195v-2.3286133
+                       c0-0.1035156-0.0375977-0.1699219-0.1113281-0.1962891c-0.0244141-0.0112305-0.1069336-0.0161133-0.2460938-0.0161133
+                       c-0.1425781,0-0.2133789,0.0712891-0.2133789,0.2124023v1.8725586h-1.6923828c-0.4760742,0-0.7128906-0.1000977-0.7128906-0.296875
+                       v-1.5756836c0-0.1411133-0.0693359-0.2124023-0.2089844-0.2124023s-0.2207031,0.0048828-0.2456055,0.0161133
+                       c-0.0742188,0.0263672-0.1118164,0.0927734-0.1118164,0.1938477v1.578125c0,0.5126953,0.425293,0.7695312,1.2792969,0.7695312
+                       h1.6923828c0,0.1660156-0.2519531,0.2480469-0.7583008,0.2480469c-0.019043,0-0.0439453-0.0009766-0.0708008-0.0009766
+                       c-0.027832,0-0.0615234-0.0014648-0.1010742-0.0039062c-0.0014648,0-0.0102539,0-0.0288086,0h-0.0273438h-0.0449219h-0.0727539
+                       c-0.1416016,0-0.2128906,0.0712891-0.2128906,0.2143555c0,0.097168,0.0126953,0.1630859,0.0351562,0.1977539
+                       c0.0297852,0.0527344,0.0898438,0.0791016,0.1777344,0.0791016c0.5351562,0,0.8833008-0.0224609,1.0375977-0.0678711
+                       C45.0327148,13.159668,45.2436523,12.9316406,45.2436523,12.5825195L45.2436523,12.5825195z M50.8115234,10.9975586
+                       c0-0.1625977-0.0742188-0.2441406-0.2231445-0.2441406h-2.855957v-0.6230469c0-0.1987305,0.4013672-0.2983398,1.2050781-0.2983398
+                       c0.1401367,0,0.2109375-0.0717773,0.2109375-0.215332c0-0.1835938-0.0708008-0.2758789-0.2109375-0.2758789h-0.4472656
+                       c-0.309082,0-0.5908203,0.0532227-0.8500977,0.1621094c-0.3344727,0.1401367-0.5029297,0.3398438-0.5029297,0.6025391v2.3012695
+                       c0,0.1020508,0.0424805,0.1660156,0.1289062,0.1923828c0.0229492,0.0161133,0.1098633,0.0234375,0.2563477,0.0234375
+                       c0.1381836,0,0.2099609-0.0712891,0.2099609-0.2124023v-1.1665039h2.855957
+                       C50.7373047,11.2436523,50.8115234,11.1616211,50.8115234,10.9975586L50.8115234,10.9975586z M52.4326172,10.3100586
+                       c0-0.1796875-0.0712891-0.2685547-0.2128906-0.2685547c-0.4179688,0-0.7324219,0.0375977-0.9428711,0.1123047
+                       c-0.347168,0.1210938-0.519043,0.3486328-0.519043,0.6860352v1.5668945c0,0.1445312,0.0668945,0.2158203,0.2026367,0.2158203
+                       c0.1323242,0,0.2128906-0.0063477,0.2446289-0.0161133c0.0805664-0.0288086,0.1191406-0.0922852,0.1191406-0.1972656v-1.5693359
+                       c0-0.2163086,0.2182617-0.324707,0.6533203-0.324707c0.0239258,0,0.0571289,0.0014648,0.1010742,0.0039062
+                       c0.0444336,0.0014648,0.078125,0.0014648,0.1010742,0.0014648C52.3466797,10.5205078,52.4326172,10.4511719,52.4326172,10.3100586
+                       L52.4326172,10.3100586z M56.5,11.8466797v-1.0117188c0-0.3500977-0.2060547-0.5810547-0.6171875-0.6982422
+                       c-0.2416992-0.0654297-0.5878906-0.0952148-1.0400391-0.0952148c-0.1411133,0-0.2094727,0.0698242-0.2094727,0.2099609
+                       c0,0.1762695,0.0683594,0.2636719,0.2094727,0.2636719h0.0673828h0.0424805h0.0244141c0.0136719,0,0.0224609,0,0.0263672,0
+                       c0.0361328,0,0.0673828-0.0039062,0.0947266-0.0039062s0.0527344-0.0014648,0.0712891-0.0014648
+                       c0.4824219,0,0.7397461,0.0932617,0.769043,0.277832H53.9375c-0.3105469,0-0.5698242,0.0488281-0.7744141,0.1533203
+                       c-0.277832,0.1357422-0.4174805,0.3374023-0.4174805,0.6044922v0.3305664c0,0.2480469,0.1479492,0.4418945,0.4389648,0.5830078
+                       c0.2167969,0.109375,0.4726562,0.1635742,0.7705078,0.1635742h1.3862305C56.1132812,12.6225586,56.5,12.3642578,56.5,11.8466797
+                       L56.5,11.8466797z M55.9448242,11.7128906c0,0.1938477-0.0546875,0.3173828-0.1660156,0.3720703
+                       c-0.0776367,0.0415039-0.222168,0.0629883-0.4350586,0.0629883h-1.4047852c-0.1401367,0-0.265625-0.0205078-0.3735352-0.0585938
+                       c-0.1674805-0.050293-0.2514648-0.1235352-0.2514648-0.21875v-0.3276367c0-0.0898438,0.081543-0.1621094,0.2426758-0.2172852
+                       c0.1264648-0.0449219,0.2470703-0.065918,0.3657227-0.065918h2.0097656c0,0.0249023,0,0.0571289,0.0014648,0.0947266
+                       c0.0024414,0.0375977,0.0024414,0.0810547,0.0048828,0.1323242c0,0.050293,0.0024414,0.0952148,0.0039062,0.1323242
+                       C55.9423828,11.6572266,55.9448242,11.6879883,55.9448242,11.7128906L55.9448242,11.7128906z M61.7548828,12.4101562v-1.527832
+                       c0-0.5595703-0.3979492-0.8408203-1.1904297-0.8408203c-0.2973633,0-0.5068359,0.0078125-0.6323242,0.0214844
+                       c-0.2353516,0.0297852-0.4360352,0.0961914-0.5961914,0.1972656c-0.1801758-0.1064453-0.3779297-0.1762695-0.5932617-0.2026367
+                       c-0.0473633-0.0073242-0.1259766-0.0083008-0.2265625-0.012207c-0.1054688-0.0039062-0.2373047-0.0039062-0.4003906-0.0039062
+                       c-0.8242188,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832c0,0.1411133,0.0693359,0.2124023,0.2104492,0.2124023
+                       c0.1386719,0,0.2192383-0.0073242,0.2441406-0.0234375c0.074707-0.0263672,0.1118164-0.090332,0.1118164-0.1923828v-1.5839844
+                       c0-0.2080078,0.2431641-0.3129883,0.7294922-0.3129883c0.0170898,0,0.0415039,0.0014648,0.0673828,0.0014648
+                       c0.0263672,0,0.0585938,0.0039062,0.0947266,0.0039062c0.0009766,0,0.0097656,0,0.0224609,0h0.0249023h0.0463867h0.0683594
+                       c0.1694336,0,0.2915039,0.0185547,0.3676758,0.0561523c0.1083984,0.0561523,0.1635742,0.1582031,0.1635742,0.3110352v1.5268555
+                       c0,0.1420898,0.0708008,0.2133789,0.2109375,0.2133789c0.140625,0,0.2216797-0.0073242,0.2456055-0.0234375
+                       c0.078125-0.0263672,0.1166992-0.090332,0.1166992-0.1923828v-1.5185547c0-0.168457,0.0839844-0.2792969,0.2524414-0.3291016
+                       c0.0742188-0.0229492,0.2294922-0.0400391,0.4594727-0.0493164c0.0009766,0,0.012207,0,0.0341797,0h0.0336914h0.0751953
+                       c0.4833984,0,0.722168,0.1030273,0.722168,0.3071289v1.5898438c0,0.1020508,0.0395508,0.1660156,0.1176758,0.1923828
+                       c0.0234375,0.0161133,0.1040039,0.0234375,0.2451172,0.0234375C61.6831055,12.6225586,61.7548828,12.5512695,61.7548828,12.4101562
+                       L61.7548828,12.4101562z M65.6176758,11.3735352v-0.6225586c0-0.2524414-0.1376953-0.440918-0.4057617-0.5668945
+                       c-0.1943359-0.1000977-0.4404297-0.1474609-0.737793-0.1474609h-1.0561523c-0.3637695,0-0.6547852,0.0512695-0.8754883,0.15625
+                       c-0.3203125,0.1420898-0.480957,0.3637695-0.480957,0.6616211v0.949707c0,0.2197266,0.1040039,0.4121094,0.3139648,0.5761719
+                       c0.1464844,0.1137695,0.3759766,0.1879883,0.6855469,0.21875c0.0625,0.0083008,0.1552734,0.0161133,0.2768555,0.0170898
+                       c0.1186523,0.0039062,0.2758789,0.0063477,0.465332,0.0063477c0.1396484,0,0.2094727-0.0712891,0.2094727-0.2124023
+                       c0-0.1757812-0.0698242-0.262207-0.2094727-0.262207c-0.184082,0-0.3354492-0.003418-0.4560547-0.012207
+                       c-0.1171875-0.0083008-0.2099609-0.0205078-0.2719727-0.0327148c-0.2866211-0.0727539-0.4287109-0.2294922-0.4287109-0.4760742
+                       v-0.0185547h2.8125C65.5634766,11.6083984,65.6176758,11.5307617,65.6176758,11.3735352L65.6176758,11.3735352z
+                        M65.0600586,11.1166992H62.628418v-0.2978516c0-0.1313477,0.1191406-0.2202148,0.3569336-0.2651367
+                       c0.1660156-0.0332031,0.4750977-0.050293,0.9277344-0.050293c0.765625,0,1.1469727,0.0996094,1.1469727,0.2939453V11.1166992
+                       L65.0600586,11.1166992z M70.9165039,10.2138672c0-0.1225586-0.0898438-0.1850586-0.269043-0.1850586
+                       c-0.1552734,0-0.2548828,0.0424805-0.2988281,0.1264648l-0.8676758,1.6845703l-0.8486328-1.5722656
+                       c-0.0673828-0.1225586-0.1757812-0.1845703-0.3237305-0.1845703c-0.1513672,0-0.2597656,0.0620117-0.3261719,0.1884766
+                       l-0.8505859,1.5683594l-0.8691406-1.6845703c-0.0483398-0.0839844-0.1464844-0.1264648-0.3012695-0.1264648
+                       c-0.1757812,0-0.2670898,0.0625-0.2670898,0.1850586c0,0.0200195,0.0131836,0.0649414,0.0400391,0.1337891l1.0273438,2.043457
+                       c0.0600586,0.1240234,0.1796875,0.1865234,0.3520508,0.1865234c0.168457,0,0.2822266-0.0585938,0.3476562-0.1772461
+                       l0.847168-1.5742188l0.8369141,1.5717773c0.0639648,0.1162109,0.1762695,0.1748047,0.3354492,0.1748047
+                       c0.1689453,0,0.2832031-0.0610352,0.3442383-0.1816406l1.0512695-2.0424805
+                       C70.902832,10.2973633,70.9165039,10.2539062,70.9165039,10.2138672L70.9165039,10.2138672z M74.6005859,11.8203125v-0.9550781
+                       c0-0.550293-0.4189453-0.8237305-1.2558594-0.8237305h-0.9448242c-0.3369141,0-0.6166992,0.0576172-0.8461914,0.1723633
+                       c-0.3081055,0.1474609-0.4628906,0.3657227-0.4628906,0.6572266v0.9492188c0,0.2875977,0.1557617,0.5039062,0.4667969,0.6435547
+                       c0.2509766,0.1049805,0.534668,0.1586914,0.8447266,0.1586914h0.9423828c0.3422852,0,0.6166992-0.0537109,0.8222656-0.1572266
+                       C74.4560547,12.3291016,74.6005859,12.1152344,74.6005859,11.8203125L74.6005859,11.8203125z M74.027832,11.8217773
+                       c0,0.1162109-0.0908203,0.2021484-0.2739258,0.2607422c-0.1308594,0.0439453-0.2729492,0.0654297-0.4208984,0.0654297h-0.921875
+                       c-0.1743164,0-0.3291016-0.019043-0.4575195-0.0571289c-0.1972656-0.0581055-0.2973633-0.1469727-0.2973633-0.269043v-0.9506836
+                       c0-0.1269531,0.0976562-0.222168,0.2910156-0.2851562c0.1347656-0.0424805,0.2895508-0.0654297,0.4614258-0.0654297h0.9213867
+                       c0.4672852,0,0.6977539,0.1030273,0.6977539,0.3071289V11.8217773L74.027832,11.8217773z M76.5820312,10.3100586
+                       c0-0.1796875-0.0693359-0.2685547-0.2104492-0.2685547c-0.418457,0-0.7333984,0.0375977-0.9458008,0.1123047
+                       c-0.3457031,0.1210938-0.5166016,0.3486328-0.5166016,0.6860352v1.5668945c0,0.1445312,0.0664062,0.2158203,0.2011719,0.2158203
+                       c0.1333008,0,0.2148438-0.0063477,0.2470703-0.0161133c0.0776367-0.0288086,0.1166992-0.0922852,0.1166992-0.1972656v-1.5693359
+                       c0-0.2163086,0.2177734-0.324707,0.6538086-0.324707c0.0224609,0,0.0561523,0.0014648,0.1010742,0.0039062
+                       c0.043457,0.0014648,0.0776367,0.0014648,0.1005859,0.0014648C76.4980469,10.5205078,76.5820312,10.4511719,76.5820312,10.3100586
+                       L76.5820312,10.3100586z M79.909668,12.4228516c0-0.0888672-0.0473633-0.15625-0.1459961-0.2036133l-1.7768555-0.8935547
+                       l1.7373047-0.8657227c0.0957031-0.0488281,0.144043-0.1162109,0.144043-0.2036133
+                       c0-0.128418-0.0800781-0.1948242-0.2387695-0.1948242c-0.1230469,0-0.2099609,0.0068359-0.2573242,0.0214844l-1.9106445,0.9580078
+                       h-0.0029297V9.5507812c0-0.1030273-0.0380859-0.168457-0.1098633-0.1914062
+                       c-0.0297852-0.0126953-0.1123047-0.0185547-0.2416992-0.0185547c-0.1401367,0-0.2114258,0.0708008-0.2114258,0.2099609v2.859375
+                       c0,0.1411133,0.0712891,0.2124023,0.2114258,0.2124023c0.1352539,0,0.2158203-0.0073242,0.237793-0.0234375
+                       c0.0742188-0.0263672,0.1137695-0.0927734,0.1137695-0.1923828v-0.7797852l1.9360352,0.972168
+                       c0.0336914,0.0161133,0.1240234,0.0234375,0.2758789,0.0234375C79.8291016,12.6225586,79.909668,12.5551758,79.909668,12.4228516
+                       L79.909668,12.4228516z M82,8.6796875V8.1425781c0-0.0795898-0.0385742-0.1186523-0.1171875-0.1186523
+                       c-0.0214844,0-0.0410156,0.0048828-0.0585938,0.0112305c-0.015625,0.0097656-0.0322266,0.0224609-0.0458984,0.0371094
+                       l-0.3515625,0.4414062l-0.3603516-0.4384766c-0.0258789-0.0341797-0.0629883-0.0512695-0.1049805-0.0512695h-0.7661133
+                       c-0.0390625,0-0.0639648,0.0146484-0.0776367,0.0439453c-0.0087891,0.0131836-0.0151367,0.0371094-0.0151367,0.065918
+                       c0,0.0629883,0.0327148,0.09375,0.0927734,0.09375h0.1992188v0.4521484c0,0.0249023,0.0048828,0.0439453,0.0141602,0.059082
+                       c0.0107422,0.0131836,0.0258789,0.0258789,0.050293,0.03125c0.0039062,0.0024414,0.0112305,0.003418,0.0200195,0.003418
+                       s0.0234375,0,0.0410156,0c0.03125,0,0.0537109-0.0063477,0.0693359-0.0229492
+                       c0.0146484-0.0141602,0.0205078-0.0400391,0.0205078-0.0708008V8.2275391h0.2348633v0.4521484
+                       c0,0.0463867,0.0234375,0.0756836,0.065918,0.090332c0.003418,0.0024414,0.012207,0.003418,0.0209961,0.003418
+                       c0.0112305,0,0.0234375,0,0.0410156,0c0.0600586,0,0.090332-0.0297852,0.090332-0.09375V8.4082031l0.2529297,0.3178711
+                       c0.0273438,0.0332031,0.0634766,0.0512695,0.1108398,0.0512695c0.0458984,0,0.0834961-0.0180664,0.1123047-0.0512695
+                       l0.2426758-0.3071289v0.2607422c0,0.0639648,0.0307617,0.09375,0.0913086,0.09375h0.0380859c0.0039062,0,0.0053711,0,0.0087891,0
+                       c0.0039062,0,0.0078125-0.0009766,0.0102539-0.003418C81.9760742,8.7553711,82,8.7260742,82,8.6796875L82,8.6796875z
+                        M10.1689453,9.0756836c-0.6611328,2.0117188-1.2885742,2.6499023-3.7602539,3.3994141
+                       C7.5439453,10.1674805,8.2143555,9.5195312,10.1689453,9.0756836L10.1689453,9.0756836z M10.4858398,8.7475586H5.2431641
+                       c-0.9643555,0-1.7470703,0.7841797-1.7470703,1.7509766v3.5019531h5.2426758c0.965332,0,1.7470703-0.7822266,1.7470703-1.75
+                       V8.7475586L10.4858398,8.7475586z M4.9526367,2.9604492c2.6518555,0.5991211,3.5625,1.4804688,5.1035156,4.6108398
+                       C6.7021484,6.5551758,5.8486328,5.6879883,4.9526367,2.9604492L4.9526367,2.9604492z M10.4858398,3.3769531
+                       C10.4858398,2.0639648,9.425293,1,8.1142578,1H1v4.7529297c0,1.3115234,1.0625,2.3769531,2.371582,2.3769531h7.1142578V3.3769531
+                       L10.4858398,3.3769531z M14.3266602,5.0581055c-0.5327148,1.6206055-1.0395508,2.1362305-3.0317383,2.7392578
+                       C12.2099609,5.9379883,12.7504883,5.4140625,14.3266602,5.0581055L14.3266602,5.0581055z M11.1020508,5.3056641v2.8242188
+                       h4.2275391c0.7783203,0,1.409668-0.6333008,1.409668-1.4121094v-2.824707H12.512207
+                       C11.7338867,3.8930664,11.1020508,4.5253906,11.1020508,5.3056641L11.1020508,5.3056641z"/>
+       </g>
+</svg>
index 209aa44678d3663be9ce385a84a108e8fc7701a4..142046d04a0da37564ef4b14644dcd3d643a7180 100644 (file)
@@ -1,10 +1,10 @@
-<?php\r
-/**\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @category   Community Framework\r
- */\r
-require_once('./global.php');\r
+<?php
+/**
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @category   Community Framework
+ */
+require_once('./global.php');
 wcf\system\request\RequestHandler::getInstance()->handle('wcf', true);
index 6f60c10ae0106917570e38c06d9dc25f8aac2602..1706119b77577b470734c3db2e305ecc328e5c94 100644 (file)
-<?php\r
-namespace wcf\acp;\r
-use wcf\data\language\LanguageEditor;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\template\ACPTemplateEngine;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @category   Community Framework\r
- */\r
-// make group names to language variables\r
-$groupNames = array(\r
-       'Everyone' => WCF::getLanguage()->get('wcf.acp.group.everyone'),\r
-       'Guests' => WCF::getLanguage()->get('wcf.acp.group.guests'),\r
-       'Users' => WCF::getLanguage()->get('wcf.acp.group.users'),\r
-       'Administrators' => WCF::getLanguage()->get('wcf.acp.group.administrators'),\r
-       'Moderators' => WCF::getLanguage()->get('wcf.acp.group.moderators'),\r
-       'Super Moderators' => WCF::getLanguage()->get('wcf.acp.group.superModerators')\r
-);\r
-\r
-$sql = "UPDATE wcf".WCF_N."_user_group\r
-       SET     groupName = ?\r
-       WHERE   groupName = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-foreach ($groupNames as $oldValue => $newValue) {\r
-       $statement->execute(array($newValue, $oldValue));\r
-}\r
-\r
-// change the priority of the PIP's to "1"\r
-$sql = "UPDATE wcf".WCF_N."_package_installation_plugin\r
-       SET     priority = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// change group options from admin group to true\r
-$sql = "UPDATE wcf".WCF_N."_user_group_option_value\r
-       SET     optionValue = ?\r
-       WHERE   groupID = ?\r
-               AND optionValue = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1, 4, '0'));\r
-\r
-// update accessible groups\r
-$sql = "UPDATE wcf".WCF_N."_user_group_option_value\r
-       SET     optionValue = ?\r
-       WHERE   groupID = ?\r
-               AND optionValue = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array('1,2,3,4,5,6', 4, ''));\r
-\r
-// reset sessions\r
-SessionHandler::resetSessions();\r
-\r
-// update acp session\r
-$sql = "UPDATE wcf".WCF_N."_acp_session\r
-       SET     packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// update acp templates\r
-$sql = "UPDATE wcf".WCF_N."_acp_template\r
-       SET     packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// update language\r
-$sql = "UPDATE wcf".WCF_N."_language_item\r
-       SET     packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-$sql = "UPDATE wcf".WCF_N."_language_to_package\r
-       SET     packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// update installation logs\r
-$sql = "UPDATE wcf".WCF_N."_package_installation_file_log\r
-       SET     packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-$sql = "UPDATE wcf".WCF_N."_package_installation_sql_log\r
-       SET     packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// update pips\r
-$sql = "UPDATE wcf".WCF_N."_package_installation_plugin\r
-       SET     packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// group options\r
-$sql = "UPDATE wcf".WCF_N."_user_group_option\r
-       SET     packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// reset all caches\r
-CacheHandler::getInstance()->clear(WCF_DIR.'cache/', '*');\r
-\r
-// delete language files\r
-LanguageEditor::deleteLanguageFiles();\r
-\r
-// delete all compiled templates\r
+<?php
+namespace wcf\acp;
+use wcf\data\language\LanguageEditor;
+use wcf\system\cache\CacheHandler;
+use wcf\system\session\SessionHandler;
+use wcf\system\template\ACPTemplateEngine;
+use wcf\system\WCF;
+
+/**
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @category   Community Framework
+ */
+// make group names to language variables
+$groupNames = array(
+       'Everyone' => WCF::getLanguage()->get('wcf.acp.group.everyone'),
+       'Guests' => WCF::getLanguage()->get('wcf.acp.group.guests'),
+       'Users' => WCF::getLanguage()->get('wcf.acp.group.users'),
+       'Administrators' => WCF::getLanguage()->get('wcf.acp.group.administrators'),
+       'Moderators' => WCF::getLanguage()->get('wcf.acp.group.moderators'),
+       'Super Moderators' => WCF::getLanguage()->get('wcf.acp.group.superModerators')
+);
+
+$sql = "UPDATE wcf".WCF_N."_user_group
+       SET     groupName = ?
+       WHERE   groupName = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+foreach ($groupNames as $oldValue => $newValue) {
+       $statement->execute(array($newValue, $oldValue));
+}
+
+// change the priority of the PIP's to "1"
+$sql = "UPDATE wcf".WCF_N."_package_installation_plugin
+       SET     priority = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// change group options from admin group to true
+$sql = "UPDATE wcf".WCF_N."_user_group_option_value
+       SET     optionValue = ?
+       WHERE   groupID = ?
+               AND optionValue = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1, 4, '0'));
+
+// update accessible groups
+$sql = "UPDATE wcf".WCF_N."_user_group_option_value
+       SET     optionValue = ?
+       WHERE   groupID = ?
+               AND optionValue = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array('1,2,3,4,5,6', 4, ''));
+
+// reset sessions
+SessionHandler::resetSessions();
+
+// update acp session
+$sql = "UPDATE wcf".WCF_N."_acp_session
+       SET     packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// update acp templates
+$sql = "UPDATE wcf".WCF_N."_acp_template
+       SET     packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// update language
+$sql = "UPDATE wcf".WCF_N."_language_item
+       SET     packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+$sql = "UPDATE wcf".WCF_N."_language_to_package
+       SET     packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// update installation logs
+$sql = "UPDATE wcf".WCF_N."_package_installation_file_log
+       SET     packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+$sql = "UPDATE wcf".WCF_N."_package_installation_sql_log
+       SET     packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// update pips
+$sql = "UPDATE wcf".WCF_N."_package_installation_plugin
+       SET     packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// group options
+$sql = "UPDATE wcf".WCF_N."_user_group_option
+       SET     packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// reset all caches
+CacheHandler::getInstance()->clear(WCF_DIR.'cache/', '*');
+
+// delete language files
+LanguageEditor::deleteLanguageFiles();
+
+// delete all compiled templates
 ACPTemplateEngine::deleteCompiledTemplates(WCF_DIR.'acp/templates/compiled/');
index 98f9bb0fc67c32a840f373503a4c7b3d5e24513b..4b7a7aa2b0ea2363abcc6a852e7fcec5c481443c 100644 (file)
-/**\r
- * Class and function collection for WCF ACP\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-\r
-/**\r
- * Initialize WCF.ACP namespace\r
- */\r
-WCF.ACP = {};\r
-\r
-/**\r
- * Handles ACPMenu.\r
- *\r
- * @param      array           activeMenuItems\r
- */\r
-WCF.ACP.Menu = function(activeMenuItems) { this.init(activeMenuItems); };\r
-WCF.ACP.Menu.prototype = {\r
-       /**\r
-        * Initializes ACPMenu.\r
-        *\r
-        * @param       array           activeMenuItems\r
-        */\r
-       init: function(activeMenuItems) {\r
-               this._headerNavigation = $('nav#mainMenu');\r
-               this._sidebarNavigation = $('nav#sidebarMenu');\r
-               \r
-               this._prepareElements(activeMenuItems);\r
-       },\r
-       \r
-       /**\r
-        * Resets all elements and binds event listeners.\r
-        */\r
-       _prepareElements: function(activeMenuItems) {\r
-               this._headerNavigation.find('li').removeClass('activeMenuItem');\r
-               \r
-               this._sidebarNavigation.find('div h1').each($.proxy(function(index, menuHeader) {\r
-                       $(menuHeader).click($.proxy(this._toggleItem, this));\r
-               }, this));\r
-               \r
-               // close all navigation groups\r
-               this._sidebarNavigation.find('div div').each(function() {\r
-                       $(this).hide();\r
-               });\r
-               \r
-               this._headerNavigation.find('li').click($.proxy(this._toggleSidebar, this));\r
-               \r
-               if (activeMenuItems.length === 0) {\r
-                       this._renderSidebar(this._headerNavigation.find('li:first').data('menuItem'), []);\r
-               }\r
-               else {\r
-                       this._renderSidebar('', activeMenuItems);\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Toggles a navigation group entry.\r
-        */\r
-       _toggleItem: function(event) {\r
-               var $menuItem = $(event.target);\r
-               \r
-               $menuItem.next().stop(true, true).toggle('blind', { }, 200).end().toggleClass('activeMenuItem');\r
-       },\r
-       \r
-       /**\r
-        * Handles clicks on main menu.\r
-        *\r
-        * @param       object          event\r
-        */\r
-       _toggleSidebar: function(event) {\r
-               if ($(event.target).hasClass('activeMenuItem')) {\r
-                       return;\r
-               }\r
-               \r
-               this._renderSidebar($(event.target).data('menuItem'), []);\r
-       },\r
-       \r
-       /**\r
-        * Renders sidebar including highlighting of currently active menu items.\r
-        *\r
-        * @param       string          menuItem\r
-        * @param       array           activeMenuItems\r
-        */\r
-       _renderSidebar: function(menuItem, activeMenuItems) {\r
-               // reset visible and active items\r
-               this._headerNavigation.find('li').removeClass('activeMenuItem');\r
-               this._sidebarNavigation.find('div.menuContainer').hide();\r
-               \r
-               if (activeMenuItems.length === 0) {\r
-                       // show active menu\r
-                       this._headerNavigation.find('li[data-menuItem="' + menuItem + '"]').addClass('activeMenuItem');\r
-                       this._sidebarNavigation.find('div[data-parentMenuItem="' + menuItem + '"]').show();\r
-               }\r
-               else {\r
-                       // open menu by active menu items, first element is always a head navigation item\r
-                       menuItem = activeMenuItems.shift();\r
-                       \r
-                       this._headerNavigation.find('li[data-menuItem="' + menuItem + '"]').addClass('activeMenuItem');\r
-                       this._sidebarNavigation.find('div[data-parentMenuItem="' + menuItem + '"]').show();\r
-                       \r
-                       for (var $i = 0, $size = activeMenuItems.length; $i < $size; $i++) {\r
-                               var $item = activeMenuItems[$i];\r
-                               \r
-                               if ($.wcfIsset($item)) {\r
-                                       var $menuItem = $('#' + $.wcfEscapeID($item));\r
-                                       \r
-                                       if ($menuItem.getTagName() === 'ul') {\r
-                                               $menuItem.parent('div').show().prev().addClass('activeMenuItem');\r
-                                       }\r
-                                       else {\r
-                                               $menuItem.addClass('activeMenuItem');\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-};\r
-\r
-/**\r
- * Handles package installation dialog.\r
- * \r
- * @param      string          actionName\r
- * @param      integer         queueID\r
- * @param      boolean         initialize\r
- */\r
-WCF.ACP.PackageInstallation = function(actionName, queueID, initialize) { this.init(actionName, queueID, initialize); };\r
-WCF.ACP.PackageInstallation.prototype = {\r
-       /**\r
-        * package installation type\r
-        * \r
-        * @var string\r
-        */\r
-       _actionName: '',\r
-       \r
-       /**\r
-        * package installation dialog\r
-        *\r
-        * @var object\r
-        */\r
-       _dialog: null,\r
-       \r
-       /**\r
-        * queue id\r
-        *\r
-        * @var integer\r
-        */\r
-       _queueID: 0,\r
-       \r
-       /**\r
-        * Initializes package installation.\r
-        * \r
-        * @param       string          actionName\r
-        * @param       integer         queueID\r
-        * @param       boolean         initialize\r
-        */\r
-       init: function(actionName, queueID, initialize) {\r
-               this._actionName = WCF.String.ucfirst(actionName) + 'Package';\r
-               this._queueID = queueID;\r
-               \r
-               if (initialize) {\r
-                       $('#submitButton').click($.proxy(function(event) {\r
-                               this.prepareInstallation();\r
-                               return false;\r
-                       }, this));\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Prepares installation dialog.\r
-        */\r
-       prepareInstallation: function() {\r
-               WCF.showAJAXDialog('packageInstallationDialog', true, {\r
-                       ajax: {\r
-                               url: 'index.php?action=' + this._actionName + '&t=' + SECURITY_TOKEN + SID_ARG_2ND,\r
-                               type: 'POST',\r
-                               data: { queueID: this._queueID, step: 'prepare' },\r
-                               success: $.proxy(this._handleResponse, this)\r
-                       },\r
-                       preventClose: true,\r
-                       hideTitle: true\r
-               });\r
-       },\r
-       \r
-       /**\r
-        * Executes response instructions.\r
-        */\r
-       _handleResponse: function() {\r
-               if (this._dialog == null) {\r
-                       this._dialog = $('#packageInstallationDialog');\r
-               }\r
-               \r
-               var $data = this._dialog.data('responseData');\r
-               \r
-               // receive new queue id\r
-               if ($data.queueID) {\r
-                       this._queueID = $data.queueID;\r
-               }\r
-               \r
-               // update progress\r
-               if ($data.progress) {\r
-                       $('#packageInstallationProgress').attr('value', $data.progress).text($data.progress + '%');\r
-               }\r
-               \r
-               // handle success\r
-               if ($data.step == 'success') {\r
-                       var $id = WCF.getRandomID();\r
-                       $('#packageInstallationInnerContent').append('<div class="formSubmit"><input type="button" id="' + $id + '" value="Weiter" /></div>');\r
-                       \r
-                       $('#' + $id).click($.proxy(function() {\r
-                               window.location.href = "index.php?page=PackageList" + SID_ARG_2ND;\r
-                       }, this));\r
-                       \r
-                       $('#packageInstallationInnerContentContainer').wcfBlindIn();\r
-                       \r
-                       return;\r
-               }\r
-               \r
-               // update template\r
-               if ($data.template && !$data.ignoreTemplate) {\r
-                       this._dialog.html($data.template);\r
-               }\r
-               \r
-               // update action\r
-               if ($data.currentAction) {\r
-                       $('#packageInstallationAction').text($data.currentAction);\r
-               }\r
-               \r
-               // handle inner template\r
-               if ($data.innerTemplate) {\r
-                       $('#packageInstallationInnerContent').html($data.innerTemplate);\r
-                       \r
-                       // create button to handle next step\r
-                       if ($data.step && $data.node) {\r
-                               var $id = WCF.getRandomID();\r
-                               $('#packageInstallationInnerContent').append('<div class="formSubmit"><input type="button" id="' + $id + '" value="Weiter" /></div>');\r
-                               \r
-                               $('#' + $id).click($.proxy(function() {\r
-                                       // collect form values\r
-                                       var $additionalData = {};\r
-                                       $('#packageInstallationInnerContent').find('input').each(function(index, inputElement) {\r
-                                               $additionalData[$(inputElement).attr('name')] = $(inputElement).attr('value');\r
-                                       });\r
-                                       \r
-                                       this._executeStep($data.step, $data.node, $additionalData);\r
-                               }, this));\r
-                       }\r
-                       \r
-                       $('#packageInstallationInnerContentContainer').wcfBlindIn();\r
-                       \r
-                       this._dialog.wcfDialog('redraw');\r
-                       return;\r
-               }\r
-               \r
-               // purge content\r
-               if ($('#packageInstallationInnerContent').children().length > 1) {\r
-                       $('#packageInstallationInnerContentContainer').wcfBlindOut('down', $.proxy(function() {\r
-                               $('#packageInstallationInnerContent').empty();\r
-                               this._dialog.wcfDialog('redraw');\r
-                               \r
-                               // execute next step\r
-                               if ($data.step && $data.node) {\r
-                                       this._executeStep($data.step, $data.node);\r
-                               }\r
-                       }, this));\r
-               }\r
-               else {\r
-                       // execute next step\r
-                       if ($data.step && $data.node) {\r
-                               this._executeStep($data.step, $data.node);\r
-                       }\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Executes the next installation step.\r
-        * \r
-        * @param       string          step\r
-        * @param       string          node\r
-        * @param       object          additionalData\r
-        */\r
-       _executeStep: function(step, node, additionalData) {\r
-               if (!additionalData) additionalData = {};\r
-               \r
-               var $data = $.extend({\r
-                               node: node,\r
-                               queueID: this._queueID,\r
-                               step: step\r
-               }, additionalData);\r
-               \r
-               $.ajax({\r
-                       url: 'index.php?action=' + this._actionName + '&t=' + SECURITY_TOKEN + SID_ARG_2ND,\r
-                       dataType: 'json',\r
-                       type: 'POST',\r
-                       data: $data,\r
-                       success: $.proxy(function(data) {\r
-                               this._dialog.data('responseData', data);\r
-                               this._handleResponse();\r
-                       }, this),\r
-                       error: function(transport) {\r
-                               alert(transport.responseText);\r
-                       }\r
-               });\r
-       }\r
-};\r
-\r
-/**\r
- * Handles package uninstallation.\r
- * \r
- * @param      jQuery          elements\r
- */\r
-WCF.ACP.PackageUninstallation = function(elements) { this.init(elements); };\r
-WCF.ACP.PackageUninstallation.prototype = {\r
-       /**\r
-        * WCF.ACP.PackageInstallation object\r
-        * \r
-        * @var WCF.ACP.PackageInstallation\r
-        */\r
-       _installation: null,\r
-       \r
-       /**\r
-        * Initializes package uninstallation.\r
-        * \r
-        * @param       jQuery          elements\r
-        */\r
-       init: function(elements) {\r
-               if (elements.length == 0) return;\r
-               \r
-               // bind event listener\r
-               elements.each($.proxy(function(index, element) {\r
-                       $(element).click($.proxy(this._createQueue, this));\r
-               }, this));\r
-       },\r
-       \r
-       /**\r
-        * Creates a new package uninstallation process.\r
-        * \r
-        * @param       object          event\r
-        */\r
-       _createQueue: function(event) {\r
-               var packageID = $(event.target).data('objectID');\r
-               \r
-               this._installation = new WCF.ACP.PackageInstallation('uninstall', 0, false);\r
-               \r
-               // initialize dialog\r
-               WCF.showAJAXDialog('packageInstallationDialog', true, {\r
-                       ajax: {\r
-                               url: 'index.php?action=UninstallPackage&t=' + SECURITY_TOKEN + SID_ARG_2ND,\r
-                               type: 'POST',\r
-                               data: { packageID: packageID, step: 'prepare' },\r
-                               success: $.proxy(this._installation._handleResponse, this._installation)\r
-                       },\r
-                       preventClose: true,\r
-                       hideTitle: true\r
-               });\r
-       }\r
-};\r
-\r
-/**\r
- * Handles option selection.\r
- */\r
-WCF.ACP.Options = function() { this.init(); };\r
-WCF.ACP.Options.prototype = {\r
-       /**\r
-        * Initializes options.\r
-        */\r
-       init: function() {\r
-               $('.enablesOptions').each($.proxy(this._initOption, this));\r
-       },\r
-       \r
-       /**\r
-        * Initializes an option.\r
-        * \r
-        * @param       integer         index\r
-        * @param       object          option\r
-        */\r
-       _initOption: function(index, option) {\r
-               // execute action on init\r
-               this._change(option);\r
-               \r
-               // bind event listener\r
-               $(option).change($.proxy(this._handleChange, this));\r
-       },\r
-       \r
-       /**\r
-        * Applies whenever an option is changed.\r
-        * \r
-        * @param       object          event\r
-        */\r
-       _handleChange: function(event) {\r
-               this._change($(event.target));\r
-       },\r
-       \r
-       /**\r
-        * Enables or disables options on option value change.\r
-        * \r
-        * @param       object          option\r
-        */\r
-       _change: function(option) {\r
-               option = $(option);\r
-               \r
-               var $disableOptions = eval(option.data('disableOptions'));\r
-               var $enableOptions = eval(option.data('enableOptions'));\r
-               \r
-               // determine action by type\r
-               switch(option.getTagName()) {\r
-                       case 'input':\r
-                               switch(option.attr('type')) {\r
-                                       case 'checkbox':\r
-                                               this._execute(option.attr('checked'), $disableOptions, $enableOptions);\r
-                                       break;\r
-                                       \r
-                                       case 'radio':\r
-                                               if (option.attr('checked')) {\r
-                                                       this._execute(true, $disableOptions, $enableOptions);\r
-                                               }\r
-                                       break;\r
-                               }\r
-                       break;\r
-                       \r
-                       case 'select':\r
-                               var $value = option.val();\r
-                               var $disableOptions = $enableOptions = [];\r
-                               \r
-                               if (option.data('disableOptions').length > 0) {\r
-                                       for (var $index in option.data('disableOptions')) {\r
-                                               var $item = option.data('disableOptions')[$index];\r
-                                               \r
-                                               if ($item.value == $value) {\r
-                                                       $disableOptions.push($item.option);\r
-                                               }\r
-                                       }\r
-                               }\r
-                               \r
-                               if (option.data('enableOptions').length > 0) {\r
-                                       for (var $index in option.data('enableOptions')) {\r
-                                               var $item = option.data('enableOptions')[$index];\r
-                                               \r
-                                               if ($item.value == $value) {\r
-                                                       $enableOptions.push($item.option);\r
-                                               }\r
-                                       }\r
-                               }\r
-                               \r
-                               this._execute(true, $disableOptions, $enableOptions);\r
-                       break;\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Enables or disables options.\r
-        * \r
-        * @param       boolean         isActive\r
-        * @param       array           disableOptions\r
-        * @param       array           enableOptions\r
-        */\r
-       _execute: function(isActive, disableOptions, enableOptions) {\r
-               if (disableOptions.length > 0) {\r
-                       for (var $i = 0, $size = disableOptions.length; $i < $size; $i++) {\r
-                               var $target = disableOptions[$i];\r
-                               if ($.wcfIsset($target)) {\r
-                                       if (isActive) {\r
-                                               $('#' + $.wcfEscapeID($target)).disable().closest('dl').addClass('disabled');\r
-                                       }\r
-                                       else {\r
-                                               $('#' + $.wcfEscapeID($target)).enable().closest('dl').removeClass('disabled');\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               if (enableOptions.length > 0) {\r
-                       for (var $i = 0, $size = enableOptions.length; $i < $size; $i++) {\r
-                               var $target = enableOptions[$i];\r
-                               if ($.wcfIsset($target)) {\r
-                                       if (isActive) {\r
-                                               $('#' + $.wcfEscapeID($target)).enable().closest('dl').removeClass('disabled');\r
-                                       }\r
-                                       else {\r
-                                               $('#' + $.wcfEscapeID($target)).disable().closest('dl').addClass('disabled');\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
+/**
+ * Class and function collection for WCF ACP
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+
+/**
+ * Initialize WCF.ACP namespace
+ */
+WCF.ACP = {};
+
+/**
+ * Handles ACPMenu.
+ *
+ * @param      array           activeMenuItems
+ */
+WCF.ACP.Menu = function(activeMenuItems) { this.init(activeMenuItems); };
+WCF.ACP.Menu.prototype = {
+       /**
+        * Initializes ACPMenu.
+        *
+        * @param       array           activeMenuItems
+        */
+       init: function(activeMenuItems) {
+               this._headerNavigation = $('nav#mainMenu');
+               this._sidebarNavigation = $('nav#sidebarMenu');
+               
+               this._prepareElements(activeMenuItems);
+       },
+       
+       /**
+        * Resets all elements and binds event listeners.
+        */
+       _prepareElements: function(activeMenuItems) {
+               this._headerNavigation.find('li').removeClass('activeMenuItem');
+               
+               this._sidebarNavigation.find('div h1').each($.proxy(function(index, menuHeader) {
+                       $(menuHeader).click($.proxy(this._toggleItem, this));
+               }, this));
+               
+               // close all navigation groups
+               this._sidebarNavigation.find('div div').each(function() {
+                       $(this).hide();
+               });
+               
+               this._headerNavigation.find('li').click($.proxy(this._toggleSidebar, this));
+               
+               if (activeMenuItems.length === 0) {
+                       this._renderSidebar(this._headerNavigation.find('li:first').data('menuItem'), []);
+               }
+               else {
+                       this._renderSidebar('', activeMenuItems);
+               }
+       },
+       
+       /**
+        * Toggles a navigation group entry.
+        */
+       _toggleItem: function(event) {
+               var $menuItem = $(event.target);
+               
+               $menuItem.next().stop(true, true).toggle('blind', { }, 200).end().toggleClass('activeMenuItem');
+       },
+       
+       /**
+        * Handles clicks on main menu.
+        *
+        * @param       object          event
+        */
+       _toggleSidebar: function(event) {
+               if ($(event.target).hasClass('activeMenuItem')) {
+                       return;
+               }
+               
+               this._renderSidebar($(event.target).data('menuItem'), []);
+       },
+       
+       /**
+        * Renders sidebar including highlighting of currently active menu items.
+        *
+        * @param       string          menuItem
+        * @param       array           activeMenuItems
+        */
+       _renderSidebar: function(menuItem, activeMenuItems) {
+               // reset visible and active items
+               this._headerNavigation.find('li').removeClass('activeMenuItem');
+               this._sidebarNavigation.find('div.menuContainer').hide();
+               
+               if (activeMenuItems.length === 0) {
+                       // show active menu
+                       this._headerNavigation.find('li[data-menuItem="' + menuItem + '"]').addClass('activeMenuItem');
+                       this._sidebarNavigation.find('div[data-parentMenuItem="' + menuItem + '"]').show();
+               }
+               else {
+                       // open menu by active menu items, first element is always a head navigation item
+                       menuItem = activeMenuItems.shift();
+                       
+                       this._headerNavigation.find('li[data-menuItem="' + menuItem + '"]').addClass('activeMenuItem');
+                       this._sidebarNavigation.find('div[data-parentMenuItem="' + menuItem + '"]').show();
+                       
+                       for (var $i = 0, $size = activeMenuItems.length; $i < $size; $i++) {
+                               var $item = activeMenuItems[$i];
+                               
+                               if ($.wcfIsset($item)) {
+                                       var $menuItem = $('#' + $.wcfEscapeID($item));
+                                       
+                                       if ($menuItem.getTagName() === 'ul') {
+                                               $menuItem.parent('div').show().prev().addClass('activeMenuItem');
+                                       }
+                                       else {
+                                               $menuItem.addClass('activeMenuItem');
+                                       }
+                               }
+                       }
+               }
+       }
+};
+
+/**
+ * Handles package installation dialog.
+ * 
+ * @param      string          actionName
+ * @param      integer         queueID
+ * @param      boolean         initialize
+ */
+WCF.ACP.PackageInstallation = function(actionName, queueID, initialize) { this.init(actionName, queueID, initialize); };
+WCF.ACP.PackageInstallation.prototype = {
+       /**
+        * package installation type
+        * 
+        * @var string
+        */
+       _actionName: '',
+       
+       /**
+        * package installation dialog
+        *
+        * @var object
+        */
+       _dialog: null,
+       
+       /**
+        * queue id
+        *
+        * @var integer
+        */
+       _queueID: 0,
+       
+       /**
+        * Initializes package installation.
+        * 
+        * @param       string          actionName
+        * @param       integer         queueID
+        * @param       boolean         initialize
+        */
+       init: function(actionName, queueID, initialize) {
+               this._actionName = WCF.String.ucfirst(actionName) + 'Package';
+               this._queueID = queueID;
+               
+               if (initialize) {
+                       $('#submitButton').click($.proxy(function(event) {
+                               this.prepareInstallation();
+                               return false;
+                       }, this));
+               }
+       },
+       
+       /**
+        * Prepares installation dialog.
+        */
+       prepareInstallation: function() {
+               WCF.showAJAXDialog('packageInstallationDialog', true, {
+                       ajax: {
+                               url: 'index.php?action=' + this._actionName + '&t=' + SECURITY_TOKEN + SID_ARG_2ND,
+                               type: 'POST',
+                               data: { queueID: this._queueID, step: 'prepare' },
+                               success: $.proxy(this._handleResponse, this)
+                       },
+                       preventClose: true,
+                       hideTitle: true
+               });
+       },
+       
+       /**
+        * Executes response instructions.
+        */
+       _handleResponse: function() {
+               if (this._dialog == null) {
+                       this._dialog = $('#packageInstallationDialog');
+               }
+               
+               var $data = this._dialog.data('responseData');
+               
+               // receive new queue id
+               if ($data.queueID) {
+                       this._queueID = $data.queueID;
+               }
+               
+               // update progress
+               if ($data.progress) {
+                       $('#packageInstallationProgress').attr('value', $data.progress).text($data.progress + '%');
+               }
+               
+               // handle success
+               if ($data.step == 'success') {
+                       var $id = WCF.getRandomID();
+                       $('#packageInstallationInnerContent').append('<div class="formSubmit"><input type="button" id="' + $id + '" value="Weiter" /></div>');
+                       
+                       $('#' + $id).click($.proxy(function() {
+                               window.location.href = "index.php?page=PackageList" + SID_ARG_2ND;
+                       }, this));
+                       
+                       $('#packageInstallationInnerContentContainer').wcfBlindIn();
+                       
+                       return;
+               }
+               
+               // update template
+               if ($data.template && !$data.ignoreTemplate) {
+                       this._dialog.html($data.template);
+               }
+               
+               // update action
+               if ($data.currentAction) {
+                       $('#packageInstallationAction').text($data.currentAction);
+               }
+               
+               // handle inner template
+               if ($data.innerTemplate) {
+                       $('#packageInstallationInnerContent').html($data.innerTemplate);
+                       
+                       // create button to handle next step
+                       if ($data.step && $data.node) {
+                               var $id = WCF.getRandomID();
+                               $('#packageInstallationInnerContent').append('<div class="formSubmit"><input type="button" id="' + $id + '" value="Weiter" /></div>');
+                               
+                               $('#' + $id).click($.proxy(function() {
+                                       // collect form values
+                                       var $additionalData = {};
+                                       $('#packageInstallationInnerContent').find('input').each(function(index, inputElement) {
+                                               $additionalData[$(inputElement).attr('name')] = $(inputElement).attr('value');
+                                       });
+                                       
+                                       this._executeStep($data.step, $data.node, $additionalData);
+                               }, this));
+                       }
+                       
+                       $('#packageInstallationInnerContentContainer').wcfBlindIn();
+                       
+                       this._dialog.wcfDialog('redraw');
+                       return;
+               }
+               
+               // purge content
+               if ($('#packageInstallationInnerContent').children().length > 1) {
+                       $('#packageInstallationInnerContentContainer').wcfBlindOut('down', $.proxy(function() {
+                               $('#packageInstallationInnerContent').empty();
+                               this._dialog.wcfDialog('redraw');
+                               
+                               // execute next step
+                               if ($data.step && $data.node) {
+                                       this._executeStep($data.step, $data.node);
+                               }
+                       }, this));
+               }
+               else {
+                       // execute next step
+                       if ($data.step && $data.node) {
+                               this._executeStep($data.step, $data.node);
+                       }
+               }
+       },
+       
+       /**
+        * Executes the next installation step.
+        * 
+        * @param       string          step
+        * @param       string          node
+        * @param       object          additionalData
+        */
+       _executeStep: function(step, node, additionalData) {
+               if (!additionalData) additionalData = {};
+               
+               var $data = $.extend({
+                               node: node,
+                               queueID: this._queueID,
+                               step: step
+               }, additionalData);
+               
+               $.ajax({
+                       url: 'index.php?action=' + this._actionName + '&t=' + SECURITY_TOKEN + SID_ARG_2ND,
+                       dataType: 'json',
+                       type: 'POST',
+                       data: $data,
+                       success: $.proxy(function(data) {
+                               this._dialog.data('responseData', data);
+                               this._handleResponse();
+                       }, this),
+                       error: function(transport) {
+                               alert(transport.responseText);
+                       }
+               });
+       }
+};
+
+/**
+ * Handles package uninstallation.
+ * 
+ * @param      jQuery          elements
+ */
+WCF.ACP.PackageUninstallation = function(elements) { this.init(elements); };
+WCF.ACP.PackageUninstallation.prototype = {
+       /**
+        * WCF.ACP.PackageInstallation object
+        * 
+        * @var WCF.ACP.PackageInstallation
+        */
+       _installation: null,
+       
+       /**
+        * Initializes package uninstallation.
+        * 
+        * @param       jQuery          elements
+        */
+       init: function(elements) {
+               if (elements.length == 0) return;
+               
+               // bind event listener
+               elements.each($.proxy(function(index, element) {
+                       $(element).click($.proxy(this._createQueue, this));
+               }, this));
+       },
+       
+       /**
+        * Creates a new package uninstallation process.
+        * 
+        * @param       object          event
+        */
+       _createQueue: function(event) {
+               var packageID = $(event.target).data('objectID');
+               
+               this._installation = new WCF.ACP.PackageInstallation('uninstall', 0, false);
+               
+               // initialize dialog
+               WCF.showAJAXDialog('packageInstallationDialog', true, {
+                       ajax: {
+                               url: 'index.php?action=UninstallPackage&t=' + SECURITY_TOKEN + SID_ARG_2ND,
+                               type: 'POST',
+                               data: { packageID: packageID, step: 'prepare' },
+                               success: $.proxy(this._installation._handleResponse, this._installation)
+                       },
+                       preventClose: true,
+                       hideTitle: true
+               });
+       }
+};
+
+/**
+ * Handles option selection.
+ */
+WCF.ACP.Options = function() { this.init(); };
+WCF.ACP.Options.prototype = {
+       /**
+        * Initializes options.
+        */
+       init: function() {
+               $('.enablesOptions').each($.proxy(this._initOption, this));
+       },
+       
+       /**
+        * Initializes an option.
+        * 
+        * @param       integer         index
+        * @param       object          option
+        */
+       _initOption: function(index, option) {
+               // execute action on init
+               this._change(option);
+               
+               // bind event listener
+               $(option).change($.proxy(this._handleChange, this));
+       },
+       
+       /**
+        * Applies whenever an option is changed.
+        * 
+        * @param       object          event
+        */
+       _handleChange: function(event) {
+               this._change($(event.target));
+       },
+       
+       /**
+        * Enables or disables options on option value change.
+        * 
+        * @param       object          option
+        */
+       _change: function(option) {
+               option = $(option);
+               
+               var $disableOptions = eval(option.data('disableOptions'));
+               var $enableOptions = eval(option.data('enableOptions'));
+               
+               // determine action by type
+               switch(option.getTagName()) {
+                       case 'input':
+                               switch(option.attr('type')) {
+                                       case 'checkbox':
+                                               this._execute(option.attr('checked'), $disableOptions, $enableOptions);
+                                       break;
+                                       
+                                       case 'radio':
+                                               if (option.attr('checked')) {
+                                                       this._execute(true, $disableOptions, $enableOptions);
+                                               }
+                                       break;
+                               }
+                       break;
+                       
+                       case 'select':
+                               var $value = option.val();
+                               var $disableOptions = $enableOptions = [];
+                               
+                               if (option.data('disableOptions').length > 0) {
+                                       for (var $index in option.data('disableOptions')) {
+                                               var $item = option.data('disableOptions')[$index];
+                                               
+                                               if ($item.value == $value) {
+                                                       $disableOptions.push($item.option);
+                                               }
+                                       }
+                               }
+                               
+                               if (option.data('enableOptions').length > 0) {
+                                       for (var $index in option.data('enableOptions')) {
+                                               var $item = option.data('enableOptions')[$index];
+                                               
+                                               if ($item.value == $value) {
+                                                       $enableOptions.push($item.option);
+                                               }
+                                       }
+                               }
+                               
+                               this._execute(true, $disableOptions, $enableOptions);
+                       break;
+               }
+       },
+       
+       /**
+        * Enables or disables options.
+        * 
+        * @param       boolean         isActive
+        * @param       array           disableOptions
+        * @param       array           enableOptions
+        */
+       _execute: function(isActive, disableOptions, enableOptions) {
+               if (disableOptions.length > 0) {
+                       for (var $i = 0, $size = disableOptions.length; $i < $size; $i++) {
+                               var $target = disableOptions[$i];
+                               if ($.wcfIsset($target)) {
+                                       if (isActive) {
+                                               $('#' + $.wcfEscapeID($target)).disable().closest('dl').addClass('disabled');
+                                       }
+                                       else {
+                                               $('#' + $.wcfEscapeID($target)).enable().closest('dl').removeClass('disabled');
+                                       }
+                               }
+                       }
+               }
+               
+               if (enableOptions.length > 0) {
+                       for (var $i = 0, $size = enableOptions.length; $i < $size; $i++) {
+                               var $target = enableOptions[$i];
+                               if ($.wcfIsset($target)) {
+                                       if (isActive) {
+                                               $('#' + $.wcfEscapeID($target)).enable().closest('dl').removeClass('disabled');
+                                       }
+                                       else {
+                                               $('#' + $.wcfEscapeID($target)).disable().closest('dl').addClass('disabled');
+                                       }
+                               }
+                       }
+               }
+       }
 };
\ No newline at end of file
index dac5cd3e1a0a72f56df8bfd63caedb9fab07a965..3096ace0d8fac99a1935e5de5e6d497c963b0537 100644 (file)
-\r
-/* dynamic style attributes */\r
-\r
-.largeButtons li a,.pmEditFolders a{background-image:url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png")}\r
-.largeButtons li a:hover,.pmEditFolders a:hover{background-image:url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png")}\r
-.largeButtons li a,.pmEditFolders a{border-style:solid}\r
-.largeButtons li a{border-width:0px}\r
-.largeButtons li{border-style:solid}\r
-.largeButtons li{border-width:0px}\r
-.largeButtons li a,.pmEditFolders a{color:#fff}\r
-.largeButtons li a:hover,.pmEditFolders a:hover{color:#fff}\r
-.memberList li .memberName,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{background-color:#d9e5ef}\r
-.memberList li .memberName{border-color:#d9e5ef}\r
-.memberList li .memberName:hover,.messageNumber:hover,.optionButtons a:hover,.pageNavigation li ul,.smallButtons a:hover,li.extraButton a:hover{background-color:#ffe0b8}\r
-.memberList li .memberName,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{background-image:url("../images/WoltLab Blue Sunrise/smallButtons.png")}\r
-.memberList li .memberName:hover,.messageNumber:hover,.optionButtons a:hover,.smallButtons a:hover,li.extraButton a:hover{background-image:url("../images/WoltLab Blue Sunrise/smallButtonsHover.png")}\r
-.memberList li,.memberList li .memberRemove{background-color:#fff}\r
-.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-color:#fff}\r
-.memberList li .memberRemove:hover,.memberList li:hover{background-color:#fff}\r
-.optionButtons a:hover,.pageNavigation a:hover,.smallButtons a:hover,li.extraButton a:hover{border-color:#fff}\r
-.pageNavigation li.children:hover > span{border-color:#fff}\r
-.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-style:solid}\r
-.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-width:1px}\r
-.footerOptions li.extraButton,.memberList li,.messageNumber,.optionButtons li,.pageNavigation li,.smallButtons li,li.extraButton{border-color:#8da4b7}\r
-.memberList li:hover,.messageNumber:hover,.optionButtons li:hover,.pageNavigation li:hover,.smallButtons li:hover,li.extraButton:hover{border-color:#fa2}\r
-.memberList li,.messageNumber,.optionButtons li,.smallButtons li,li.extraButton{border-style:solid}\r
-.li.extraButton,.memberList li,.messageNumber,.optionButtons li,.smallButtons li{border-width:1px}\r
-.container-1 .smallButtons a,.container-2 .smallButtons a,.container-3 .smallButtons a,.memberList li .memberName,.messageInner .color-1 .smallButtons a,.messageInner .color-2 .smallButtons a,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{color:#666}\r
-.container-1 .smallButtons a:hover,.container-2 .smallButtons a:hover,.container-3 .smallButtons a:hover,.memberList li .memberName:hover,.messageInner .color-1 .smallButtons a:hover,.messageInner .color-2 .smallButtons a:hover,.messageNumber:hover,.optionButtons a:hover,.smallButtons a:hover,li.extraButton a:hover{color:#333}\r
-.border,.mceResizeBox,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.subTabMenu{background-color:#fff}\r
-#logo,#search,.attachmentPreview ul li a,.border .tableList td,.border .tableList th,.columnContainer,.dividers .messageAuthor,.dividers .tocHeadline,.dividers .userAvatar,.dividers .userCredits,.dividers .userMessenger,.dividers .userSymbols,.inlineCalendarFooter td a,.inlineCalendarFooter td span,.inlineCalendarHeader td a,.inlineCalendarHeader td span,.mainMenu .mainMenuInner,.mainMenu a,.mceEditor .mceColors li,.messageContent,.messageInner,.subTabMenu div.containerHead,.tabMenu li a,.userAvatar,.userAvatarFramed{border-color:#fff}\r
-#footer,#header,.attachmentFile ul li,.attachmentPreview ul li:hover,.avatarDisplay div,.avatarSelect li label,.border,.footerMenu li,.footerOptions li,.galleryIndex li.floatedElement:hover,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.mainMenu,.marked,.mceResizeBox,.message,.messageContentInner,.messageNumber,.pageNavigation li ul,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.searchContainer,.subTabMenu,.tabMenu li,.userAvatar a,.userAvatarFramed a,fieldset{border-color:#8da4b7}\r
-.border,.error,.info,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.message,.pageNavigation li ul,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.searchContainer,.subTabMenu,.success,.tabMenu li,.warning,fieldset{border-style:solid}\r
-.border,.error,.info,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.message,.quoteBox,.searchContainer,.success,.warning,fieldset{border-width:1px}\r
-.containerHead,.inlineCalendarFooter td,.inlineCalendarHeader td,.tabMenu li.activeTabMenu a,.tabMenu li.activeTabMenu a:hover{background-color:#164369}\r
-.containerHead,.inlineCalendarFooter td,.inlineCalendarHeader td{background-image:url("../images/WoltLab Blue Sunrise/containerHead.png")}\r
-.containerHead .light,.containerHead .light a{color:#fff}\r
-.containerHead,.inlineCalendarFooter td a,.inlineCalendarFooter td span,.inlineCalendarHeader td a,.inlineCalendarHeader td span{color:#fff}\r
-.containerHead a,.tabMenu li.activeTabMenu a,.tabMenu li.activeTabMenu a:hover{color:#fff}\r
-.containerHead a:hover{color:#fff}\r
-.container-1,.container-1 fieldset fieldset,.container-2 fieldset,.dynBoxInner,.inlineCalendarTable,.messageInner .color-1,.pageNavigation li ul,div.pageMenu li.container-1 a,fieldset{background-color:#f8fafb}\r
-.inlineCalendarTable a{border-color:#f8fafb}\r
-.container-1 fieldset,.container-1 fieldset fieldset.noJavaScript fieldset,.container-2,.container-2 fieldset fieldset,.container-3 fieldset,.messageInner .color-2,.weekDays,div.pageMenu li.container-2 a,fieldset fieldset{background-color:#f2f6fa}\r
-.container-3,.container-3 fieldset fieldset,.itemList .itemListCategory,.tableList tbody tr:hover,.threadStarterPost .poll .container-3{background-color:#d8e7f5}\r
-.messageContainer,.messageContainerFooter{border-color:#d8e7f5}\r
-.container-4,.galleryAlbumCover img,.userAvatarFramed{background-color:#fff}\r
-#userCardCredits,.attachmentPreview ul li,.buttonBar,.deleteNote,.editNote,.friendsConnection,.friendsNetwork,.friendsNone,.galleryIndex li.floatedElement,.guestAdvice,.itemList .itemListTitle,.mainMenu div.pageMenu .bottomSeparator a,.mainMenu div.pageMenu .topSeparator a,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline,div.pageMenu .bottomSeparator a,div.pageMenu .topSeparator a{border-color:#c5d0da}\r
-.buttonBar,.deleteNote,.editNote,.itemList .itemListTitle,.mainMenu div.pageMenu .bottomSeparator a,.mainMenu div.pageMenu .topSeparator a,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline,div.pageMenu .bottomSeparator a,div.pageMenu .topSeparator a{border-style:solid}\r
-.mainMenu div.pageMenu .bottomSeparator a,div.pageMenu .bottomSeparator a{border-bottom-width:1px}\r
-.mainMenu div.pageMenu .topSeparator a,div.pageMenu .topSeparator a{border-top-width:1px}\r
-.deleteNote,.editNote,.itemList .itemListTitle,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline{border-width:1px}\r
-#logo h1{position: absolute; top: -9000px; left: -9000px;}\r
-.inputText,select,textarea{background-color:#fff}\r
-.inputText:focus,select:focus,textarea:focus{background-color:#fff9f4}\r
-.inputText,select,textarea{border-color:#8da4b7}\r
-.inputText:focus,select:focus,textarea:focus{border-color:#fa2}\r
-.inputText,select,textarea{border-style:solid}\r
-.inputText,.inputText:focus,select,select:focus,textarea,textarea:focus{border-width:1px}\r
-.editor textarea,.inputText,select,textarea{font-family:'Trebuchet MS', Arial, sans-serif}\r
-.editor textarea,.inputText,select,textarea{color:#333}\r
-.editor textarea:focus,.inputText:focus,select:focus,textarea:focus{color:#000}\r
-.editor textarea,.inputText,select,textarea{font-size:.85em}\r
-.mainMenu div.pageMenu a,.optionButtons li,.pageNavigation a,.pageNavigation li.children span,div.messageInner div.pageMenu a,div.messageInner div.smallButtons div.pageMenu a,div.pageMenu a,div.smallButtons div.pageMenu a{background-color:#f8fafb}\r
-.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li.children:hover span,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu .twoRows a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{background-color:#ffe0b8}\r
-.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li span:hover,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}\r
-.pageNavigation li.children:hover > span{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}\r
-.mainMenu div.pageMenu a,.pageNavigation a,.pageNavigation li.children span,.tableList div.pageMenu a,div.messageInner div.pageMenu a,div.messageInner div.smallButtons div.pageMenu a,div.pageMenu a,div.smallButtons div.pageMenu a{color:#333}\r
-.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li.children:hover span,.tableList div.pageMenu a:hover,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{color:#333}\r
-.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a{background-color:#154268}\r
-.mainMenu .active a:hover,.mainMenu .firstActive a:hover,.mainMenu .lastActive a:hover{background-color:#154268}\r
-.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a{color:#d9e5ef}\r
-.mainMenu .active a:hover,.mainMenu .firstActive a:hover,.mainMenu .lastActive a:hover{color:#fff}\r
-.mainMenu a:hover{background-color:#ffe0b8}\r
-.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a,.mainMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/menuActive.png")}\r
-.mainMenu{background-color:transparent}\r
-.mainMenu a{color:#154268}\r
-.mainMenu a:hover{color:#333}\r
-.mainMenu div{text-align:left;margin:0 auto 0 0}\r
-.tabMenu ul li.activeTabMenu a{background-color:#164369}\r
-.tabMenu ul li.activeTabMenu a:hover{background-color:#164369}\r
-.tabMenu ul li.activeTabMenu a{color:#fff}\r
-.tabMenu li a,.tabMenu li.disabled a:hover{background-color:#e8e8e8}\r
-.tabMenu li a:hover{background-color:#8da4b7}\r
-.tabMenu li a,.tabMenu li.disabled a:hover{background-image:url("../images/WoltLab Blue Sunrise/tab.png")}\r
-.tabMenu li a:hover,.tabMenu li.activeTabMenu a,.tabMenu ul li.activeTabMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/tabActive.png")}\r
-.subTabMenu ul .activeSubTabMenu a{background-color:#17354e}\r
-.subTabMenu ul .activeSubTabMenu a:hover{background-color:#487397}\r
-.subTabMenu ul .activeSubTabMenu a{color:#fff}\r
-.subTabMenu ul .activeSubTabMenu a:hover{color:#fff}\r
-.subTabMenu ul li a:hover{background-color:#487397}\r
-.subTabMenu ul .activeSubTabMenu a,.subTabMenu ul li a{border-color:#487397}\r
-.subTabMenu ul .activeSubTabMenu a:hover,.subTabMenu ul li a:hover{border-color:#8da4b7}\r
-.subTabMenu ul .activeSubTabMenu a,.subTabMenu ul li a:hover{border-style:solid}\r
-#search .searchContainer p a,.subTabMenu ul li a{color:#ddd}\r
-#search .searchContainer p a:hover,.subTabMenu ul li a:hover{color:#fff}\r
-.tabMenu li a,.tabMenu li.disabled a:hover{color:#666}\r
-.tabMenu li a:hover{color:#fff}\r
-.message .messageSidebar{text-align:center}\r
-#footer,#header,#main,#mainMenu,#userPanel{margin-left:auto;margin-right:auto;}\r
-body,html{background-color:#fff}\r
-.iframeBody,body,textarea{font-family:'Trebuchet MS', Arial, sans-serif}\r
-.formFieldDesc,.light{color:#858789}\r
-#footer,#search .searchContainer p a,.boardlistCounter,.boardlistDescription,.boardlistLastPost,.boardlistSubboards,.boardlistUsersOnline,.deleteNote,.editNote,.firstPost,.formField label,.formFieldDesc,.loginPopup,.messageNumber,.moderators,.pageNavigation,.pageNavigation input,.pmMove p,.pmUsage,.popupMenu,.smallButtons li span,.smallFont,.statusDisplay,.subTabMenu ul li,.tableList th,.userCredits,.userExtras,.userPanel,div.inlineCalendar,td.columnLastActivity,td.columnLocation,td.columnRegistrationDate,td.columnUserAgent{font-size:.85em}\r
-.userPanel a,body,legend{color:#57595a}\r
-.breadCrumbs,.error,.info,.message h3,.message h4,.messageBody,.success,.warning{line-height:1.5}\r
-.iframeBody,body{font-size:.8em}\r
-#logo{height:90px}\r
-a,div.pageMenu .twoRows a span{color:#154268}\r
-a:hover,div.pageMenu .twoRows a:hover span{color:#000}\r
-* a.externalURL{color:#154268}\r
-* a.externalURL:hover{color:#08f}\r
-#logo .pageLogo{text-align:left}\r
-#logo .pageLogo img{margin-left:0px}\r
-#logo .pageLogo img{margin-right:0px}\r
-#logo .pageLogo img{margin-top:5px}\r
-h2{font-family:'Trebuchet MS', Arial, sans-serif}\r
-h2,h2 a,h2 a:hover{color:#173f61}\r
-h2{font-size:1.5em}\r
-h2{font-style:normal}\r
-h2{font-weight:normal}\r
-#footer,#header,#main,#mainMenu,#userPanel{max-width:80%}\r
-#footer,#header,#main,#mainMenu,#userPanel{min-width:760px}\r
-.activeContainer,.activeMessage,.mainMenu div.pageMenu .active a,.markedDayField a,.pageNavigation .active span,div.pageMenu li.active a{background-color:#d8e7f5}\r
-.activeContainer,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-color:#487397}\r
-.activeContainer,.avatarDisplay div,.avatarSelect li label,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-style:solid}\r
-.activeContainer,.avatarDisplay div,.avatarSelect li label,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-width:1px}\r
-.activeContainer .light,.activeContainer .light a,.activeContainer a:hover{color:#333}\r
-.activeContainer,.mainMenu div.pageMenu .active a,.markedDayField a,.pageNavigation .active span,div.pageMenu li.active a{color:#333}\r
-.activeContainer a{color:#333}\r
-.tableHead .active .emptyHead,.tableHead .active a{background-color:#ffe0b8}\r
-.tableHead .active a:hover{background-color:#ffe0b8}\r
-.tableHead .active .emptyHead,.tableHead .active a{border-color:#fa2}\r
-.tableHead .active a:hover{border-color:#f60}\r
-.tableHead .active .emptyHead,.tableHead .active a{color:#000}\r
-.tableHead .active a:hover{color:#000}\r
-.tableHead .emptyHead,.tableHead a{background-color:#eee}\r
-.tableHead a:hover{background-color:#ffe0b8}\r
-.tableHead .emptyHead,.tableHead a{background-image:url("../images/WoltLab Blue Sunrise/tableHead.png")}\r
-.tableHead .active .emptyHead,.tableHead .active a,.tableHead .active a:hover,.tableHead a:hover{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}\r
-.tableHead .emptyHead,.tableHead a{border-color:#8da4b7}\r
-.tableHead a:hover{border-color:#154268}\r
-.tableHead .emptyHead,.tableHead a{color:#154268}\r
-.tableHead a:hover{color:#000}\r
-\r
-/* user.additional.style.input1.use */\r
-\r
-html {background-color: #eee;}\r
-#main {padding-top: 0;}\r
-h1 {text-shadow: 0 -1px 1px #000;}\r
-h2, h2 a {text-shadow: 0 2px 3px #bbb;}\r
-legend {color: #487397;}\r
-#headerContainer {background-color: #164369;background-image: url("../images/WoltLab Blue Sunrise/header.jpg");background-repeat: repeat-x;background-position: left top;}\r
-#header {border-width: 0 !important;}\r
-#logo {margin: 0;border-width: 0 !important;}\r
-#userPanel {background-image: url("../images/WoltLab Blue Sunrise/userPanel.png");background-repeat: repeat-x;background-position: left bottom;max-width: 100%;min-width: 100%;width: 100%;}\r
-.userPanelInner {max-width: 80%;min-width: 770px;margin: 0 auto;}\r
-.userPanel, .userPanel a {color: #ebf1f6;}\r
-.userPanel a:hover {color: #fff;}\r
-.userPanel .border, .userPanel .popupMenu a {color: #57595a;}\r
-#search {right: 0;top: 23px;}\r
-#search .searchContainer {text-align: center;background-color: transparent;background-image: url("../images/WoltLab Blue Sunrise/searchContainer.png");background-repeat: no-repeat;background-position: right top;padding-left: 40px;min-height: 24px;}\r
-#mainMenu {max-width: 100%;min-width: 100%;width: 100%;}\r
-.mainMenu {min-height: 31px;background-color: transparent;background-image: url("../images/WoltLab Blue Sunrise/menuBar.png");background-repeat: repeat-x;background-position: left bottom;padding-bottom: 6px;border-width: 0 !important;}\r
-.mainMenu .mainMenuInner {max-width: 80%;min-width: 770px;margin: 0 auto;border-width: 0 !important;}\r
-.mainMenu a {text-shadow: 0 1px 0 #fff;border: 1px solid #c2c2c2;border-width: 0 1px 1px 1px;padding: 3px 5px 4px 5px;line-height: 1;}\r
-.mainMenu a:hover {background-image: url("../images/WoltLab Blue Sunrise/menuHover.png");}\r
-.mainMenu .active a, .mainMenu .firstActive a, .mainMenu .lastActive a {text-shadow: 0 -1px 0 #036;background-image: url("../images/WoltLab Blue Sunrise/menuActive.png") !important;}\r
-#mainMenu span {position: relative;top: 5px;}\r
-.mainMenu img {float: left;padding-right: 4px;}\r
-#footerContainer {background-color: #eee;border-top: 1px solid #8da4b7;}\r
-#footer {border: 0 !important;}\r
-.pageNavigation a:hover {background-image: url("../images/WoltLab Blue Sunrise/smallButtonsHover.png");}\r
-.messageLeft, .messageRight, .messageFramedLeft, .messageFramedRight, .messageTop, .messageFramedTop {background-image: url("../images/WoltLab Blue Sunrise/messageSidebar.jpg");background-repeat: repeat-x;}\r
-.userName a span, .quickReply h3 a {text-shadow: 0 1px 0 #fff;}\r
-.poll .pollQuestion {background-image: url("../images/WoltLab Blue Sunrise/poll.jpg");background-repeat: repeat-x;}\r
-.threadStarterPost .messageLeft, .threadStarterPost .messageRight, .threadStarterPost .messageFramedLeft, .threadStarterPost .messageFramedRight, .threadStarterPost .messageTop, .threadStarterPost .messageFramedTop  {background-image: url("../images/WoltLab Blue Sunrise/messageSidebarThreadStarter.jpg");background-repeat: repeat-x;}\r
-.threadStarterPost .container-3 {background-color: #ffddb7;}\r
-.threadStarterPost .codeBox .container-3 {background-color: #d8e7f5;}\r
-.firstPost a {color: #858789;}\r
-.smallButtons span {text-shadow: 0 1px 0 #fff;}\r
-.largeButtons a {line-height: 1;background-image: url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png");background-position: right 0;background-repeat: no-repeat;padding: 0 7px 0 0;}\r
-.largeButtons a img {margin-top: 5px;margin-left: 7px;position: absolute;}\r
-.largeButtons a span {color: #fff;text-shadow: 0 -1px 0 #036;background-image: url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png");background-position: left 0;background-repeat: no-repeat;padding: 9px 3px 0 36px;display: block;height: 25px;cursor: pointer;}\r
-.largeButtons a:hover {background-position: right -86px;}\r
-.largeButtons a:hover span {color: #000;text-shadow: 0 1px 0 #fff;background-position: left -86px;}\r
-.tabMenu a span, .tabMenu li.disabled a span {text-shadow: 0 1px 0 #fff;}\r
-.tabMenu .activeTabMenu a span, .tabMenu a:hover span, .subTabMenu a span {text-shadow: 0 -1px 0 #036;}\r
-.containerHead, .containerHead a {text-shadow: 0 -1px 0 #036;}\r
-.subHeadline {text-shadow: 0 1px 0 #fff;}\r
-.memberList li span {text-shadow: 0 1px 0 #fff;}\r
-.galleryIndex li span {text-shadow: 0 1px 0 #fff;}\r
-select, textarea, input[type="text"], input[type="password"] {border-width: 1px;border-style: solid;border-color: #666 #999 #ccc #999;background-image: url("../images/WoltLab Blue Sunrise/inputBackground.png");background-position: left top;background-repeat: repeat-x;min-height: 13px;}\r
-select, textarea:focus, input[type="text"]:focus, input[type="password"]:focus {background-image: url("../images/WoltLab Blue Sunrise/inputBackground.png");background-repeat: repeat-x;outline: 0;}\r
-\r
-/* user.additional.style.input2.use */\r
-\r
-* {-o-text-overflow: ellipsis;}\r
-.message, .messageInner, .quoteBox, fieldset, .info, .success, .warning, .error, .help, #userCard, .userCardInner, .second .border, .second .border .content, .avatarSelect li.container-4, .avatarSelect li label, .floatedElement, .popupMenu, .loginPopup, .loginPopup .container-1 {-webkit-border-radius: 5px; -moz-border-radius: 5px;}\r
-.messageLeft .messageContent, .messageLeft .messageContentInner {-webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px;}\r
-.messageRight .messageContent, .messageRight .messageContentInner {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;}\r
-.messageFramedLeft .messageContent, .messageFramedLeft .messageContentInner, .messageFramedRight .messageContent, .messageFramedRight .messageContentInner {-webkit-border-radius: 5px; -moz-border-radius: 5px;}\r
-.messageTop .messageContent, .messageTop .messageContentInner {-webkit-border-radius: 0; -moz-border-radius: 0;}\r
-.messageFramedTop .messageContent, .messageFramedTop .messageContentInner {-webkit-border-radius: 5px; -moz-border-radius: 5px;}\r
-textarea, select, input[type="text"], input[type="password"], .memberList li, .smallButtons > ul > li, .smallButtons > ul > li > a, .extraButton, .extraButton a, .optionButtons > ul > li, .optionButtons > ul > li > a, .subTabMenu .containerHead li a, .pmUsageBar, .statBar, .userAvatarFramed, .userAvatarFramed a, .userAvatarFramed img {-webkit-border-radius: 3px; -moz-border-radius: 3px;}\r
-.pmUsageBar > div, .statBar > div {-webkit-border-radius: 1px; -moz-border-radius: 1px;}\r
-.popupMenu li:first-child a, #boardlist .border, .titleBarPanel, .titleBarPanel .containerHead, .messagePreview, .subTabMenu, .subTabMenu .containerHead, .containerHead, .messageTop .messageSidebar, .messageFramedTop .messageSidebar, .thumbnailButtons {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px;}\r
-.codeBox {-webkit-border-top-left-radius: 3px; -webkit-border-top-right-radius: 3px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px;}\r
-.tabMenu li:first-child, .tabMenu li:first-child a {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px;}\r
-.tabMenu li:last-child, .tabMenu li:last-child a {-webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px;}\r
-.searchInputMenu .pageMenu, .popupMenu li:last-child a, .twoRows li:last-child {-webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px;}\r
-#boardlist .border .boardlistInner, .twoRows li:last-child a, .datalist li:last-child {-webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;}\r
-.popupMenu li a, #boardlist .border .boardlistInner:first-child {-webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0;}\r
-.mceToolbar .popupMenu, .mceToolbar .popupMenu li, .mceToolbar .popupMenu li a, .second fieldset .editor, .second fieldset .border, .attachmentPreview, .attachmentPreview li, .tableList td.containerHead {-webkit-border-top-left-radius: 0 !important; -webkit-border-top-right-radius: 0 !important; -webkit-border-bottom-right-radius: 0 !important; -moz-border-radius-topleft: 0 !important; -webkit-border-bottom-left-radius: 0 !important; -moz-border-radius-topright: 0 !important; -moz-border-radius-bottomleft: 0 !important; -moz-border-radius-bottomright: 0 !important;}\r
-.loginPopup input#quickLoginUsername {-webkit-border-top-right-radius: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-topright: 0; -moz-border-radius-bottomright: 0;}\r
-.loginPopup input#quickLoginPassword {-webkit-border-top-left-radius: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-topleft: 0; -moz-border-radius-bottomleft: 0;}\r
-input#searchInput {-webkit-border-radius: 12px; -moz-border-radius: 12px;}\r
-#searchInput {background-image: url("../images/WoltLab Blue Sunrise/searchBack-ltr.png"); background-position: -2px top; padding-left: 33px; width: 154px; height: 16px;}\r
-.searchOptions {background-image: url("../images/WoltLab Blue Sunrise/searchBackOptions-ltr.png") !important;}\r
-.searchOptions:focus {background-image: url("../images/WoltLab Blue Sunrise/searchBackOptionsActive-ltr.png") !important;}\r
-.galleryPhotoEdit img, .galleryAlbumCover img {-webkit-box-shadow: 0 3px 7px #666; -moz-box-shadow: 0 3px 7px #666;}\r
-.galleryIndex li.floatedElement .thumbnail img, .squared .thumbnail img {-webkit-box-shadow: 0 1px 3px #666; -moz-box-shadow: 0 1px 3px #666;}\r
-.galleryIndex li.floatedElement:hover, .avatarSelect li label:hover {-webkit-box-shadow: 0 1px 3px #999; -moz-box-shadow: 0 1px 3px #999;}\r
-.galleryPhoto img {-webkit-box-shadow: 0 3px 7px #666; -moz-box-shadow: 0 3px 7px #666; margin: 10px;}\r
-.imageViewerCurrentImage {-webkit-box-shadow: 0 3px 23px #000; -moz-box-shadow: 0 3px 23px #000;}\r
+
+/* dynamic style attributes */
+
+.largeButtons li a,.pmEditFolders a{background-image:url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png")}
+.largeButtons li a:hover,.pmEditFolders a:hover{background-image:url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png")}
+.largeButtons li a,.pmEditFolders a{border-style:solid}
+.largeButtons li a{border-width:0px}
+.largeButtons li{border-style:solid}
+.largeButtons li{border-width:0px}
+.largeButtons li a,.pmEditFolders a{color:#fff}
+.largeButtons li a:hover,.pmEditFolders a:hover{color:#fff}
+.memberList li .memberName,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{background-color:#d9e5ef}
+.memberList li .memberName{border-color:#d9e5ef}
+.memberList li .memberName:hover,.messageNumber:hover,.optionButtons a:hover,.pageNavigation li ul,.smallButtons a:hover,li.extraButton a:hover{background-color:#ffe0b8}
+.memberList li .memberName,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{background-image:url("../images/WoltLab Blue Sunrise/smallButtons.png")}
+.memberList li .memberName:hover,.messageNumber:hover,.optionButtons a:hover,.smallButtons a:hover,li.extraButton a:hover{background-image:url("../images/WoltLab Blue Sunrise/smallButtonsHover.png")}
+.memberList li,.memberList li .memberRemove{background-color:#fff}
+.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-color:#fff}
+.memberList li .memberRemove:hover,.memberList li:hover{background-color:#fff}
+.optionButtons a:hover,.pageNavigation a:hover,.smallButtons a:hover,li.extraButton a:hover{border-color:#fff}
+.pageNavigation li.children:hover > span{border-color:#fff}
+.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-style:solid}
+.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-width:1px}
+.footerOptions li.extraButton,.memberList li,.messageNumber,.optionButtons li,.pageNavigation li,.smallButtons li,li.extraButton{border-color:#8da4b7}
+.memberList li:hover,.messageNumber:hover,.optionButtons li:hover,.pageNavigation li:hover,.smallButtons li:hover,li.extraButton:hover{border-color:#fa2}
+.memberList li,.messageNumber,.optionButtons li,.smallButtons li,li.extraButton{border-style:solid}
+.li.extraButton,.memberList li,.messageNumber,.optionButtons li,.smallButtons li{border-width:1px}
+.container-1 .smallButtons a,.container-2 .smallButtons a,.container-3 .smallButtons a,.memberList li .memberName,.messageInner .color-1 .smallButtons a,.messageInner .color-2 .smallButtons a,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{color:#666}
+.container-1 .smallButtons a:hover,.container-2 .smallButtons a:hover,.container-3 .smallButtons a:hover,.memberList li .memberName:hover,.messageInner .color-1 .smallButtons a:hover,.messageInner .color-2 .smallButtons a:hover,.messageNumber:hover,.optionButtons a:hover,.smallButtons a:hover,li.extraButton a:hover{color:#333}
+.border,.mceResizeBox,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.subTabMenu{background-color:#fff}
+#logo,#search,.attachmentPreview ul li a,.border .tableList td,.border .tableList th,.columnContainer,.dividers .messageAuthor,.dividers .tocHeadline,.dividers .userAvatar,.dividers .userCredits,.dividers .userMessenger,.dividers .userSymbols,.inlineCalendarFooter td a,.inlineCalendarFooter td span,.inlineCalendarHeader td a,.inlineCalendarHeader td span,.mainMenu .mainMenuInner,.mainMenu a,.mceEditor .mceColors li,.messageContent,.messageInner,.subTabMenu div.containerHead,.tabMenu li a,.userAvatar,.userAvatarFramed{border-color:#fff}
+#footer,#header,.attachmentFile ul li,.attachmentPreview ul li:hover,.avatarDisplay div,.avatarSelect li label,.border,.footerMenu li,.footerOptions li,.galleryIndex li.floatedElement:hover,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.mainMenu,.marked,.mceResizeBox,.message,.messageContentInner,.messageNumber,.pageNavigation li ul,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.searchContainer,.subTabMenu,.tabMenu li,.userAvatar a,.userAvatarFramed a,fieldset{border-color:#8da4b7}
+.border,.error,.info,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.message,.pageNavigation li ul,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.searchContainer,.subTabMenu,.success,.tabMenu li,.warning,fieldset{border-style:solid}
+.border,.error,.info,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.message,.quoteBox,.searchContainer,.success,.warning,fieldset{border-width:1px}
+.containerHead,.inlineCalendarFooter td,.inlineCalendarHeader td,.tabMenu li.activeTabMenu a,.tabMenu li.activeTabMenu a:hover{background-color:#164369}
+.containerHead,.inlineCalendarFooter td,.inlineCalendarHeader td{background-image:url("../images/WoltLab Blue Sunrise/containerHead.png")}
+.containerHead .light,.containerHead .light a{color:#fff}
+.containerHead,.inlineCalendarFooter td a,.inlineCalendarFooter td span,.inlineCalendarHeader td a,.inlineCalendarHeader td span{color:#fff}
+.containerHead a,.tabMenu li.activeTabMenu a,.tabMenu li.activeTabMenu a:hover{color:#fff}
+.containerHead a:hover{color:#fff}
+.container-1,.container-1 fieldset fieldset,.container-2 fieldset,.dynBoxInner,.inlineCalendarTable,.messageInner .color-1,.pageNavigation li ul,div.pageMenu li.container-1 a,fieldset{background-color:#f8fafb}
+.inlineCalendarTable a{border-color:#f8fafb}
+.container-1 fieldset,.container-1 fieldset fieldset.noJavaScript fieldset,.container-2,.container-2 fieldset fieldset,.container-3 fieldset,.messageInner .color-2,.weekDays,div.pageMenu li.container-2 a,fieldset fieldset{background-color:#f2f6fa}
+.container-3,.container-3 fieldset fieldset,.itemList .itemListCategory,.tableList tbody tr:hover,.threadStarterPost .poll .container-3{background-color:#d8e7f5}
+.messageContainer,.messageContainerFooter{border-color:#d8e7f5}
+.container-4,.galleryAlbumCover img,.userAvatarFramed{background-color:#fff}
+#userCardCredits,.attachmentPreview ul li,.buttonBar,.deleteNote,.editNote,.friendsConnection,.friendsNetwork,.friendsNone,.galleryIndex li.floatedElement,.guestAdvice,.itemList .itemListTitle,.mainMenu div.pageMenu .bottomSeparator a,.mainMenu div.pageMenu .topSeparator a,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline,div.pageMenu .bottomSeparator a,div.pageMenu .topSeparator a{border-color:#c5d0da}
+.buttonBar,.deleteNote,.editNote,.itemList .itemListTitle,.mainMenu div.pageMenu .bottomSeparator a,.mainMenu div.pageMenu .topSeparator a,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline,div.pageMenu .bottomSeparator a,div.pageMenu .topSeparator a{border-style:solid}
+.mainMenu div.pageMenu .bottomSeparator a,div.pageMenu .bottomSeparator a{border-bottom-width:1px}
+.mainMenu div.pageMenu .topSeparator a,div.pageMenu .topSeparator a{border-top-width:1px}
+.deleteNote,.editNote,.itemList .itemListTitle,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline{border-width:1px}
+#logo h1{position: absolute; top: -9000px; left: -9000px;}
+.inputText,select,textarea{background-color:#fff}
+.inputText:focus,select:focus,textarea:focus{background-color:#fff9f4}
+.inputText,select,textarea{border-color:#8da4b7}
+.inputText:focus,select:focus,textarea:focus{border-color:#fa2}
+.inputText,select,textarea{border-style:solid}
+.inputText,.inputText:focus,select,select:focus,textarea,textarea:focus{border-width:1px}
+.editor textarea,.inputText,select,textarea{font-family:'Trebuchet MS', Arial, sans-serif}
+.editor textarea,.inputText,select,textarea{color:#333}
+.editor textarea:focus,.inputText:focus,select:focus,textarea:focus{color:#000}
+.editor textarea,.inputText,select,textarea{font-size:.85em}
+.mainMenu div.pageMenu a,.optionButtons li,.pageNavigation a,.pageNavigation li.children span,div.messageInner div.pageMenu a,div.messageInner div.smallButtons div.pageMenu a,div.pageMenu a,div.smallButtons div.pageMenu a{background-color:#f8fafb}
+.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li.children:hover span,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu .twoRows a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{background-color:#ffe0b8}
+.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li span:hover,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}
+.pageNavigation li.children:hover > span{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}
+.mainMenu div.pageMenu a,.pageNavigation a,.pageNavigation li.children span,.tableList div.pageMenu a,div.messageInner div.pageMenu a,div.messageInner div.smallButtons div.pageMenu a,div.pageMenu a,div.smallButtons div.pageMenu a{color:#333}
+.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li.children:hover span,.tableList div.pageMenu a:hover,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{color:#333}
+.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a{background-color:#154268}
+.mainMenu .active a:hover,.mainMenu .firstActive a:hover,.mainMenu .lastActive a:hover{background-color:#154268}
+.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a{color:#d9e5ef}
+.mainMenu .active a:hover,.mainMenu .firstActive a:hover,.mainMenu .lastActive a:hover{color:#fff}
+.mainMenu a:hover{background-color:#ffe0b8}
+.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a,.mainMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/menuActive.png")}
+.mainMenu{background-color:transparent}
+.mainMenu a{color:#154268}
+.mainMenu a:hover{color:#333}
+.mainMenu div{text-align:left;margin:0 auto 0 0}
+.tabMenu ul li.activeTabMenu a{background-color:#164369}
+.tabMenu ul li.activeTabMenu a:hover{background-color:#164369}
+.tabMenu ul li.activeTabMenu a{color:#fff}
+.tabMenu li a,.tabMenu li.disabled a:hover{background-color:#e8e8e8}
+.tabMenu li a:hover{background-color:#8da4b7}
+.tabMenu li a,.tabMenu li.disabled a:hover{background-image:url("../images/WoltLab Blue Sunrise/tab.png")}
+.tabMenu li a:hover,.tabMenu li.activeTabMenu a,.tabMenu ul li.activeTabMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/tabActive.png")}
+.subTabMenu ul .activeSubTabMenu a{background-color:#17354e}
+.subTabMenu ul .activeSubTabMenu a:hover{background-color:#487397}
+.subTabMenu ul .activeSubTabMenu a{color:#fff}
+.subTabMenu ul .activeSubTabMenu a:hover{color:#fff}
+.subTabMenu ul li a:hover{background-color:#487397}
+.subTabMenu ul .activeSubTabMenu a,.subTabMenu ul li a{border-color:#487397}
+.subTabMenu ul .activeSubTabMenu a:hover,.subTabMenu ul li a:hover{border-color:#8da4b7}
+.subTabMenu ul .activeSubTabMenu a,.subTabMenu ul li a:hover{border-style:solid}
+#search .searchContainer p a,.subTabMenu ul li a{color:#ddd}
+#search .searchContainer p a:hover,.subTabMenu ul li a:hover{color:#fff}
+.tabMenu li a,.tabMenu li.disabled a:hover{color:#666}
+.tabMenu li a:hover{color:#fff}
+.message .messageSidebar{text-align:center}
+#footer,#header,#main,#mainMenu,#userPanel{margin-left:auto;margin-right:auto;}
+body,html{background-color:#fff}
+.iframeBody,body,textarea{font-family:'Trebuchet MS', Arial, sans-serif}
+.formFieldDesc,.light{color:#858789}
+#footer,#search .searchContainer p a,.boardlistCounter,.boardlistDescription,.boardlistLastPost,.boardlistSubboards,.boardlistUsersOnline,.deleteNote,.editNote,.firstPost,.formField label,.formFieldDesc,.loginPopup,.messageNumber,.moderators,.pageNavigation,.pageNavigation input,.pmMove p,.pmUsage,.popupMenu,.smallButtons li span,.smallFont,.statusDisplay,.subTabMenu ul li,.tableList th,.userCredits,.userExtras,.userPanel,div.inlineCalendar,td.columnLastActivity,td.columnLocation,td.columnRegistrationDate,td.columnUserAgent{font-size:.85em}
+.userPanel a,body,legend{color:#57595a}
+.breadCrumbs,.error,.info,.message h3,.message h4,.messageBody,.success,.warning{line-height:1.5}
+.iframeBody,body{font-size:.8em}
+#logo{height:90px}
+a,div.pageMenu .twoRows a span{color:#154268}
+a:hover,div.pageMenu .twoRows a:hover span{color:#000}
+* a.externalURL{color:#154268}
+* a.externalURL:hover{color:#08f}
+#logo .pageLogo{text-align:left}
+#logo .pageLogo img{margin-left:0px}
+#logo .pageLogo img{margin-right:0px}
+#logo .pageLogo img{margin-top:5px}
+h2{font-family:'Trebuchet MS', Arial, sans-serif}
+h2,h2 a,h2 a:hover{color:#173f61}
+h2{font-size:1.5em}
+h2{font-style:normal}
+h2{font-weight:normal}
+#footer,#header,#main,#mainMenu,#userPanel{max-width:80%}
+#footer,#header,#main,#mainMenu,#userPanel{min-width:760px}
+.activeContainer,.activeMessage,.mainMenu div.pageMenu .active a,.markedDayField a,.pageNavigation .active span,div.pageMenu li.active a{background-color:#d8e7f5}
+.activeContainer,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-color:#487397}
+.activeContainer,.avatarDisplay div,.avatarSelect li label,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-style:solid}
+.activeContainer,.avatarDisplay div,.avatarSelect li label,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-width:1px}
+.activeContainer .light,.activeContainer .light a,.activeContainer a:hover{color:#333}
+.activeContainer,.mainMenu div.pageMenu .active a,.markedDayField a,.pageNavigation .active span,div.pageMenu li.active a{color:#333}
+.activeContainer a{color:#333}
+.tableHead .active .emptyHead,.tableHead .active a{background-color:#ffe0b8}
+.tableHead .active a:hover{background-color:#ffe0b8}
+.tableHead .active .emptyHead,.tableHead .active a{border-color:#fa2}
+.tableHead .active a:hover{border-color:#f60}
+.tableHead .active .emptyHead,.tableHead .active a{color:#000}
+.tableHead .active a:hover{color:#000}
+.tableHead .emptyHead,.tableHead a{background-color:#eee}
+.tableHead a:hover{background-color:#ffe0b8}
+.tableHead .emptyHead,.tableHead a{background-image:url("../images/WoltLab Blue Sunrise/tableHead.png")}
+.tableHead .active .emptyHead,.tableHead .active a,.tableHead .active a:hover,.tableHead a:hover{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}
+.tableHead .emptyHead,.tableHead a{border-color:#8da4b7}
+.tableHead a:hover{border-color:#154268}
+.tableHead .emptyHead,.tableHead a{color:#154268}
+.tableHead a:hover{color:#000}
+
+/* user.additional.style.input1.use */
+
+html {background-color: #eee;}
+#main {padding-top: 0;}
+h1 {text-shadow: 0 -1px 1px #000;}
+h2, h2 a {text-shadow: 0 2px 3px #bbb;}
+legend {color: #487397;}
+#headerContainer {background-color: #164369;background-image: url("../images/WoltLab Blue Sunrise/header.jpg");background-repeat: repeat-x;background-position: left top;}
+#header {border-width: 0 !important;}
+#logo {margin: 0;border-width: 0 !important;}
+#userPanel {background-image: url("../images/WoltLab Blue Sunrise/userPanel.png");background-repeat: repeat-x;background-position: left bottom;max-width: 100%;min-width: 100%;width: 100%;}
+.userPanelInner {max-width: 80%;min-width: 770px;margin: 0 auto;}
+.userPanel, .userPanel a {color: #ebf1f6;}
+.userPanel a:hover {color: #fff;}
+.userPanel .border, .userPanel .popupMenu a {color: #57595a;}
+#search {right: 0;top: 23px;}
+#search .searchContainer {text-align: center;background-color: transparent;background-image: url("../images/WoltLab Blue Sunrise/searchContainer.png");background-repeat: no-repeat;background-position: right top;padding-left: 40px;min-height: 24px;}
+#mainMenu {max-width: 100%;min-width: 100%;width: 100%;}
+.mainMenu {min-height: 31px;background-color: transparent;background-image: url("../images/WoltLab Blue Sunrise/menuBar.png");background-repeat: repeat-x;background-position: left bottom;padding-bottom: 6px;border-width: 0 !important;}
+.mainMenu .mainMenuInner {max-width: 80%;min-width: 770px;margin: 0 auto;border-width: 0 !important;}
+.mainMenu a {text-shadow: 0 1px 0 #fff;border: 1px solid #c2c2c2;border-width: 0 1px 1px 1px;padding: 3px 5px 4px 5px;line-height: 1;}
+.mainMenu a:hover {background-image: url("../images/WoltLab Blue Sunrise/menuHover.png");}
+.mainMenu .active a, .mainMenu .firstActive a, .mainMenu .lastActive a {text-shadow: 0 -1px 0 #036;background-image: url("../images/WoltLab Blue Sunrise/menuActive.png") !important;}
+#mainMenu span {position: relative;top: 5px;}
+.mainMenu img {float: left;padding-right: 4px;}
+#footerContainer {background-color: #eee;border-top: 1px solid #8da4b7;}
+#footer {border: 0 !important;}
+.pageNavigation a:hover {background-image: url("../images/WoltLab Blue Sunrise/smallButtonsHover.png");}
+.messageLeft, .messageRight, .messageFramedLeft, .messageFramedRight, .messageTop, .messageFramedTop {background-image: url("../images/WoltLab Blue Sunrise/messageSidebar.jpg");background-repeat: repeat-x;}
+.userName a span, .quickReply h3 a {text-shadow: 0 1px 0 #fff;}
+.poll .pollQuestion {background-image: url("../images/WoltLab Blue Sunrise/poll.jpg");background-repeat: repeat-x;}
+.threadStarterPost .messageLeft, .threadStarterPost .messageRight, .threadStarterPost .messageFramedLeft, .threadStarterPost .messageFramedRight, .threadStarterPost .messageTop, .threadStarterPost .messageFramedTop  {background-image: url("../images/WoltLab Blue Sunrise/messageSidebarThreadStarter.jpg");background-repeat: repeat-x;}
+.threadStarterPost .container-3 {background-color: #ffddb7;}
+.threadStarterPost .codeBox .container-3 {background-color: #d8e7f5;}
+.firstPost a {color: #858789;}
+.smallButtons span {text-shadow: 0 1px 0 #fff;}
+.largeButtons a {line-height: 1;background-image: url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png");background-position: right 0;background-repeat: no-repeat;padding: 0 7px 0 0;}
+.largeButtons a img {margin-top: 5px;margin-left: 7px;position: absolute;}
+.largeButtons a span {color: #fff;text-shadow: 0 -1px 0 #036;background-image: url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png");background-position: left 0;background-repeat: no-repeat;padding: 9px 3px 0 36px;display: block;height: 25px;cursor: pointer;}
+.largeButtons a:hover {background-position: right -86px;}
+.largeButtons a:hover span {color: #000;text-shadow: 0 1px 0 #fff;background-position: left -86px;}
+.tabMenu a span, .tabMenu li.disabled a span {text-shadow: 0 1px 0 #fff;}
+.tabMenu .activeTabMenu a span, .tabMenu a:hover span, .subTabMenu a span {text-shadow: 0 -1px 0 #036;}
+.containerHead, .containerHead a {text-shadow: 0 -1px 0 #036;}
+.subHeadline {text-shadow: 0 1px 0 #fff;}
+.memberList li span {text-shadow: 0 1px 0 #fff;}
+.galleryIndex li span {text-shadow: 0 1px 0 #fff;}
+select, textarea, input[type="text"], input[type="password"] {border-width: 1px;border-style: solid;border-color: #666 #999 #ccc #999;background-image: url("../images/WoltLab Blue Sunrise/inputBackground.png");background-position: left top;background-repeat: repeat-x;min-height: 13px;}
+select, textarea:focus, input[type="text"]:focus, input[type="password"]:focus {background-image: url("../images/WoltLab Blue Sunrise/inputBackground.png");background-repeat: repeat-x;outline: 0;}
+
+/* user.additional.style.input2.use */
+
+* {-o-text-overflow: ellipsis;}
+.message, .messageInner, .quoteBox, fieldset, .info, .success, .warning, .error, .help, #userCard, .userCardInner, .second .border, .second .border .content, .avatarSelect li.container-4, .avatarSelect li label, .floatedElement, .popupMenu, .loginPopup, .loginPopup .container-1 {-webkit-border-radius: 5px; -moz-border-radius: 5px;}
+.messageLeft .messageContent, .messageLeft .messageContentInner {-webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px;}
+.messageRight .messageContent, .messageRight .messageContentInner {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;}
+.messageFramedLeft .messageContent, .messageFramedLeft .messageContentInner, .messageFramedRight .messageContent, .messageFramedRight .messageContentInner {-webkit-border-radius: 5px; -moz-border-radius: 5px;}
+.messageTop .messageContent, .messageTop .messageContentInner {-webkit-border-radius: 0; -moz-border-radius: 0;}
+.messageFramedTop .messageContent, .messageFramedTop .messageContentInner {-webkit-border-radius: 5px; -moz-border-radius: 5px;}
+textarea, select, input[type="text"], input[type="password"], .memberList li, .smallButtons > ul > li, .smallButtons > ul > li > a, .extraButton, .extraButton a, .optionButtons > ul > li, .optionButtons > ul > li > a, .subTabMenu .containerHead li a, .pmUsageBar, .statBar, .userAvatarFramed, .userAvatarFramed a, .userAvatarFramed img {-webkit-border-radius: 3px; -moz-border-radius: 3px;}
+.pmUsageBar > div, .statBar > div {-webkit-border-radius: 1px; -moz-border-radius: 1px;}
+.popupMenu li:first-child a, #boardlist .border, .titleBarPanel, .titleBarPanel .containerHead, .messagePreview, .subTabMenu, .subTabMenu .containerHead, .containerHead, .messageTop .messageSidebar, .messageFramedTop .messageSidebar, .thumbnailButtons {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px;}
+.codeBox {-webkit-border-top-left-radius: 3px; -webkit-border-top-right-radius: 3px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px;}
+.tabMenu li:first-child, .tabMenu li:first-child a {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px;}
+.tabMenu li:last-child, .tabMenu li:last-child a {-webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px;}
+.searchInputMenu .pageMenu, .popupMenu li:last-child a, .twoRows li:last-child {-webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px;}
+#boardlist .border .boardlistInner, .twoRows li:last-child a, .datalist li:last-child {-webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;}
+.popupMenu li a, #boardlist .border .boardlistInner:first-child {-webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0;}
+.mceToolbar .popupMenu, .mceToolbar .popupMenu li, .mceToolbar .popupMenu li a, .second fieldset .editor, .second fieldset .border, .attachmentPreview, .attachmentPreview li, .tableList td.containerHead {-webkit-border-top-left-radius: 0 !important; -webkit-border-top-right-radius: 0 !important; -webkit-border-bottom-right-radius: 0 !important; -moz-border-radius-topleft: 0 !important; -webkit-border-bottom-left-radius: 0 !important; -moz-border-radius-topright: 0 !important; -moz-border-radius-bottomleft: 0 !important; -moz-border-radius-bottomright: 0 !important;}
+.loginPopup input#quickLoginUsername {-webkit-border-top-right-radius: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-topright: 0; -moz-border-radius-bottomright: 0;}
+.loginPopup input#quickLoginPassword {-webkit-border-top-left-radius: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-topleft: 0; -moz-border-radius-bottomleft: 0;}
+input#searchInput {-webkit-border-radius: 12px; -moz-border-radius: 12px;}
+#searchInput {background-image: url("../images/WoltLab Blue Sunrise/searchBack-ltr.png"); background-position: -2px top; padding-left: 33px; width: 154px; height: 16px;}
+.searchOptions {background-image: url("../images/WoltLab Blue Sunrise/searchBackOptions-ltr.png") !important;}
+.searchOptions:focus {background-image: url("../images/WoltLab Blue Sunrise/searchBackOptionsActive-ltr.png") !important;}
+.galleryPhotoEdit img, .galleryAlbumCover img {-webkit-box-shadow: 0 3px 7px #666; -moz-box-shadow: 0 3px 7px #666;}
+.galleryIndex li.floatedElement .thumbnail img, .squared .thumbnail img {-webkit-box-shadow: 0 1px 3px #666; -moz-box-shadow: 0 1px 3px #666;}
+.galleryIndex li.floatedElement:hover, .avatarSelect li label:hover {-webkit-box-shadow: 0 1px 3px #999; -moz-box-shadow: 0 1px 3px #999;}
+.galleryPhoto img {-webkit-box-shadow: 0 3px 7px #666; -moz-box-shadow: 0 3px 7px #666; margin: 10px;}
+.imageViewerCurrentImage {-webkit-box-shadow: 0 3px 23px #000; -moz-box-shadow: 0 3px 23px #000;}
index 12ea8e0f34877f3d23541435468f1357c6a24610..5205311afb0ee9794342c60d27fd3547ba34eb16 100644 (file)
@@ -1,48 +1,48 @@
-/* http://meyerweb.com/eric/tools/css/reset/ \r
-   v2.0 | 20110126\r
-   License: none (public domain)\r
-*/\r
-\r
-html, body, div, span, applet, object, iframe,\r
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,\r
-a, abbr, acronym, address, big, cite, code,\r
-del, dfn, em, img, ins, kbd, q, s, samp,\r
-small, strike, strong, sub, sup, tt, var,\r
-b, u, i, center,\r
-dl, dt, dd, ol, ul, li,\r
-fieldset, form, label, legend,\r
-table, caption, tbody, tfoot, thead, tr, th, td,\r
-article, aside, canvas, details, embed, \r
-figure, figcaption, footer, header, hgroup, \r
-menu, nav, output, ruby, section, summary,\r
-time, mark, audio, video {\r
-       margin: 0;\r
-       padding: 0;\r
-       border: 0;\r
-       font-size: 100%;\r
-       font: inherit;\r
-       /* vertical-align: baseline; disabled by WoltLab, does not fit our needs */\r
-}\r
-/* HTML5 display-role reset for older browsers */\r
-article, aside, details, figcaption, figure, \r
-footer, header, hgroup, menu, nav, section {\r
-       display: block;\r
-}\r
-body {\r
-       line-height: 1;\r
-}\r
-ol, ul {\r
-       list-style: none;\r
-}\r
-blockquote, q {\r
-       quotes: none;\r
-}\r
-blockquote:before, blockquote:after,\r
-q:before, q:after {\r
-       content: '';\r
-       content: none;\r
-}\r
-table {\r
-       border-collapse: collapse;\r
-       border-spacing: 0;\r
+/* http://meyerweb.com/eric/tools/css/reset/ 
+   v2.0 | 20110126
+   License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed, 
+figure, figcaption, footer, header, hgroup, 
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       font-size: 100%;
+       font: inherit;
+       /* vertical-align: baseline; disabled by WoltLab, does not fit our needs */
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure, 
+footer, header, hgroup, menu, nav, section {
+       display: block;
+}
+body {
+       line-height: 1;
+}
+ol, ul {
+       list-style: none;
+}
+blockquote, q {
+       quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+       content: '';
+       content: none;
+}
+table {
+       border-collapse: collapse;
+       border-spacing: 0;
 }
\ No newline at end of file
index 24bc396a82e861bab77e7c1cb03324e32154de04..7ba0aa82fee76e6c11cd738d2ac1cfc466b2e90e 100644 (file)
-/**\r
- * ACP Testing Styles  \r
- *\r
- * @author             Harald Szekely, Alexander Ebert, Marcel Werk \r
- * @copyright  2011 WoltLab GmbH \r
- */\r
-\r
-\r
-\r
-/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */\r
-\r
-* {\r
-       text-overflow: ellipsis;\r
-}\r
-\r
-body {\r
-       font-family: 'Trebuchet MS', Arial, sans-serif;\r
-       font-size: .8em;\r
-       \r
-       background-color: #29374a;\r
-}\r
-\r
-img {\r
-       vertical-align: middle !important;\r
-}\r
-\r
-a {\r
-       color: #369;\r
-       text-decoration: none;\r
-       \r
-       -webkit-transition: color .1s linear;\r
-       -moz-transition: color .1s linear;\r
-       -ms-transition: color .1s linear;\r
-       -o-transition: color .1s linear;\r
-       transition: color .1s linear;\r
-}\r
-\r
-a:hover {\r
-       color: #036;\r
-       text-decoration: underline;\r
-}\r
-\r
-section#content a {\r
-       color: #999;\r
-}\r
-\r
-section#content a:hover {\r
-       color: #333;\r
-}\r
-\r
-.invisible {\r
-       position: absolute;\r
-       left: -9000px;\r
-       top: -9000px;\r
-}\r
-\r
-hr {\r
-       display: none;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Header -- -- -- -- -- */\r
-\r
-header.pageHeader {\r
-       /*\r
-       background-image: url("../images/header.png");\r
-       background-position: left top;\r
-       background-repeat: repeat-x;\r
-       */\r
-       min-width: 800px;\r
-       width: 100%;\r
-}\r
-\r
-/* Top Menu */\r
-\r
-header.pageHeader nav.topMenu {\r
-       position: absolute;\r
-       top: 0;\r
-       right: 0;\r
-       left: 0;\r
-       min-height: 25px;\r
-       z-index: 10;\r
-       background-color: rgba(0, 0, 0, .4);\r
-       \r
-       -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
-       -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
-       -ms-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
-       -o-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
-       box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
-}\r
-\r
-header.pageHeader nav.topMenu > div {\r
-       padding: 5px 23px 3px;\r
-       \r
-}\r
-\r
-header.pageHeader nav.topMenu ul {\r
-       \r
-}\r
-\r
-header.pageHeader nav.topMenu ul li, header.pageHeader nav.topMenu ul li a {\r
-       color: #69c;\r
-       text-shadow: 0 -1px 0 #000;\r
-}\r
-\r
-header.pageHeader nav.topMenu ul li a:hover {\r
-       color: #fff;\r
-}\r
-\r
-/* Logo */\r
-\r
-header.pageHeader div#logo {\r
-       position: relative;\r
-       z-index: 1;\r
-       margin: 0 23px 0;\r
-}\r
-\r
-header.pageHeader div#logo h1 {\r
-       color: #d8e7f5;\r
-       text-shadow: 0 -1px 0 #000;\r
-       font-size: 150%;\r
-       position: relative;\r
-       top: 70px;\r
-}\r
-\r
-header.pageHeader div#logo a:hover {\r
-       color: #d8e7f5;\r
-       text-decoration: none !important;\r
-}\r
-\r
-header.pageHeader div#logo img {\r
-       position: absolute;\r
-       left: 0;\r
-       bottom: 10px;\r
-}\r
-\r
-header.pageHeader div#logo a {\r
-       display: block;\r
-       height: 110px;\r
-       text-align: right;\r
-}\r
-\r
-/* Main Menu  */\r
-\r
-nav.mainMenu {\r
-       margin: 0 30px;\r
-       background-color: rgba(0, 0, 0, .4);\r
-       border-radius: 5px 5px 0 0;\r
-       display: table;\r
-       position: relative;\r
-       bottom: -5px;\r
-}\r
-\r
-nav.mainMenu:after {\r
-       content: "";\r
-       display: block;\r
-       clear: both;\r
-}\r
-\r
-nav.mainMenu ul {\r
-       display: table-row;\r
-}\r
-\r
-nav.mainMenu li {\r
-       font-size: 123%;\r
-       font-weight: normal;\r
-       color: #69c;\r
-       text-shadow: 0 -1px 0 #000;\r
-       cursor: pointer;\r
-       display: table-cell;\r
-       margin: 5px -5px 0;\r
-       padding: 13px 20px;\r
-       position: relative;\r
-       top: -3px;\r
-       z-index: 1;\r
-       \r
-       border-top-left-radius: 5px;\r
-       border-top-right-radius: 5px;\r
-       \r
-       -webkit-transition: all .2s linear;\r
-       -moz-transition: all .2s linear;\r
-       -ms-transition: all .2s linear;\r
-       -o-transition: all .2s linear;\r
-       transition: all .2s linear;\r
-}\r
-\r
-nav.mainMenu li:hover {\r
-       color: #fff;\r
-}\r
-\r
-nav.mainMenu li.activeMenuItem {\r
-       font-weight: bold;\r
-       color: #369;\r
-       text-shadow: 0 1px 0 #fff;\r
-       z-index: 10;\r
-       \r
-       background-color: #e7f2fd;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#e7f2fd));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #fff, #e7f2fd);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#e7f2fd));\r
-       background-image: -o-linear-gradient(#fff, #e7f2fd);\r
-       background-image: linear-gradient(#fff, #e7f2fd);\r
-       \r
-}\r
-\r
-/* Header Navigation  */\r
-\r
-nav.headerNavigation {\r
-       display: block;\r
-       background-color: #e7f2fd;\r
-       border-bottom: 1px solid #bcd;\r
-       \r
-       border-top-left-radius: 3px;\r
-       border-top-right-radius: 3px;\r
-       \r
-       margin: 0 23px;\r
-       padding: 3px 7px;\r
-       position: relative;\r
-}\r
-\r
-nav.headerNavigation:after {\r
-       content: "";\r
-       display: block;\r
-       clear: both;\r
-}\r
-\r
-nav.headerNavigation ul {\r
-       display: block;\r
-}\r
-\r
-nav.headerNavigation ul li {\r
-       float: right;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Main -- -- -- -- -- */\r
-\r
-div.main {\r
-       margin: 0 23px 0;\r
-       border-collapse: collapse;\r
-       display: table;\r
-       table-layout: fixed;\r
-}\r
-\r
-div.main > div {\r
-       display: table-row;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Content -- -- -- -- -- */\r
-\r
-section#content {\r
-       background-color: #fff;\r
-       \r
-       display: table-cell;\r
-       padding: 25px;\r
-       width: 100%;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Sidebar -- -- -- -- -- */\r
-\r
-aside.sidebar {\r
-       display: table-cell;\r
-       background-color: #d8e7f5;\r
-       margin: 0 !important;\r
-       padding: 0 !important;\r
-}\r
-\r
-/* Sidebar Menu */\r
-\r
-nav.sidebarMenu {\r
-       white-space: nowrap;\r
-       padding-bottom: 20px;\r
-}\r
-\r
-nav.sidebarMenu > div {\r
-       position: relative;\r
-       color: #69c;\r
-       text-shadow: 0 1px 0 #fff;\r
-}\r
-\r
-nav.sidebarMenu > div a {\r
-       color: #69c;\r
-       text-shadow: 0 1px 0 #fff;\r
-}\r
-\r
-nav.sidebarMenu > div a:hover {\r
-       color: #369;\r
-       text-decoration: none !important;\r
-}\r
-\r
-nav.sidebarMenu > div h1 {\r
-       background-image: url("../../icon/arrowRightS.png");\r
-       background-position: 15px center;\r
-       background-repeat: no-repeat;\r
-       color: #369;\r
-       cursor: pointer;\r
-       font-size: 130%;\r
-       font-weight: bold;\r
-       margin-top: 5px;\r
-       padding: 7px 25px 7px 35px;\r
-       position: relative;\r
-}\r
-\r
-nav.sidebarMenu > div h1.activeMenuItem {\r
-       background-image: url("../../icon/arrowDownS.png");\r
-}\r
-\r
-nav.sidebarMenu > div ul li {\r
-       font-size: 110%;\r
-       padding: 5px 25px 7px 35px;\r
-}\r
-\r
-nav.sidebarMenu > div ul li.activeMenuItem {\r
-       background-color: #fff;\r
-}\r
-\r
-nav.sidebarMenu > div ul li.activeMenuItem a {\r
-       color: #369;\r
-       font-weight: bold;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Footer -- -- -- -- --  */\r
-\r
-footer {\r
-       clear: both;\r
-       padding: 0 23px;\r
-       position: relative;\r
-       text-align: center;\r
-}\r
-\r
-footer:after {\r
-       content: "";\r
-       display: block;\r
-       clear: both;\r
-}\r
-\r
-footer > div {\r
-       background-color: #e7f2fd;\r
-       border-top: 1px solid #bcd;\r
-       \r
-       border-bottom-left-radius: 3px;\r
-       border-bottom-right-radius: 3px;\r
-       \r
-       clear: both;\r
-       padding: 3px 7px;\r
-}\r
-\r
-footer > div:after {\r
-       content: "";\r
-       display: block;\r
-       clear: both;\r
-}\r
-\r
-footer p.copyright {\r
-       padding-top: 20px;\r
-       min-height: 40px;\r
-}\r
-\r
-footer p.copyright a {\r
-       text-shadow: 0 -1px 0 #000;\r
-}\r
-\r
-footer p.copyright a:hover {\r
-       color: #69c;\r
-       text-decoration: none;\r
-}\r
-\r
-/* Footer Navigation */\r
-\r
-footer nav.footerNavigation {\r
-       \r
-}\r
-\r
-footer nav.footerNavigation ul li {\r
-       display: inline-block;\r
-       float: right;\r
-}\r
-\r
-\r
-\r
-div.wcfDimensions {\r
-       display: inline-block;\r
-}\r
-\r
-div.overlayLoading {\r
-       background-color: #fff;\r
-       background-image: url("../../images/spinner.gif");\r
-       background-position: center center;\r
-       background-repeat: no-repeat;\r
-}\r
-\r
-div.ui-dialog {\r
-       border: 10px solid rgba(0,0,0,.2);\r
-       border-radius: 15px;\r
-       display: inline-block !important;\r
-       width: auto !important;\r
-       min-width: 80px;\r
-}\r
-\r
-div.ui-dialog-content p {\r
-       background-color: #fff;\r
-       padding: 7px;\r
-}\r
-\r
-div.ui-dialog-titlebar {\r
-       background-color: #ccc;\r
-       border-bottom: 5px solid rgba(0,0,0,.6);\r
-       padding: 7px;\r
-       position: relative;\r
-}\r
-\r
-span.ui-dialog-title {\r
-       color: #fff;\r
-       text-shadow: 5px 0 0 #000;\r
-}\r
-\r
-a.ui-dialog-titlebar-close {\r
-       background-image: url("../../icon/deleteM.png");\r
-       background-position: top left;\r
-       background-repeat: no-repeat;\r
-       height: 24px;\r
-       position: absolute !important;\r
-       right: -16px;\r
-       top: -16px;\r
-       width: 24px;\r
-}\r
-\r
-a.ui-dialog-titlebar-close span {\r
-       display: none;\r
-       visibility: hidden;\r
-}\r
-\r
-div.ui-widget-overlay {\r
-       background-color: #000;\r
-       left: 0;\r
-       opacity: .6;\r
-       position: fixed;\r
-       top: 0;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Headings -- -- -- -- -- */\r
-\r
-/* Main Heading */\r
-\r
-.mainHeading {\r
-       margin-bottom: 15px;\r
-       position: relative;\r
-}\r
-\r
-.mainHeading img {\r
-       position: absolute;\r
-       top: 0;\r
-       left: 0;\r
-       width: 48px;\r
-       height: 48px;\r
-}\r
-\r
-.mainHeading > hgroup {\r
-       height: 48px;\r
-       padding-left: 60px;\r
-       vertical-align: middle;\r
-}\r
-\r
-.mainHeading > hgroup h1 {\r
-       border-bottom: 1px solid #999;\r
-       color: #999;\r
-       text-shadow: 0 1px 0 #fff;\r
-       font-size: 140%;\r
-       font-weight: bold;\r
-       padding-bottom: 10px;\r
-}\r
-\r
-.mainHeading > hgroup p {\r
-       padding-top: 3px;\r
-} \r
-\r
-/* Sub Heading */\r
-\r
-.subHeading {\r
-       border-bottom: 1px solid #999;\r
-       font-size: 120%;\r
-       text-shadow: 0 1px 0 #fff;\r
-       margin: 14px 0 14px;\r
-       padding: 15px;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Fieldsets -- -- -- -- -- */\r
-\r
-fieldset {\r
-       border: 1px solid #ccc;\r
-       border-radius: 10px;\r
-       margin: 7px 0 7px;\r
-       padding: 14px;\r
-}\r
-\r
-fieldset legend {\r
-       color: #999;\r
-       padding: 0 7px 0;\r
-}\r
-\r
-fieldset p.description {\r
-       color: #369;\r
-       font-size: 90%;\r
-}\r
-\r
-fieldset > ul {\r
-       margin: 7px 0 21px 21px;\r
-}\r
-\r
-fieldset > ul li {\r
-       list-style-type: circle;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Forms -- -- -- -- -- */\r
-\r
-/* Structure */\r
-\r
-div.formElement {\r
-       clear: both;\r
-       margin-bottom: 14px;\r
-}\r
-\r
-div.formFieldLabel {\r
-       float: left;\r
-       text-align: right;\r
-       width: 230px;\r
-}\r
-\r
-div.formField {\r
-       margin-left: 250px;\r
-}\r
-\r
-div.formFieldDesc {\r
-       color: #777;\r
-       font-size: 90%;\r
-       margin: 3px 0 7px 250px;\r
-}\r
-\r
-div.formGroupLabel label {\r
-       display: none;\r
-}\r
-\r
-div.formGroupField div.formField label {\r
-       display: block;\r
-}\r
-\r
-/* Form Elements */\r
-\r
-input {\r
-       border: 1px solid #ccc;\r
-}\r
-\r
-input:hover {\r
-       border: 1px solid #369;\r
-}\r
-\r
-\r
-\r
-\r
-.border {\r
-       border: 1px solid #ccc;\r
-       border-radius: 5px;\r
-       margin: 14px 0 14px;\r
-}\r
-\r
-.borderMarginRemove {\r
-       border-radius: 0 0 5px 5px;\r
-       margin-top: 0;\r
-}\r
-\r
-.titleBarPanel {\r
-       background-color: #eee;\r
-       border-radius: 5px 5px 0 0;\r
-       border-bottom-width: 0;\r
-       margin-bottom: 0;\r
-       padding: 7px;\r
-}\r
-\r
-.tabMenuContent,\r
-.content {\r
-       border-width: 0 !important;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Tables -- -- -- -- -- */\r
-\r
-table {\r
-       border-radius: 0 0 5px 5px;\r
-       width: 100% !important;\r
-}\r
-\r
-th {\r
-       background-color: #fefefe;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
-       background-image: -o-linear-gradient(#fefefe, #eee);\r
-       background-image: linear-gradient(#fefefe, #eee);\r
-       \r
-       border-right: 1px solid #fff;\r
-       border-bottom: 1px solid #fff;\r
-       padding: 7px;\r
-}\r
-\r
-th.active {\r
-       background-color: #faebd7;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#faebd7), to(#fa0));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #faebd7, #fa0);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#faebd7), to(#fa0));\r
-       background-image: -o-linear-gradient(#faebd7, #fa0);\r
-       background-image: linear-gradient(#faebd7, #fa0);\r
-}\r
-\r
-th.active:hover {\r
-       background-color: #fa0;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fa0), to(#faebd7));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #fa0, #faebd7);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fa0), to(#faebd7));\r
-       background-image: -o-linear-gradient(#fa0, #faebd7);\r
-       background-image: linear-gradient(#fa0, #faebd7);\r
-}\r
-\r
-th:hover {\r
-       background-color: #fefefe;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
-       background-image: -o-linear-gradient(#eee, #fefefe);\r
-       background-image: linear-gradient(#eee, #fefefe);\r
-}\r
-\r
-th:last-child {\r
-       border-right-width: 0;\r
-}\r
-\r
-th {\r
-       font-size: 85%;\r
-}\r
-\r
-th a {\r
-       color: #999;\r
-       display: block;\r
-       text-decoration: none;\r
-}\r
-\r
-th a:hover {\r
-       color: #333 !important;\r
-       text-shadow: 0 1px 0 #fff;\r
-       text-decoration: none !important;\r
-}\r
-\r
-td {\r
-       border-right: 1px solid #fff;\r
-       padding: 5px;\r
-}\r
-\r
-td:last-child {\r
-       border-right-width: 0;\r
-}\r
-\r
-tbody tr {\r
-       border-bottom: 1px solid #fff;\r
-}\r
-\r
-tbody tr:last-child {\r
-       border-bottom-width: 0;\r
-}\r
-\r
-tr.container-1:hover td,\r
-tr.container-2:hover td {\r
-       background-color: #ddd;\r
-}\r
-\r
-tr.container-1 td {\r
-       background-color: #fefefe;\r
-}\r
-\r
-tr.container-2 td {\r
-       background-color: #eee;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Page Navigation -- -- -- -- -- */\r
-\r
-.pageNavigation ul li {\r
-       display: inline-block;\r
-}\r
-\r
-.pageNavigation ul li:not(.skip) {\r
-       background-color: #eee;\r
-       border: 1px solid #ccc;\r
-       padding: 3px;\r
-}\r
-\r
-.pageNavigation ul li.active,\r
-.pageNavigation ul li:not(.skip):hover {\r
-       background-color: #faebd7;\r
-       border-color: #f80;\r
-       color: #f80;\r
-}\r
-\r
-.pageNavigation ul li a {\r
-       text-decoration: none;\r
-}\r
-\r
-.pageNavigation ul li:not(.skip):hover a {\r
-       color: #f80;\r
-}\r
-\r
-.pageNavigation ul li.skip {\r
-       vertical-align: middle;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Large Buttons -- -- -- -- -- */\r
-\r
-nav.largeButtons {\r
-       text-align: right;\r
-}\r
-\r
-nav.largeButtons ul li {\r
-       display: inline;\r
-}\r
-\r
-input[type='reset'],\r
-input[type='submit'],\r
-nav.largeButtons ul li a {\r
-       background-color: #fefefe;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
-       background-image: -o-linear-gradient(#fefefe, #eee);\r
-       background-image: linear-gradient(#fefefe, #eee);\r
-       \r
-       border: 1px solid #ccc;\r
-       border-radius: 30px;\r
-       display: inline-block;\r
-       padding: 5px 13px;\r
-}\r
-\r
-input[type='reset']:hover,\r
-input[type='submit']:hover,\r
-nav.largeButtons ul li a:hover {\r
-       background-color: #fefefe;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
-       background-image: -o-linear-gradient(#eee, #fefefe);\r
-       background-image: linear-gradient(#eee, #fefefe);\r
-       \r
-       text-decoration: none;\r
-}\r
-\r
-nav.largeButtons ul li a img {\r
-       vertical-align: middle;\r
-}\r
-\r
-.formSubmit {\r
-       text-align: center;\r
-}\r
-\r
-input[type='reset'],\r
-input[type='submit'] {\r
-       cursor: pointer;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-div#packageInstallationDialogContainer {\r
-       background-color: #fefefe;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
-       background-image: -o-linear-gradient(#fefefe, #eee);\r
-       background-image: linear-gradient(#fefefe, #eee);\r
-       \r
-       height: 100%;\r
-       max-width: 600px;\r
-       padding: 21px;\r
-}\r
-\r
-div#ajaxExceptionStacktrace {\r
-       overflow: scroll;\r
-       overflow-y: hidden;\r
-       white-space: nowrap;\r
-}\r
-\r
-div#packageInstallationInnerContentContainer {\r
-       border-top: 2px solid #999 !important;\r
-       border-radius: 0 !important;\r
-       margin-top: 21px;\r
-       padding-top: 14px;\r
-}\r
-\r
-div#packageInstallationInnerContent p.error {\r
-       background-color: #fdd;\r
-       border: 3px solid #ed1c24;\r
-       border-radius: 5px;\r
-       margin-bottom: 14px;\r
-       padding: 7px;\r
-}\r
-\r
-div#ajaxExceptionStacktrace {\r
-       border: 1px solid #ccc;\r
-       font-family: monospace;\r
-       font-size: 90%;\r
-       line-height: 1.2em;\r
-       padding: 3px;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- System Notifications -- -- -- -- -- */\r
-\r
-p.info,\r
-p.error,\r
-p.success,\r
-p.warning {\r
-       border-radius: 7px;\r
-       margin-bottom: 14px;\r
-       padding: 7px 14px;\r
-}\r
-\r
-p.info {\r
-       background-color: #def;\r
-       border: 1px solid #06f;\r
-}\r
-\r
-p.success {\r
-       background-color: #efe;\r
-       border: 1px solid #090;\r
-}\r
-\r
-p.error {\r
-       background-color: #fee;\r
-       border: 1px solid #c00;\r
-}\r
-\r
-p.warning {\r
-       background-color: #ffd;\r
-       border: 1px solid #660;\r
-}\r
-\r
-\r
-\r
-\r
-#actionProxyLoading {\r
-       background-color: #faebd7;\r
-       border: 1px solid #f80;\r
-       border-top-width: 0;\r
-       border-radius: 0 0 5px 5px;\r
-       left: 43%;\r
-       padding: 7px 21px 7px;\r
-       position: fixed;\r
-       top: 0;\r
-}\r
-\r
-fieldset legend ~ p {\r
-       margin-bottom: 14px;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Tabbed Content -- -- -- -- -- */\r
-\r
-dl {\r
-       clear: both;\r
-       margin-bottom: 7px;\r
-}\r
-\r
-dt { /* is op */\r
-       float: left;\r
-       text-align: right;\r
-       width: 230px;\r
-}\r
-\r
-dd {\r
-       margin-left: 250px;\r
-}\r
-\r
-dl dd ~ p {\r
-       color: #777;\r
-       font-size: 90%;\r
-       margin: 3px 0 7px 250px;\r
-}\r
-\r
-dl.disabled dt {\r
-       color: #777;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Taken from jQuery UI @ themes/base/jquery.ui.tabs.css -- -- -- -- -- */\r
-\r
-.ui-tabs {\r
-       position: relative; /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */\r
-       padding: 3px;\r
-       zoom: 1;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav {\r
-       height: 18px !important; /* Fixes a clearing problem */\r
-       margin: 0 3px;\r
-       background-color: none;\r
-       padding: 3px 3px 0;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li {\r
-       list-style: none;\r
-       float: left;\r
-       position: relative;\r
-       top: 1px;\r
-       margin: 0 3px 1px 0;\r
-       border-bottom: 0 !important;\r
-       padding: 0;\r
-       white-space: nowrap;\r
-       z-index: 90; /* Prevents border overlay during transition */\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li a {\r
-       background-color: #fefefe;\r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
-       background-image: -o-linear-gradient(#fefefe, #eee);\r
-       background-image: linear-gradient(#fefefe, #eee);\r
-       \r
-       border: 1px solid #ccc;\r
-       border-bottom-width: 0;\r
-\r
-       border-top-left-radius: 3px;\r
-       border-top-right-radius: 3px;\r
-       \r
-       float: left;\r
-       padding: 7px 14px;\r
-       text-decoration: none;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected {\r
-       margin-bottom: 0;\r
-       padding-bottom: 1px;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a {\r
-       background-color: #fefefe;      \r
-       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
-       background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);\r
-       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
-       background-image: -o-linear-gradient(#eee, #fefefe);\r
-       background-image: linear-gradient(#eee, #fefefe);\r
-       \r
-       border-bottom: 1px solid #fefefe;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,\r
-.ui-tabs .ui-tabs-nav li.ui-state-disabled a,\r
-.ui-tabs .ui-tabs-nav li.ui-state-processing a {\r
-       cursor: default;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li a,\r
-.ui-tabs .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a {\r
-       cursor: pointer;\r
-}\r
-\r
-.ui-tabs .ui-tabs-panel {\r
-       background-color: #fefefe;\r
-       border: 1px solid #ccc !important;\r
-       z-index: 89; /* Prevents border overlay during transition */\r
-       display: block;\r
-       padding: 14px 21px;\r
-}\r
-\r
-.ui-tabs .ui-tabs-hide {\r
-       display: none !important;\r
-}\r
-\r
-.ui-helper-hidden {\r
-       display: none;\r
-}\r
-\r
-.ui-helper-hidden-accessible {\r
-       position: absolute !important;\r
-       clip: rect(1px 1px 1px 1px);\r
-       clip: rect(1px,1px,1px,1px);\r
-}\r
-\r
-.ui-helper-reset {\r
-       margin: 0;\r
-       padding: 0;\r
-       border: 0;\r
-       outline: 0;\r
-       line-height: 1.3;\r
-       text-decoration: none;\r
-       font-size: 100%;\r
-       list-style: none;\r
-}\r
-\r
-.ui-helper-clearfix:after {\r
-       content: "";\r
-       display: block;\r
-       height: 0;\r
-       clear: both;\r
-}\r
-\r
-.ui-helper-clearfix {\r
-       display: inline-block;\r
-}\r
-\r
-/* Required comment for clearfix to work in Opera \*/\r
-* html .ui-helper-clearfix {\r
-       height: 1%;\r
-}\r
-\r
-.ui-helper-clearfix {\r
-       display: block;\r
-}\r
-\r
-/* end clearfix */\r
-.ui-helper-zfix {\r
-       width: 100%;\r
-       height: 100%;\r
-       top: 0;\r
-       left: 0;\r
-       position: absolute;\r
-       opacity: 0;\r
-       filter: Alpha(opacity=0);}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * ACP Testing Styles  
+ *
+ * @author             Harald Szekely, Alexander Ebert, Marcel Werk 
+ * @copyright  2011 WoltLab GmbH 
+ */
+
+
+
+/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */
+
+* {
+       text-overflow: ellipsis;
+}
+
+body {
+       font-family: 'Trebuchet MS', Arial, sans-serif;
+       font-size: .8em;
+       
+       background-color: #29374a;
+}
+
+img {
+       vertical-align: middle !important;
+}
+
+a {
+       color: #369;
+       text-decoration: none;
+       
+       -webkit-transition: color .1s linear;
+       -moz-transition: color .1s linear;
+       -ms-transition: color .1s linear;
+       -o-transition: color .1s linear;
+       transition: color .1s linear;
+}
+
+a:hover {
+       color: #036;
+       text-decoration: underline;
+}
+
+section#content a {
+       color: #999;
+}
+
+section#content a:hover {
+       color: #333;
+}
+
+.invisible {
+       position: absolute;
+       left: -9000px;
+       top: -9000px;
+}
+
+hr {
+       display: none;
+}
+
+
+
+/* -- -- -- -- -- Header -- -- -- -- -- */
+
+header.pageHeader {
+       /*
+       background-image: url("../images/header.png");
+       background-position: left top;
+       background-repeat: repeat-x;
+       */
+       min-width: 800px;
+       width: 100%;
+}
+
+/* Top Menu */
+
+header.pageHeader nav.topMenu {
+       position: absolute;
+       top: 0;
+       right: 0;
+       left: 0;
+       min-height: 25px;
+       z-index: 10;
+       background-color: rgba(0, 0, 0, .4);
+       
+       -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+       -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+       -ms-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+       -o-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+       box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+}
+
+header.pageHeader nav.topMenu > div {
+       padding: 5px 23px 3px;
+       
+}
+
+header.pageHeader nav.topMenu ul {
+       
+}
+
+header.pageHeader nav.topMenu ul li, header.pageHeader nav.topMenu ul li a {
+       color: #69c;
+       text-shadow: 0 -1px 0 #000;
+}
+
+header.pageHeader nav.topMenu ul li a:hover {
+       color: #fff;
+}
+
+/* Logo */
+
+header.pageHeader div#logo {
+       position: relative;
+       z-index: 1;
+       margin: 0 23px 0;
+}
+
+header.pageHeader div#logo h1 {
+       color: #d8e7f5;
+       text-shadow: 0 -1px 0 #000;
+       font-size: 150%;
+       position: relative;
+       top: 70px;
+}
+
+header.pageHeader div#logo a:hover {
+       color: #d8e7f5;
+       text-decoration: none !important;
+}
+
+header.pageHeader div#logo img {
+       position: absolute;
+       left: 0;
+       bottom: 10px;
+}
+
+header.pageHeader div#logo a {
+       display: block;
+       height: 110px;
+       text-align: right;
+}
+
+/* Main Menu  */
+
+nav.mainMenu {
+       margin: 0 30px;
+       background-color: rgba(0, 0, 0, .4);
+       border-radius: 5px 5px 0 0;
+       display: table;
+       position: relative;
+       bottom: -5px;
+}
+
+nav.mainMenu:after {
+       content: "";
+       display: block;
+       clear: both;
+}
+
+nav.mainMenu ul {
+       display: table-row;
+}
+
+nav.mainMenu li {
+       font-size: 123%;
+       font-weight: normal;
+       color: #69c;
+       text-shadow: 0 -1px 0 #000;
+       cursor: pointer;
+       display: table-cell;
+       margin: 5px -5px 0;
+       padding: 13px 20px;
+       position: relative;
+       top: -3px;
+       z-index: 1;
+       
+       border-top-left-radius: 5px;
+       border-top-right-radius: 5px;
+       
+       -webkit-transition: all .2s linear;
+       -moz-transition: all .2s linear;
+       -ms-transition: all .2s linear;
+       -o-transition: all .2s linear;
+       transition: all .2s linear;
+}
+
+nav.mainMenu li:hover {
+       color: #fff;
+}
+
+nav.mainMenu li.activeMenuItem {
+       font-weight: bold;
+       color: #369;
+       text-shadow: 0 1px 0 #fff;
+       z-index: 10;
+       
+       background-color: #e7f2fd;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#e7f2fd));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #fff, #e7f2fd);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#e7f2fd));
+       background-image: -o-linear-gradient(#fff, #e7f2fd);
+       background-image: linear-gradient(#fff, #e7f2fd);
+       
+}
+
+/* Header Navigation  */
+
+nav.headerNavigation {
+       display: block;
+       background-color: #e7f2fd;
+       border-bottom: 1px solid #bcd;
+       
+       border-top-left-radius: 3px;
+       border-top-right-radius: 3px;
+       
+       margin: 0 23px;
+       padding: 3px 7px;
+       position: relative;
+}
+
+nav.headerNavigation:after {
+       content: "";
+       display: block;
+       clear: both;
+}
+
+nav.headerNavigation ul {
+       display: block;
+}
+
+nav.headerNavigation ul li {
+       float: right;
+}
+
+
+
+/* -- -- -- -- -- Main -- -- -- -- -- */
+
+div.main {
+       margin: 0 23px 0;
+       border-collapse: collapse;
+       display: table;
+       table-layout: fixed;
+}
+
+div.main > div {
+       display: table-row;
+}
+
+
+
+/* -- -- -- -- -- Content -- -- -- -- -- */
+
+section#content {
+       background-color: #fff;
+       
+       display: table-cell;
+       padding: 25px;
+       width: 100%;
+}
+
+
+
+/* -- -- -- -- -- Sidebar -- -- -- -- -- */
+
+aside.sidebar {
+       display: table-cell;
+       background-color: #d8e7f5;
+       margin: 0 !important;
+       padding: 0 !important;
+}
+
+/* Sidebar Menu */
+
+nav.sidebarMenu {
+       white-space: nowrap;
+       padding-bottom: 20px;
+}
+
+nav.sidebarMenu > div {
+       position: relative;
+       color: #69c;
+       text-shadow: 0 1px 0 #fff;
+}
+
+nav.sidebarMenu > div a {
+       color: #69c;
+       text-shadow: 0 1px 0 #fff;
+}
+
+nav.sidebarMenu > div a:hover {
+       color: #369;
+       text-decoration: none !important;
+}
+
+nav.sidebarMenu > div h1 {
+       background-image: url("../../icon/arrowRightS.png");
+       background-position: 15px center;
+       background-repeat: no-repeat;
+       color: #369;
+       cursor: pointer;
+       font-size: 130%;
+       font-weight: bold;
+       margin-top: 5px;
+       padding: 7px 25px 7px 35px;
+       position: relative;
+}
+
+nav.sidebarMenu > div h1.activeMenuItem {
+       background-image: url("../../icon/arrowDownS.png");
+}
+
+nav.sidebarMenu > div ul li {
+       font-size: 110%;
+       padding: 5px 25px 7px 35px;
+}
+
+nav.sidebarMenu > div ul li.activeMenuItem {
+       background-color: #fff;
+}
+
+nav.sidebarMenu > div ul li.activeMenuItem a {
+       color: #369;
+       font-weight: bold;
+}
+
+
+
+/* -- -- -- -- -- Footer -- -- -- -- --  */
+
+footer {
+       clear: both;
+       padding: 0 23px;
+       position: relative;
+       text-align: center;
+}
+
+footer:after {
+       content: "";
+       display: block;
+       clear: both;
+}
+
+footer > div {
+       background-color: #e7f2fd;
+       border-top: 1px solid #bcd;
+       
+       border-bottom-left-radius: 3px;
+       border-bottom-right-radius: 3px;
+       
+       clear: both;
+       padding: 3px 7px;
+}
+
+footer > div:after {
+       content: "";
+       display: block;
+       clear: both;
+}
+
+footer p.copyright {
+       padding-top: 20px;
+       min-height: 40px;
+}
+
+footer p.copyright a {
+       text-shadow: 0 -1px 0 #000;
+}
+
+footer p.copyright a:hover {
+       color: #69c;
+       text-decoration: none;
+}
+
+/* Footer Navigation */
+
+footer nav.footerNavigation {
+       
+}
+
+footer nav.footerNavigation ul li {
+       display: inline-block;
+       float: right;
+}
+
+
+
+div.wcfDimensions {
+       display: inline-block;
+}
+
+div.overlayLoading {
+       background-color: #fff;
+       background-image: url("../../images/spinner.gif");
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+div.ui-dialog {
+       border: 10px solid rgba(0,0,0,.2);
+       border-radius: 15px;
+       display: inline-block !important;
+       width: auto !important;
+       min-width: 80px;
+}
+
+div.ui-dialog-content p {
+       background-color: #fff;
+       padding: 7px;
+}
+
+div.ui-dialog-titlebar {
+       background-color: #ccc;
+       border-bottom: 5px solid rgba(0,0,0,.6);
+       padding: 7px;
+       position: relative;
+}
+
+span.ui-dialog-title {
+       color: #fff;
+       text-shadow: 5px 0 0 #000;
+}
+
+a.ui-dialog-titlebar-close {
+       background-image: url("../../icon/deleteM.png");
+       background-position: top left;
+       background-repeat: no-repeat;
+       height: 24px;
+       position: absolute !important;
+       right: -16px;
+       top: -16px;
+       width: 24px;
+}
+
+a.ui-dialog-titlebar-close span {
+       display: none;
+       visibility: hidden;
+}
+
+div.ui-widget-overlay {
+       background-color: #000;
+       left: 0;
+       opacity: .6;
+       position: fixed;
+       top: 0;
+}
+
+
+
+/* -- -- -- -- -- Headings -- -- -- -- -- */
+
+/* Main Heading */
+
+.mainHeading {
+       margin-bottom: 15px;
+       position: relative;
+}
+
+.mainHeading img {
+       position: absolute;
+       top: 0;
+       left: 0;
+       width: 48px;
+       height: 48px;
+}
+
+.mainHeading > hgroup {
+       height: 48px;
+       padding-left: 60px;
+       vertical-align: middle;
+}
+
+.mainHeading > hgroup h1 {
+       border-bottom: 1px solid #999;
+       color: #999;
+       text-shadow: 0 1px 0 #fff;
+       font-size: 140%;
+       font-weight: bold;
+       padding-bottom: 10px;
+}
+
+.mainHeading > hgroup p {
+       padding-top: 3px;
+} 
+
+/* Sub Heading */
+
+.subHeading {
+       border-bottom: 1px solid #999;
+       font-size: 120%;
+       text-shadow: 0 1px 0 #fff;
+       margin: 14px 0 14px;
+       padding: 15px;
+}
+
+
+
+/* -- -- -- -- -- Fieldsets -- -- -- -- -- */
+
+fieldset {
+       border: 1px solid #ccc;
+       border-radius: 10px;
+       margin: 7px 0 7px;
+       padding: 14px;
+}
+
+fieldset legend {
+       color: #999;
+       padding: 0 7px 0;
+}
+
+fieldset p.description {
+       color: #369;
+       font-size: 90%;
+}
+
+fieldset > ul {
+       margin: 7px 0 21px 21px;
+}
+
+fieldset > ul li {
+       list-style-type: circle;
+}
+
+
+
+/* -- -- -- -- -- Forms -- -- -- -- -- */
+
+/* Structure */
+
+div.formElement {
+       clear: both;
+       margin-bottom: 14px;
+}
+
+div.formFieldLabel {
+       float: left;
+       text-align: right;
+       width: 230px;
+}
+
+div.formField {
+       margin-left: 250px;
+}
+
+div.formFieldDesc {
+       color: #777;
+       font-size: 90%;
+       margin: 3px 0 7px 250px;
+}
+
+div.formGroupLabel label {
+       display: none;
+}
+
+div.formGroupField div.formField label {
+       display: block;
+}
+
+/* Form Elements */
+
+input {
+       border: 1px solid #ccc;
+}
+
+input:hover {
+       border: 1px solid #369;
+}
+
+
+
+
+.border {
+       border: 1px solid #ccc;
+       border-radius: 5px;
+       margin: 14px 0 14px;
+}
+
+.borderMarginRemove {
+       border-radius: 0 0 5px 5px;
+       margin-top: 0;
+}
+
+.titleBarPanel {
+       background-color: #eee;
+       border-radius: 5px 5px 0 0;
+       border-bottom-width: 0;
+       margin-bottom: 0;
+       padding: 7px;
+}
+
+.tabMenuContent,
+.content {
+       border-width: 0 !important;
+}
+
+
+
+/* -- -- -- -- -- Tables -- -- -- -- -- */
+
+table {
+       border-radius: 0 0 5px 5px;
+       width: 100% !important;
+}
+
+th {
+       background-color: #fefefe;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+       background-image: -o-linear-gradient(#fefefe, #eee);
+       background-image: linear-gradient(#fefefe, #eee);
+       
+       border-right: 1px solid #fff;
+       border-bottom: 1px solid #fff;
+       padding: 7px;
+}
+
+th.active {
+       background-color: #faebd7;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#faebd7), to(#fa0));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #faebd7, #fa0);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#faebd7), to(#fa0));
+       background-image: -o-linear-gradient(#faebd7, #fa0);
+       background-image: linear-gradient(#faebd7, #fa0);
+}
+
+th.active:hover {
+       background-color: #fa0;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fa0), to(#faebd7));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #fa0, #faebd7);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fa0), to(#faebd7));
+       background-image: -o-linear-gradient(#fa0, #faebd7);
+       background-image: linear-gradient(#fa0, #faebd7);
+}
+
+th:hover {
+       background-color: #fefefe;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+       background-image: -o-linear-gradient(#eee, #fefefe);
+       background-image: linear-gradient(#eee, #fefefe);
+}
+
+th:last-child {
+       border-right-width: 0;
+}
+
+th {
+       font-size: 85%;
+}
+
+th a {
+       color: #999;
+       display: block;
+       text-decoration: none;
+}
+
+th a:hover {
+       color: #333 !important;
+       text-shadow: 0 1px 0 #fff;
+       text-decoration: none !important;
+}
+
+td {
+       border-right: 1px solid #fff;
+       padding: 5px;
+}
+
+td:last-child {
+       border-right-width: 0;
+}
+
+tbody tr {
+       border-bottom: 1px solid #fff;
+}
+
+tbody tr:last-child {
+       border-bottom-width: 0;
+}
+
+tr.container-1:hover td,
+tr.container-2:hover td {
+       background-color: #ddd;
+}
+
+tr.container-1 td {
+       background-color: #fefefe;
+}
+
+tr.container-2 td {
+       background-color: #eee;
+}
+
+
+
+/* -- -- -- -- -- Page Navigation -- -- -- -- -- */
+
+.pageNavigation ul li {
+       display: inline-block;
+}
+
+.pageNavigation ul li:not(.skip) {
+       background-color: #eee;
+       border: 1px solid #ccc;
+       padding: 3px;
+}
+
+.pageNavigation ul li.active,
+.pageNavigation ul li:not(.skip):hover {
+       background-color: #faebd7;
+       border-color: #f80;
+       color: #f80;
+}
+
+.pageNavigation ul li a {
+       text-decoration: none;
+}
+
+.pageNavigation ul li:not(.skip):hover a {
+       color: #f80;
+}
+
+.pageNavigation ul li.skip {
+       vertical-align: middle;
+}
+
+
+
+/* -- -- -- -- -- Large Buttons -- -- -- -- -- */
+
+nav.largeButtons {
+       text-align: right;
+}
+
+nav.largeButtons ul li {
+       display: inline;
+}
+
+input[type='reset'],
+input[type='submit'],
+nav.largeButtons ul li a {
+       background-color: #fefefe;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+       background-image: -o-linear-gradient(#fefefe, #eee);
+       background-image: linear-gradient(#fefefe, #eee);
+       
+       border: 1px solid #ccc;
+       border-radius: 30px;
+       display: inline-block;
+       padding: 5px 13px;
+}
+
+input[type='reset']:hover,
+input[type='submit']:hover,
+nav.largeButtons ul li a:hover {
+       background-color: #fefefe;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+       background-image: -o-linear-gradient(#eee, #fefefe);
+       background-image: linear-gradient(#eee, #fefefe);
+       
+       text-decoration: none;
+}
+
+nav.largeButtons ul li a img {
+       vertical-align: middle;
+}
+
+.formSubmit {
+       text-align: center;
+}
+
+input[type='reset'],
+input[type='submit'] {
+       cursor: pointer;
+}
+
+
+
+
+
+div#packageInstallationDialogContainer {
+       background-color: #fefefe;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+       background-image: -o-linear-gradient(#fefefe, #eee);
+       background-image: linear-gradient(#fefefe, #eee);
+       
+       height: 100%;
+       max-width: 600px;
+       padding: 21px;
+}
+
+div#ajaxExceptionStacktrace {
+       overflow: scroll;
+       overflow-y: hidden;
+       white-space: nowrap;
+}
+
+div#packageInstallationInnerContentContainer {
+       border-top: 2px solid #999 !important;
+       border-radius: 0 !important;
+       margin-top: 21px;
+       padding-top: 14px;
+}
+
+div#packageInstallationInnerContent p.error {
+       background-color: #fdd;
+       border: 3px solid #ed1c24;
+       border-radius: 5px;
+       margin-bottom: 14px;
+       padding: 7px;
+}
+
+div#ajaxExceptionStacktrace {
+       border: 1px solid #ccc;
+       font-family: monospace;
+       font-size: 90%;
+       line-height: 1.2em;
+       padding: 3px;
+}
+
+
+
+/* -- -- -- -- -- System Notifications -- -- -- -- -- */
+
+p.info,
+p.error,
+p.success,
+p.warning {
+       border-radius: 7px;
+       margin-bottom: 14px;
+       padding: 7px 14px;
+}
+
+p.info {
+       background-color: #def;
+       border: 1px solid #06f;
+}
+
+p.success {
+       background-color: #efe;
+       border: 1px solid #090;
+}
+
+p.error {
+       background-color: #fee;
+       border: 1px solid #c00;
+}
+
+p.warning {
+       background-color: #ffd;
+       border: 1px solid #660;
+}
+
+
+
+
+#actionProxyLoading {
+       background-color: #faebd7;
+       border: 1px solid #f80;
+       border-top-width: 0;
+       border-radius: 0 0 5px 5px;
+       left: 43%;
+       padding: 7px 21px 7px;
+       position: fixed;
+       top: 0;
+}
+
+fieldset legend ~ p {
+       margin-bottom: 14px;
+}
+
+
+
+/* -- -- -- -- -- Tabbed Content -- -- -- -- -- */
+
+dl {
+       clear: both;
+       margin-bottom: 7px;
+}
+
+dt { /* is op */
+       float: left;
+       text-align: right;
+       width: 230px;
+}
+
+dd {
+       margin-left: 250px;
+}
+
+dl dd ~ p {
+       color: #777;
+       font-size: 90%;
+       margin: 3px 0 7px 250px;
+}
+
+dl.disabled dt {
+       color: #777;
+}
+
+
+
+/* -- -- -- -- -- Taken from jQuery UI @ themes/base/jquery.ui.tabs.css -- -- -- -- -- */
+
+.ui-tabs {
+       position: relative; /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+       padding: 3px;
+       zoom: 1;
+}
+
+.ui-tabs .ui-tabs-nav {
+       height: 18px !important; /* Fixes a clearing problem */
+       margin: 0 3px;
+       background-color: none;
+       padding: 3px 3px 0;
+}
+
+.ui-tabs .ui-tabs-nav li {
+       list-style: none;
+       float: left;
+       position: relative;
+       top: 1px;
+       margin: 0 3px 1px 0;
+       border-bottom: 0 !important;
+       padding: 0;
+       white-space: nowrap;
+       z-index: 90; /* Prevents border overlay during transition */
+}
+
+.ui-tabs .ui-tabs-nav li a {
+       background-color: #fefefe;
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+       background-image: -o-linear-gradient(#fefefe, #eee);
+       background-image: linear-gradient(#fefefe, #eee);
+       
+       border: 1px solid #ccc;
+       border-bottom-width: 0;
+
+       border-top-left-radius: 3px;
+       border-top-right-radius: 3px;
+       
+       float: left;
+       padding: 7px 14px;
+       text-decoration: none;
+}
+
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected {
+       margin-bottom: 0;
+       padding-bottom: 1px;
+}
+
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
+       background-color: #fefefe;      
+       background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+       background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);
+       background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+       background-image: -o-linear-gradient(#eee, #fefefe);
+       background-image: linear-gradient(#eee, #fefefe);
+       
+       border-bottom: 1px solid #fefefe;
+}
+
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled a,
+.ui-tabs .ui-tabs-nav li.ui-state-processing a {
+       cursor: default;
+}
+
+.ui-tabs .ui-tabs-nav li a,
+.ui-tabs .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a {
+       cursor: pointer;
+}
+
+.ui-tabs .ui-tabs-panel {
+       background-color: #fefefe;
+       border: 1px solid #ccc !important;
+       z-index: 89; /* Prevents border overlay during transition */
+       display: block;
+       padding: 14px 21px;
+}
+
+.ui-tabs .ui-tabs-hide {
+       display: none !important;
+}
+
+.ui-helper-hidden {
+       display: none;
+}
+
+.ui-helper-hidden-accessible {
+       position: absolute !important;
+       clip: rect(1px 1px 1px 1px);
+       clip: rect(1px,1px,1px,1px);
+}
+
+.ui-helper-reset {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       outline: 0;
+       line-height: 1.3;
+       text-decoration: none;
+       font-size: 100%;
+       list-style: none;
+}
+
+.ui-helper-clearfix:after {
+       content: "";
+       display: block;
+       height: 0;
+       clear: both;
+}
+
+.ui-helper-clearfix {
+       display: inline-block;
+}
+
+/* Required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix {
+       height: 1%;
+}
+
+.ui-helper-clearfix {
+       display: block;
+}
+
+/* end clearfix */
+.ui-helper-zfix {
+       width: 100%;
+       height: 100%;
+       top: 0;
+       left: 0;
+       position: absolute;
+       opacity: 0;
+       filter: Alpha(opacity=0);}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index 188439b9ec11f6e19abbea67bd8e0e4e356eb4f0..f0294810bca336060d490e08bbf0475590d634f8 100644 (file)
-/**\r
- * ACP Special Styles\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */\r
-\r
-body, html {\r
-       background-color: #fff;\r
-       background-image: url("../images/WoltLab Blue Sunrise/body-ltr.png");\r
-       background-position: left;\r
-       background-repeat: repeat-y;\r
-       background-attachment: scroll;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-#content {\r
-       padding: 30px 0 20px 180px;\r
-       min-width: 800px;\r
-       max-width: 75%;\r
-}\r
-\r
-.userPanelInner, #header, #menuBar .mainMenuInner {\r
-       margin: 0;\r
-       padding: 0;\r
-       width: 100%;\r
-       min-width: 100%;\r
-       max-width: 100%;\r
-}\r
-\r
-#userNote {\r
-       padding-left: 23px;     \r
-}\r
-\r
-.logoInner {\r
-       padding-left: 5px;      \r
-}\r
-\r
-#date {\r
-       padding: 10px 23px 3px 5px;\r
-       position: absolute;\r
-       right: 0;\r
-}\r
-\r
-#header {\r
-       background-color: transparent !important;\r
-}\r
-\r
-#logo .pageLogo img {\r
-       margin-left: 20px;\r
-}\r
-\r
-h1 {\r
-       text-shadow: 0 -1px 1px #000;\r
-}\r
-\r
-#logo h1{\r
-       font-family: 'Trebuchet MS', Arial, sans-serif;\r
-       text-align: right;\r
-       position: absolute;\r
-       top: 0;\r
-       left: 0;\r
-}\r
-\r
-#logo h1, #logo h1 a{\r
-       color: #fff;\r
-}\r
-\r
-#logo h1 a{\r
-       padding-top: 35px;\r
-       padding-right: 23px;\r
-}\r
-\r
-#logo h1{\r
-       font-size: 1.5em;\r
-       font-weight: bold;\r
-}\r
-\r
-h2, h2 a {\r
-       text-shadow: 0 2px 3px #bbb;\r
-}\r
-\r
-#tplStyleList .styleList .subHeadline {\r
-       text-shadow: 0 1px 0 #fff;\r
-}\r
-\r
-#tplStyleList .styleList .messageBody {\r
-       padding-top: 0;\r
-}\r
-\r
-#footer {\r
-       margin: 0;\r
-       width: 100%;\r
-       min-width: 100%;\r
-       max-width: 100%;\r
-}\r
-\r
-#footer:after {\r
-       display: block;\r
-       clear: both;\r
-       content: "";\r
-       height: 0;\r
-}\r
-\r
-#footerContainer {\r
-       background-color: transparent;\r
-       margin: 0 0 0 180px;\r
-       min-width: 800px;\r
-       max-width: 75%;\r
-}\r
-\r
-.contentHeader form.quickJump div {\r
-       margin-top: 5px;\r
-       float: left;\r
-       display: inline;\r
-}\r
-\r
-.copyright {\r
-       padding-top: 5px;\r
-       float: left;\r
-       clear: none;\r
-}\r
-\r
-/* -- -- -- -- -- Sidebar -- -- -- -- -- */\r
-\r
-#sidebar {\r
-       background-color: transparent;\r
-       background-image: url("../images/WoltLab Blue Sunrise/sidebar.png");\r
-       background-repeat: repeat-x;\r
-       background-position: left top;\r
-       border-right: 1px solid #8da4b7;\r
-       position: absolute;\r
-       left: 0;\r
-       width: 129px;\r
-       min-height: 400px;\r
-}\r
-\r
-#sidebar ul {\r
-       list-style: none;\r
-       margin: 0 0 0 8px;\r
-       padding: 0;\r
-}\r
-\r
-#sidebar li {\r
-       text-align: center;\r
-       margin: 10px 0 0 0;\r
-       float: left;\r
-       width: 114px;\r
-}\r
-\r
-#sidebar a {\r
-       text-align: center;\r
-       text-decoration: none;\r
-       float: left;\r
-       clear: left;\r
-       width: 100%;\r
-}\r
-\r
-#sidebar img {\r
-       margin: 14px auto 3px auto;\r
-       height: 48px;\r
-       width: 48px;\r
-       display: block;\r
-}\r
-\r
-#sidebar span {\r
-       font-weight: bold;\r
-       text-shadow: 0 1px 0 #fff;\r
-       padding: 0 0 10px 0;\r
-       display: block;\r
-}\r
-\r
-#sidebar li:hover {\r
-       background-image: url("../images/WoltLab Blue Sunrise/sidebarHoverTop.png");\r
-       background-position: left top;\r
-       background-repeat: no-repeat;\r
-}\r
-\r
-#sidebar li:hover span {\r
-       background-image: url("../images/WoltLab Blue Sunrise/sidebarHoverBottom.png");\r
-       background-position: left bottom;\r
-}\r
-\r
-#sidebar li:active, #sidebar li.active {\r
-       background-image: url("../images/WoltLab Blue Sunrise/sidebarActiveTop.png");\r
-       background-repeat: no-repeat;\r
-}\r
-\r
-#sidebar li:active span, #sidebar li.active span {\r
-       color: #fff;\r
-       text-shadow: 0 -1px 0 #000;\r
-       background-image: url("../images/WoltLab Blue Sunrise/sidebarActiveBottom.png");\r
-       background-position: left bottom;\r
-}\r
-\r
-/* -- -- -- -- -- Menu -- -- -- -- -- */\r
-\r
-/* ToDo: Clean up this mess */\r
-\r
-#menuBar {\r
-       min-height: 31px;\r
-}\r
-\r
-#menuBar .mainMenuInner > ul {\r
-       padding-left: 129px;    \r
-}\r
-\r
-.mainMenu {\r
-       border: 0;      \r
-}\r
-\r
-.mainMenu a {\r
-       padding: 2px 5px 4px 5px;\r
-}\r
-\r
-.mainMenu ul {\r
-       margin: 0;\r
-}\r
-\r
-.mainMenu .mainMenuInner > ul > li > a {\r
-       min-height: 24px;\r
-}\r
-\r
-.mainMenu .mainMenuInner > ul > li > a > span {\r
-       padding: 2px 5px;\r
-       display: block;\r
-}\r
-\r
-.mainMenu .popupMenu {\r
-       border-top-width: 0;    \r
-}\r
-\r
-.mainMenu .popupMenu a {\r
-       color: #164369;\r
-       text-shadow: none !important;\r
-       background-color: #154268;\r
-       background-image: none !important;\r
-       min-height: 20px;\r
-}\r
-\r
-.mainMenu .popupMenu a:hover {\r
-       background-color: #ffe0b8;\r
-}\r
-\r
-#menuBar span {\r
-       position: relative;\r
-       top: 4px;\r
-}\r
-\r
-#menuBar li div span {\r
-       position: relative;\r
-       top: 0;\r
-}\r
-\r
-/* -- -- -- -- -- Sitemap -- -- -- -- -- */\r
-\r
-.sitemap {\r
-       padding: 20px 0 20px 180px;\r
-       width: 800px;\r
-}\r
-\r
-.sitemap ul {\r
-       list-style: none;\r
-       margin: 0;\r
-       padding: 0;\r
-       min-height: 0;\r
-}\r
-\r
-.sitemap h2 img {\r
-       margin-right: 7px;\r
-}\r
-\r
-.sitemap h2 {\r
-       padding: 20px 0 10px 0;\r
-}\r
-\r
-.sitemap h3 {\r
-       margin-bottom: 5px;\r
-}\r
-\r
-.sitemap h4, .sitemap h5  {\r
-       padding: 5px 0;\r
-}\r
-\r
-.sitemap h4 img, .sitemap h5 img  {\r
-       position: absolute;\r
-}\r
-\r
-.sitemap h4 a, .sitemap h4 span, .sitemap h5 a, .sitemap h5 span {\r
-       margin-left: 30px;\r
-       display: block;\r
-}\r
-\r
-.sitemap .border {\r
-       padding-bottom: 1px;\r
-}\r
-\r
-.sitemap .container-1 {\r
-       margin-right: 1px;\r
-       padding: 4px;\r
-}\r
-\r
-.sitemap .sitemapDepth-1 li {\r
-       margin-right: 2%;\r
-       float: left;\r
-       width: 30%;\r
-}\r
-\r
-.sitemap .sitemapDepth-1:after {\r
-       content: "";\r
-       display: block;\r
-       clear: both;\r
-       height: 0;\r
-}\r
-\r
-.sitemap .sitemapDepth-2 li {\r
-       float: none;\r
-       width: auto;\r
-}\r
-\r
-.sitemap .clear {\r
-       clear: both;\r
-}\r
-\r
-/* -- -- -- -- Access Rights -- -- -- -- */\r
-\r
-.allow, .deny {\r
-       font-size: .85em;\r
-       font-weight: normal;\r
-       text-align: center;\r
-       float: right;\r
-       width: 80px;\r
-       height: 10px;\r
-}\r
-\r
-.accessRightsHeader {\r
-       margin-right: 20px;\r
-       min-height: 20px;\r
-}\r
-\r
-.accessRights {\r
-       border: 1px solid #999;\r
-       margin: 0;\r
-       padding: 0;\r
-       height: auto;\r
-       min-height: 100px;\r
-       overflow: auto;\r
-}\r
-\r
-.accessRights ul {\r
-       list-style: none;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.accessRights ul li {\r
-       min-height: 0;\r
-}\r
-\r
-.formField .accessRights li span {\r
-       margin-left: 0;\r
-       float: none;\r
-}\r
-\r
-.accessRights ul li span {\r
-       padding: 2px 4px;\r
-       display: block;\r
-       vertical-align: middle;\r
-}\r
-\r
-.accessRights ul li a {\r
-       text-decoration: none;\r
-       padding: 2px 4px;\r
-       display: block;\r
-}\r
-\r
-.accessRights ul li a:hover {\r
-       background-color: #d8e7f5;\r
-}\r
-\r
-.accessRights ul li.selected a {\r
-       background-color: #8da4b7;\r
-}\r
-\r
-.accessRights ul li a img {\r
-       padding-right: 4px;\r
-       vertical-align: middle;\r
-}\r
-\r
-.accessRights ul li a.remove {\r
-       float: right;\r
-       display: inline;\r
-}\r
-\r
-.accessRights ul li a.remove:hover {\r
-       background-color: #c00;\r
-}\r
-\r
-.accessRights ul li a.remove img {\r
-       padding-right: 0;\r
-}\r
-\r
-.formField .accessRights label {\r
-       clear: none;\r
-}\r
-\r
-.accessRightsInput {\r
-       width: 300px !important;\r
-}\r
-\r
-.accessRightsTitle {\r
-       margin-top: 20px;\r
-}\r
-\r
-#permissions-content div.popupMenu a, #permissions-content div.popupMenu a:hover, #moderators-content div.popupMenu a, #moderators-content div.popupMenu a:hover, #tplGroupAdd div.popupMenu a, #tplGroupAdd div.popupMenu a:hover {\r
-       padding: 5px 7px 5px 35px !important;\r
-}\r
-\r
-/* -- -- -- -- Special Styles -- -- -- -- */\r
-\r
-* {\r
-       -o-text-overflow: ellipsis;\r
-       text-overflow: ellipsis;\r
-}\r
-\r
-.sitemap .container-1 {\r
-       -webkit-border-bottom-left-radius: 5px;\r
-       -webkit-border-bottom-right-radius: 5px;\r
-       -moz-border-radius-bottomleft: 5px;\r
-       -moz-border-radius-bottomright: 5px;\r
-       border-bottom-left-radius: 5px;\r
-       border-bottom-right-radius: 5px;\r
-}\r
-\r
-.mainMenu .popupMenu, .mainMenu .popupMenu li a {\r
-       -webkit-border-top-left-radius: 0;\r
-       -webkit-border-top-right-radius: 0;\r
-       -moz-border-radius-topleft: 0;\r
-       -moz-border-radius-topright: 0;\r
-       border-top-left-radius: 0;\r
-       border-top-right-radius: 0;\r
-}\r
-\r
-.sitemap .border {\r
-       -webkit-border-radius: 5px;\r
-       -moz-border-radius: 5px;\r
-       \r
-       border-radius: 5px;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * ACP Special Styles
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */
+
+body, html {
+       background-color: #fff;
+       background-image: url("../images/WoltLab Blue Sunrise/body-ltr.png");
+       background-position: left;
+       background-repeat: repeat-y;
+       background-attachment: scroll;
+       margin: 0;
+       padding: 0;
+}
+
+#content {
+       padding: 30px 0 20px 180px;
+       min-width: 800px;
+       max-width: 75%;
+}
+
+.userPanelInner, #header, #menuBar .mainMenuInner {
+       margin: 0;
+       padding: 0;
+       width: 100%;
+       min-width: 100%;
+       max-width: 100%;
+}
+
+#userNote {
+       padding-left: 23px;     
+}
+
+.logoInner {
+       padding-left: 5px;      
+}
+
+#date {
+       padding: 10px 23px 3px 5px;
+       position: absolute;
+       right: 0;
+}
+
+#header {
+       background-color: transparent !important;
+}
+
+#logo .pageLogo img {
+       margin-left: 20px;
+}
+
+h1 {
+       text-shadow: 0 -1px 1px #000;
+}
+
+#logo h1{
+       font-family: 'Trebuchet MS', Arial, sans-serif;
+       text-align: right;
+       position: absolute;
+       top: 0;
+       left: 0;
+}
+
+#logo h1, #logo h1 a{
+       color: #fff;
+}
+
+#logo h1 a{
+       padding-top: 35px;
+       padding-right: 23px;
+}
+
+#logo h1{
+       font-size: 1.5em;
+       font-weight: bold;
+}
+
+h2, h2 a {
+       text-shadow: 0 2px 3px #bbb;
+}
+
+#tplStyleList .styleList .subHeadline {
+       text-shadow: 0 1px 0 #fff;
+}
+
+#tplStyleList .styleList .messageBody {
+       padding-top: 0;
+}
+
+#footer {
+       margin: 0;
+       width: 100%;
+       min-width: 100%;
+       max-width: 100%;
+}
+
+#footer:after {
+       display: block;
+       clear: both;
+       content: "";
+       height: 0;
+}
+
+#footerContainer {
+       background-color: transparent;
+       margin: 0 0 0 180px;
+       min-width: 800px;
+       max-width: 75%;
+}
+
+.contentHeader form.quickJump div {
+       margin-top: 5px;
+       float: left;
+       display: inline;
+}
+
+.copyright {
+       padding-top: 5px;
+       float: left;
+       clear: none;
+}
+
+/* -- -- -- -- -- Sidebar -- -- -- -- -- */
+
+#sidebar {
+       background-color: transparent;
+       background-image: url("../images/WoltLab Blue Sunrise/sidebar.png");
+       background-repeat: repeat-x;
+       background-position: left top;
+       border-right: 1px solid #8da4b7;
+       position: absolute;
+       left: 0;
+       width: 129px;
+       min-height: 400px;
+}
+
+#sidebar ul {
+       list-style: none;
+       margin: 0 0 0 8px;
+       padding: 0;
+}
+
+#sidebar li {
+       text-align: center;
+       margin: 10px 0 0 0;
+       float: left;
+       width: 114px;
+}
+
+#sidebar a {
+       text-align: center;
+       text-decoration: none;
+       float: left;
+       clear: left;
+       width: 100%;
+}
+
+#sidebar img {
+       margin: 14px auto 3px auto;
+       height: 48px;
+       width: 48px;
+       display: block;
+}
+
+#sidebar span {
+       font-weight: bold;
+       text-shadow: 0 1px 0 #fff;
+       padding: 0 0 10px 0;
+       display: block;
+}
+
+#sidebar li:hover {
+       background-image: url("../images/WoltLab Blue Sunrise/sidebarHoverTop.png");
+       background-position: left top;
+       background-repeat: no-repeat;
+}
+
+#sidebar li:hover span {
+       background-image: url("../images/WoltLab Blue Sunrise/sidebarHoverBottom.png");
+       background-position: left bottom;
+}
+
+#sidebar li:active, #sidebar li.active {
+       background-image: url("../images/WoltLab Blue Sunrise/sidebarActiveTop.png");
+       background-repeat: no-repeat;
+}
+
+#sidebar li:active span, #sidebar li.active span {
+       color: #fff;
+       text-shadow: 0 -1px 0 #000;
+       background-image: url("../images/WoltLab Blue Sunrise/sidebarActiveBottom.png");
+       background-position: left bottom;
+}
+
+/* -- -- -- -- -- Menu -- -- -- -- -- */
+
+/* ToDo: Clean up this mess */
+
+#menuBar {
+       min-height: 31px;
+}
+
+#menuBar .mainMenuInner > ul {
+       padding-left: 129px;    
+}
+
+.mainMenu {
+       border: 0;      
+}
+
+.mainMenu a {
+       padding: 2px 5px 4px 5px;
+}
+
+.mainMenu ul {
+       margin: 0;
+}
+
+.mainMenu .mainMenuInner > ul > li > a {
+       min-height: 24px;
+}
+
+.mainMenu .mainMenuInner > ul > li > a > span {
+       padding: 2px 5px;
+       display: block;
+}
+
+.mainMenu .popupMenu {
+       border-top-width: 0;    
+}
+
+.mainMenu .popupMenu a {
+       color: #164369;
+       text-shadow: none !important;
+       background-color: #154268;
+       background-image: none !important;
+       min-height: 20px;
+}
+
+.mainMenu .popupMenu a:hover {
+       background-color: #ffe0b8;
+}
+
+#menuBar span {
+       position: relative;
+       top: 4px;
+}
+
+#menuBar li div span {
+       position: relative;
+       top: 0;
+}
+
+/* -- -- -- -- -- Sitemap -- -- -- -- -- */
+
+.sitemap {
+       padding: 20px 0 20px 180px;
+       width: 800px;
+}
+
+.sitemap ul {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+       min-height: 0;
+}
+
+.sitemap h2 img {
+       margin-right: 7px;
+}
+
+.sitemap h2 {
+       padding: 20px 0 10px 0;
+}
+
+.sitemap h3 {
+       margin-bottom: 5px;
+}
+
+.sitemap h4, .sitemap h5  {
+       padding: 5px 0;
+}
+
+.sitemap h4 img, .sitemap h5 img  {
+       position: absolute;
+}
+
+.sitemap h4 a, .sitemap h4 span, .sitemap h5 a, .sitemap h5 span {
+       margin-left: 30px;
+       display: block;
+}
+
+.sitemap .border {
+       padding-bottom: 1px;
+}
+
+.sitemap .container-1 {
+       margin-right: 1px;
+       padding: 4px;
+}
+
+.sitemap .sitemapDepth-1 li {
+       margin-right: 2%;
+       float: left;
+       width: 30%;
+}
+
+.sitemap .sitemapDepth-1:after {
+       content: "";
+       display: block;
+       clear: both;
+       height: 0;
+}
+
+.sitemap .sitemapDepth-2 li {
+       float: none;
+       width: auto;
+}
+
+.sitemap .clear {
+       clear: both;
+}
+
+/* -- -- -- -- Access Rights -- -- -- -- */
+
+.allow, .deny {
+       font-size: .85em;
+       font-weight: normal;
+       text-align: center;
+       float: right;
+       width: 80px;
+       height: 10px;
+}
+
+.accessRightsHeader {
+       margin-right: 20px;
+       min-height: 20px;
+}
+
+.accessRights {
+       border: 1px solid #999;
+       margin: 0;
+       padding: 0;
+       height: auto;
+       min-height: 100px;
+       overflow: auto;
+}
+
+.accessRights ul {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+}
+
+.accessRights ul li {
+       min-height: 0;
+}
+
+.formField .accessRights li span {
+       margin-left: 0;
+       float: none;
+}
+
+.accessRights ul li span {
+       padding: 2px 4px;
+       display: block;
+       vertical-align: middle;
+}
+
+.accessRights ul li a {
+       text-decoration: none;
+       padding: 2px 4px;
+       display: block;
+}
+
+.accessRights ul li a:hover {
+       background-color: #d8e7f5;
+}
+
+.accessRights ul li.selected a {
+       background-color: #8da4b7;
+}
+
+.accessRights ul li a img {
+       padding-right: 4px;
+       vertical-align: middle;
+}
+
+.accessRights ul li a.remove {
+       float: right;
+       display: inline;
+}
+
+.accessRights ul li a.remove:hover {
+       background-color: #c00;
+}
+
+.accessRights ul li a.remove img {
+       padding-right: 0;
+}
+
+.formField .accessRights label {
+       clear: none;
+}
+
+.accessRightsInput {
+       width: 300px !important;
+}
+
+.accessRightsTitle {
+       margin-top: 20px;
+}
+
+#permissions-content div.popupMenu a, #permissions-content div.popupMenu a:hover, #moderators-content div.popupMenu a, #moderators-content div.popupMenu a:hover, #tplGroupAdd div.popupMenu a, #tplGroupAdd div.popupMenu a:hover {
+       padding: 5px 7px 5px 35px !important;
+}
+
+/* -- -- -- -- Special Styles -- -- -- -- */
+
+* {
+       -o-text-overflow: ellipsis;
+       text-overflow: ellipsis;
+}
+
+.sitemap .container-1 {
+       -webkit-border-bottom-left-radius: 5px;
+       -webkit-border-bottom-right-radius: 5px;
+       -moz-border-radius-bottomleft: 5px;
+       -moz-border-radius-bottomright: 5px;
+       border-bottom-left-radius: 5px;
+       border-bottom-right-radius: 5px;
+}
+
+.mainMenu .popupMenu, .mainMenu .popupMenu li a {
+       -webkit-border-top-left-radius: 0;
+       -webkit-border-top-right-radius: 0;
+       -moz-border-radius-topleft: 0;
+       -moz-border-radius-topright: 0;
+       border-top-left-radius: 0;
+       border-top-right-radius: 0;
+}
+
+.sitemap .border {
+       -webkit-border-radius: 5px;
+       -moz-border-radius: 5px;
+       
+       border-radius: 5px;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index 1bb07683d7b6c7d210d6eabd026019f8fd709eb0..e12335c187e99c9a3b90847e1de83cf49f72a3e9 100644 (file)
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/cronjobs{$action|ucfirst}L.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.cronjob.{$action}{/lang}</h1>\r
-               <h2>{lang}wcf.acp.cronjob.subtitle{/lang}</h2>\r
-       </hgroup>\r
-</header>\r
-\r
-{if $errorField}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $success|isset}\r
-       <p class="success">{lang}wcf.acp.cronjob.{$action}.success{/lang}</p>   \r
-{/if}\r
-\r
-<p class="info">{lang}wcf.acp.cronjob.intro{/lang}</p>\r
-\r
-<div class="contentHeader">\r
-       <nav class="largeButtons">\r
-               <ul>\r
-                       <li><a href="index.php?page=CronjobList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.cronjobs.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/cronjobsM.png" alt="" /> <span>{lang}wcf.acp.menu.link.cronjobs.view{/lang}</span></a></li>\r
-                       {if $action == 'edit'}<li><a href="index.php?action=CronjobExecute&amp;cronjobID={@$cronjobID}{@SID_ARG_2ND}" title="{lang}wcf.acp.cronjob.execute{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/cronjobExecuteM.png" alt="" /> <span>{lang}wcf.acp.cronjob.execute{/lang}</span></a></li>{/if}\r
-               </ul>\r
-       </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=Cronjob{$action|ucfirst}">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.cronjob.edit.data{/lang}</legend>\r
-                               \r
-                               <div class="formElement{if $errorField == 'className'} formError{/if}" id="classNameDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="className">{lang}wcf.acp.cronjob.className{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="className" name="className" value="{$className}" />\r
-                                               {if $errorField == 'className'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.acp.cronjob.error.empty{/lang}{/if}\r
-                                                               {if $errorType == 'doesNotExist'}{lang}wcf.acp.cronjob.error.doesNotExist{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="classNameHelpMessage">\r
-                                               <p>{lang}wcf.acp.cronjob.className.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('className');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement" id="descriptionDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="description">{lang}wcf.acp.cronjob.description{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="description" name="description" value="{$description}" />\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="descriptionHelpMessage">\r
-                                               <p>{lang}wcf.acp.cronjob.description.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('description');\r
-                               //]]></script>\r
-                       </fieldset>\r
-                       \r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.cronjob.edit.timing{/lang}</legend>\r
-                               <div class="formElement{if $errorField == 'startMinute'} formError{/if}" id="startMinuteDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="startMinute">{lang}wcf.acp.cronjob.startMinute{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="startMinute" name="startMinute" value="{$startMinute}" />\r
-                                               {if $errorField == 'startMinute'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="startMinuteHelpMessage">\r
-                                               <p>{lang}wcf.acp.cronjob.startMinute.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('startMinute');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement{if $errorField == 'startHour'} formError{/if}" id="startHourDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="startHour">{lang}wcf.acp.cronjob.startHour{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="startHour" name="startHour" value="{$startHour}" />\r
-                                               {if $errorField == 'startHour'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="startHourHelpMessage">\r
-                                               <p>{lang}wcf.acp.cronjob.startHour.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('startHour');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement{if $errorField == 'startDom'} formError{/if}" id="startDomDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="startDom">{lang}wcf.acp.cronjob.startDom{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="startDom" name="startDom" value="{$startDom}" />\r
-                                               {if $errorField == 'startDom'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="startDomHelpMessage">\r
-                                               <p>{lang}wcf.acp.cronjob.startDom.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('startDom');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement{if $errorField == 'startMonth'} formError{/if}" id="startMonthDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="startMonth">{lang}wcf.acp.cronjob.startMonth{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="startMonth" name="startMonth" value="{$startMonth}" />\r
-                                               {if $errorField == 'startMonth'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="startMonthHelpMessage">\r
-                                               <p>{lang}wcf.acp.cronjob.startMonth.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('startMonth');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement{if $errorField == 'startDow'} formError{/if}" id="startDowDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="startDow">{lang}wcf.acp.cronjob.startDow{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="startDow" name="startDow" value="{$startDow}" />\r
-                                               {if $errorField == 'startDow'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="startDowHelpMessage">\r
-                                               <p>{lang}wcf.acp.cronjob.startDow.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('startDow');\r
-                               //]]></script>\r
-                       </fieldset>\r
-                       \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-               {if $cronjobID|isset}<input type="hidden" name="cronjobID" value="{@$cronjobID}" />{/if}\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/cronjobs{$action|ucfirst}L.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.cronjob.{$action}{/lang}</h1>
+               <h2>{lang}wcf.acp.cronjob.subtitle{/lang}</h2>
+       </hgroup>
+</header>
+
+{if $errorField}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $success|isset}
+       <p class="success">{lang}wcf.acp.cronjob.{$action}.success{/lang}</p>   
+{/if}
+
+<p class="info">{lang}wcf.acp.cronjob.intro{/lang}</p>
+
+<div class="contentHeader">
+       <nav class="largeButtons">
+               <ul>
+                       <li><a href="index.php?page=CronjobList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.cronjobs.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/cronjobsM.png" alt="" /> <span>{lang}wcf.acp.menu.link.cronjobs.view{/lang}</span></a></li>
+                       {if $action == 'edit'}<li><a href="index.php?action=CronjobExecute&amp;cronjobID={@$cronjobID}{@SID_ARG_2ND}" title="{lang}wcf.acp.cronjob.execute{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/cronjobExecuteM.png" alt="" /> <span>{lang}wcf.acp.cronjob.execute{/lang}</span></a></li>{/if}
+               </ul>
+       </nav>
+</div>
+
+<form method="post" action="index.php?form=Cronjob{$action|ucfirst}">
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.cronjob.edit.data{/lang}</legend>
+                               
+                               <div class="formElement{if $errorField == 'className'} formError{/if}" id="classNameDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="className">{lang}wcf.acp.cronjob.className{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="className" name="className" value="{$className}" />
+                                               {if $errorField == 'className'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.acp.cronjob.error.empty{/lang}{/if}
+                                                               {if $errorType == 'doesNotExist'}{lang}wcf.acp.cronjob.error.doesNotExist{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="classNameHelpMessage">
+                                               <p>{lang}wcf.acp.cronjob.className.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('className');
+                               //]]></script>
+                               
+                               <div class="formElement" id="descriptionDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="description">{lang}wcf.acp.cronjob.description{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="description" name="description" value="{$description}" />
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="descriptionHelpMessage">
+                                               <p>{lang}wcf.acp.cronjob.description.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('description');
+                               //]]></script>
+                       </fieldset>
+                       
+                       <fieldset>
+                               <legend>{lang}wcf.acp.cronjob.edit.timing{/lang}</legend>
+                               <div class="formElement{if $errorField == 'startMinute'} formError{/if}" id="startMinuteDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="startMinute">{lang}wcf.acp.cronjob.startMinute{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="startMinute" name="startMinute" value="{$startMinute}" />
+                                               {if $errorField == 'startMinute'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="startMinuteHelpMessage">
+                                               <p>{lang}wcf.acp.cronjob.startMinute.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('startMinute');
+                               //]]></script>
+                               
+                               <div class="formElement{if $errorField == 'startHour'} formError{/if}" id="startHourDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="startHour">{lang}wcf.acp.cronjob.startHour{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="startHour" name="startHour" value="{$startHour}" />
+                                               {if $errorField == 'startHour'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="startHourHelpMessage">
+                                               <p>{lang}wcf.acp.cronjob.startHour.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('startHour');
+                               //]]></script>
+                               
+                               <div class="formElement{if $errorField == 'startDom'} formError{/if}" id="startDomDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="startDom">{lang}wcf.acp.cronjob.startDom{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="startDom" name="startDom" value="{$startDom}" />
+                                               {if $errorField == 'startDom'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="startDomHelpMessage">
+                                               <p>{lang}wcf.acp.cronjob.startDom.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('startDom');
+                               //]]></script>
+                               
+                               <div class="formElement{if $errorField == 'startMonth'} formError{/if}" id="startMonthDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="startMonth">{lang}wcf.acp.cronjob.startMonth{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="startMonth" name="startMonth" value="{$startMonth}" />
+                                               {if $errorField == 'startMonth'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="startMonthHelpMessage">
+                                               <p>{lang}wcf.acp.cronjob.startMonth.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('startMonth');
+                               //]]></script>
+                               
+                               <div class="formElement{if $errorField == 'startDow'} formError{/if}" id="startDowDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="startDow">{lang}wcf.acp.cronjob.startDow{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="startDow" name="startDow" value="{$startDow}" />
+                                               {if $errorField == 'startDow'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="startDowHelpMessage">
+                                               <p>{lang}wcf.acp.cronjob.startDow.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('startDow');
+                               //]]></script>
+                       </fieldset>
+                       
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               {@SID_INPUT_TAG}
+               {if $cronjobID|isset}<input type="hidden" name="cronjobID" value="{@$cronjobID}" />{/if}
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index 9c780857c39309638563b6b84eb4f551243b3081..e28cb7e939035fb231cde402736c15e9b128ca2b 100644 (file)
@@ -1,76 +1,76 @@
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/cronjobsLogL.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.cronjob.log{/lang}</h1>\r
-               <h2>{lang}wcf.acp.cronjob.subtitle{/lang}</h2>\r
-       </hgroup>\r
-</header>\r
-\r
-<div class="contentHeader">\r
-       {pages print=true assign=pagesLinks link="index.php?page=CronjobLogList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}\r
-</div>\r
-\r
-{hascontent}\r
-       <form method="post" action="index.php?action=CronjobsLogDelete">\r
-               <div class="border titleBarPanel">\r
-                       <div class="containerHead"><h3>{lang}wcf.acp.cronjob.log.data{/lang}</h3></div>\r
-               </div>\r
-               <div class="border borderMarginRemove">\r
-                       <table class="tableList">\r
-                               <thead>\r
-                                       <tr class="tableHead">\r
-                                               <th class="columnCronjobID{if $sortField == 'cronjobID'} active{/if}"><div><a href="index.php?page=CronjobLogList&amp;pageNo={@$pageNo}&amp;sortField=cronjobID&amp;sortOrder={if $sortField == 'cronjobID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.cronjobID{/lang}{if $sortField == 'cronjobID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                               <th class="columnClassPath{if $sortField == 'classPath'} active{/if}"><div><a href="index.php?page=CronjobLogList&amp;pageNo={@$pageNo}&amp;sortField=classPath&amp;sortOrder={if $sortField == 'classPath' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.classPath{/lang}{if $sortField == 'classPath'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                               <th class="columnDescription{if $sortField == 'description'} active{/if}"><div><a href="index.php?page=CronjobLogList&amp;pageNo={@$pageNo}&amp;sortField=description&amp;sortOrder={if $sortField == 'description' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.description{/lang}{if $sortField == 'description'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                               <th class="columnExecTime{if $sortField == 'execTime'} active{/if}"><div><a href="index.php?page=CronjobLogList&amp;pageNo={@$pageNo}&amp;sortField=execTime&amp;sortOrder={if $sortField == 'execTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.log.execTime{/lang}{if $sortField == 'execTime'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                               \r
-                                               {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
-                                       </tr>\r
-                               </thead>\r
-                               <tbody>\r
-                               {content}\r
-                                       {foreach from=$cronjobLogs item=cronjobLog}\r
-                                               <tr class="{cycle values="container-1,container-2"}">\r
-                                                       <td class="columnCronjobID columnID">{@$cronjobLog->cronjobID}</td>\r
-                                                       <td class="columnClassPath columnText">{$cronjobLog->classPath}</td>\r
-                                                       <td class="columnDescription columnText">{$cronjobLog->description}</td>\r
-                                                       {if $cronjobLog->success}\r
-                                                               <td class="columnExecTime columnDate">{@$cronjobLog->execTime|time} {lang}wcf.acp.cronjob.log.success{/lang}</td>\r
-                                                       {elseif $cronjobLog->error}\r
-                                                               <td class="columnExecTime columnText">\r
-                                                                       {@$cronjobLog->execTime|time} {lang}wcf.acp.cronjob.log.error{/lang}<br />\r
-                                                                       {@$cronjobLog->error}\r
-                                                               </td>\r
-                                                       {else}\r
-                                                               <td class="columnExecTime columnText"></td>\r
-                                                       {/if}\r
-                                                       \r
-                                                       {if $cronjobLog->additionalColumns|isset}{@$cronjobLog->additionalColumns}{/if}\r
-                                               </tr>\r
-                                       {/foreach}\r
-                               {/content}\r
-                               </tbody>\r
-                       </table>\r
-               </div>\r
-               \r
-               <div class="formSubmit">\r
-                       {@SID_INPUT_TAG}\r
-                       <input type="submit" accesskey="c" value="{lang}wcf.acp.cronjob.log.clear{/lang}" onclick="return confirm('{lang}wcf.acp.cronjob.log.clear.confirm{/lang}')" />\r
-               </div>\r
-       </form>\r
-       \r
-       <div class="contentFooter">\r
-               {@$pagesLinks}\r
-       </div>\r
-{hascontentelse}\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <p class="info">{lang}wcf.acp.cronjob.log.noEntries{/lang}</p>\r
-               </div>\r
-       </div>\r
-{/hascontent}\r
-\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/cronjobsLogL.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.cronjob.log{/lang}</h1>
+               <h2>{lang}wcf.acp.cronjob.subtitle{/lang}</h2>
+       </hgroup>
+</header>
+
+<div class="contentHeader">
+       {pages print=true assign=pagesLinks link="index.php?page=CronjobLogList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}
+</div>
+
+{hascontent}
+       <form method="post" action="index.php?action=CronjobsLogDelete">
+               <div class="border titleBarPanel">
+                       <div class="containerHead"><h3>{lang}wcf.acp.cronjob.log.data{/lang}</h3></div>
+               </div>
+               <div class="border borderMarginRemove">
+                       <table class="tableList">
+                               <thead>
+                                       <tr class="tableHead">
+                                               <th class="columnCronjobID{if $sortField == 'cronjobID'} active{/if}"><div><a href="index.php?page=CronjobLogList&amp;pageNo={@$pageNo}&amp;sortField=cronjobID&amp;sortOrder={if $sortField == 'cronjobID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.cronjobID{/lang}{if $sortField == 'cronjobID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                               <th class="columnClassPath{if $sortField == 'classPath'} active{/if}"><div><a href="index.php?page=CronjobLogList&amp;pageNo={@$pageNo}&amp;sortField=classPath&amp;sortOrder={if $sortField == 'classPath' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.classPath{/lang}{if $sortField == 'classPath'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                               <th class="columnDescription{if $sortField == 'description'} active{/if}"><div><a href="index.php?page=CronjobLogList&amp;pageNo={@$pageNo}&amp;sortField=description&amp;sortOrder={if $sortField == 'description' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.description{/lang}{if $sortField == 'description'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                               <th class="columnExecTime{if $sortField == 'execTime'} active{/if}"><div><a href="index.php?page=CronjobLogList&amp;pageNo={@$pageNo}&amp;sortField=execTime&amp;sortOrder={if $sortField == 'execTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.log.execTime{/lang}{if $sortField == 'execTime'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                               
+                                               {if $additionalColumns|isset}{@$additionalColumns}{/if}
+                                       </tr>
+                               </thead>
+                               <tbody>
+                               {content}
+                                       {foreach from=$cronjobLogs item=cronjobLog}
+                                               <tr class="{cycle values="container-1,container-2"}">
+                                                       <td class="columnCronjobID columnID">{@$cronjobLog->cronjobID}</td>
+                                                       <td class="columnClassPath columnText">{$cronjobLog->classPath}</td>
+                                                       <td class="columnDescription columnText">{$cronjobLog->description}</td>
+                                                       {if $cronjobLog->success}
+                                                               <td class="columnExecTime columnDate">{@$cronjobLog->execTime|time} {lang}wcf.acp.cronjob.log.success{/lang}</td>
+                                                       {elseif $cronjobLog->error}
+                                                               <td class="columnExecTime columnText">
+                                                                       {@$cronjobLog->execTime|time} {lang}wcf.acp.cronjob.log.error{/lang}<br />
+                                                                       {@$cronjobLog->error}
+                                                               </td>
+                                                       {else}
+                                                               <td class="columnExecTime columnText"></td>
+                                                       {/if}
+                                                       
+                                                       {if $cronjobLog->additionalColumns|isset}{@$cronjobLog->additionalColumns}{/if}
+                                               </tr>
+                                       {/foreach}
+                               {/content}
+                               </tbody>
+                       </table>
+               </div>
+               
+               <div class="formSubmit">
+                       {@SID_INPUT_TAG}
+                       <input type="submit" accesskey="c" value="{lang}wcf.acp.cronjob.log.clear{/lang}" onclick="return confirm('{lang}wcf.acp.cronjob.log.clear.confirm{/lang}')" />
+               </div>
+       </form>
+       
+       <div class="contentFooter">
+               {@$pagesLinks}
+       </div>
+{hascontentelse}
+       <div class="border content">
+               <div class="container-1">
+                       <p class="info">{lang}wcf.acp.cronjob.log.noEntries{/lang}</p>
+               </div>
+       </div>
+{/hascontent}
+
 {include file='footer'}
\ No newline at end of file
index af6831f5504b0af43671906eafcdcc17657c7d1e..fb92476b337a898f63737e3ccd66760f56e5832e 100644 (file)
@@ -1,20 +1,20 @@
-                       </div>\r
-               </div>\r
-       </section>\r
-       <!-- /CONTENT -->\r
-       \r
-       <!-- FOOTER -->\r
-       <footer>\r
-               <div>\r
-                       <nav id="footerNavigation" class="footerNavigation">\r
-                               <ul>\r
-                                       <li id="toTopLink" class="toTopLink"><a href="#top" title="{lang}wcf.global.scrollUp{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/upS.png" alt="{lang}wcf.global.scrollUp{/lang}" /> <span class="invisible">{lang}wcf.global.scrollUp{/lang}</span></a></li>\r
-                               </ul>\r
-                       </nav>\r
-               </div>\r
-               <p class="copyright"><a href="http://www.woltlab.com" title="Go to the WoltLab website">Copyright &copy; 2001-2011 WoltLab&reg; GmbH</a></p>\r
-       </footer>\r
-       <!-- /FOOTER -->\r
-       <a id="bottom"></a>\r
-</body>\r
+                       </div>
+               </div>
+       </section>
+       <!-- /CONTENT -->
+       
+       <!-- FOOTER -->
+       <footer>
+               <div>
+                       <nav id="footerNavigation" class="footerNavigation">
+                               <ul>
+                                       <li id="toTopLink" class="toTopLink"><a href="#top" title="{lang}wcf.global.scrollUp{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/upS.png" alt="{lang}wcf.global.scrollUp{/lang}" /> <span class="invisible">{lang}wcf.global.scrollUp{/lang}</span></a></li>
+                               </ul>
+                       </nav>
+               </div>
+               <p class="copyright"><a href="http://www.woltlab.com" title="Go to the WoltLab website">Copyright &copy; 2001-2011 WoltLab&reg; GmbH</a></p>
+       </footer>
+       <!-- /FOOTER -->
+       <a id="bottom"></a>
+</body>
 </html>
\ No newline at end of file
index 108bb7bd357ebf30f88c6c9217883a49ccede2af..58e817665ab8a219d39c40bc6a96c2543baed62d 100644 (file)
-<!DOCTYPE html>\r
-<html dir="{@$__wcf->getLanguage()->getPageDirection()}" lang="{@$__wcf->getLanguage()->getFixedLanguageCode()}">\r
-<head>\r
-       <meta charset="utf-8" />\r
-       <title>{if $pageTitle|isset}{@$pageTitle}{else}{lang}wcf.global.pageTitle{/lang}{/if} - {lang}wcf.acp{/lang}</title>\r
-       <meta http-equiv="X-UA-Compatible" content="IE=edge" />\r
-       <script type="text/javascript">\r
-               //<![CDATA[\r
-               var SID_ARG_2ND = '{@SID_ARG_2ND_NOT_ENCODED}';\r
-               var RELATIVE_WCF_DIR = '{@RELATIVE_WCF_DIR}';\r
-               var SECURITY_TOKEN = '{@SECURITY_TOKEN}';\r
-               //]]>\r
-       </script>\r
-       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/jquery.min.js"></script>\r
-       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/jquery-ui.min.js"></script>\r
-       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/WCF.js"></script>\r
-       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/WCF.ACP.js"></script>\r
-       \r
-       {*\r
-       {if $specialStyles|isset}\r
-               <!-- special styles -->\r
-               {@$specialStyles}\r
-       {/if}\r
-       *}\r
-       \r
-       <!-- Testing stylesheets -->\r
-       <link rel="stylesheet" type="text/css" href="{@RELATIVE_WCF_DIR}acp/style/testing-reset.css" />\r
-       <link rel="stylesheet" type="text/css" href="{@RELATIVE_WCF_DIR}acp/style/testing.css" />\r
-       <!-- /Testing stylesheets -->\r
-       \r
-       {*\r
-       <style type="text/css">\r
-               @import url("{@RELATIVE_WCF_DIR}acp/style/style-{@$__wcf->getLanguage()->getPageDirection()}.css");\r
-       </style>\r
-       \r
-       <!--[if IE 8]>\r
-               <style type="text/css">\r
-                       @import url("{@RELATIVE_WCF_DIR}style/extra/ie8-fix{if $__wcf->getLanguage()->getPageDirection() == 'rtl'}-rtl{/if}.css");\r
-               </style>\r
-       <![endif]-->\r
-       *}\r
-       \r
-       <script type="text/javascript">\r
-               //<![CDATA[\r
-               $(function() {\r
-                       {* work-around for unknown core-object during WCFSetup *}\r
-                       {if PACKAGE_ID}\r
-                               {assign var=activeMenuItems value=$__wcf->getACPMenu()->getActiveMenuItems()|array_reverse}\r
-                               var $activeMenuItems = [{implode from=$activeMenuItems item=menuItem}'{$menuItem}'{/implode}];\r
-                               new WCF.ACP.Menu($activeMenuItems);\r
-                       {/if}\r
-                       \r
-                       WCF.Language.addObject({\r
-                               'wcf.global.date.relative.minutes': '{capture assign=relativeMinutes}{lang}wcf.global.date.relative.minutes{/lang}{/capture}{@$relativeMinutes|encodeJS}',\r
-                               'wcf.global.date.relative.hours': '{capture assign=relativeHours}{lang}wcf.global.date.relative.hours{/lang}{/capture}{@$relativeHours|encodeJS}',\r
-                               'wcf.global.date.relative.pastDays': '{capture assign=relativePastDays}{lang}wcf.global.date.relative.pastDays{/lang}{/capture}{@$relativePastDays|encodeJS}',\r
-                               'wcf.global.date.dateTimeFormat': '{lang}wcf.global.date.dateTimeFormat{/lang}',\r
-                               '__days': [ '{lang}wcf.global.date.day.sunday{/lang}', '{lang}wcf.global.date.day.monday{/lang}', '{lang}wcf.global.date.day.tuesday{/lang}', '{lang}wcf.global.date.day.wednesday{/lang}', '{lang}wcf.global.date.day.thursday{/lang}', '{lang}wcf.global.date.day.friday{/lang}', '{lang}wcf.global.date.day.saturday{/lang}' ],\r
-                               'wcf.global.thousandsSeparator': '{capture assign=thousandsSeparator}{lang}wcf.global.thousandsSeparator{/lang}{/capture}{@$thousandsSeparator|encodeJS}',\r
-                               'wcf.global.page.next': '{capture assign=pageNext}{lang}wcf.global.page.next{/lang}{/capture}{@$pageNext|encodeJS}',\r
-                               'wcf.global.page.previous': '{capture assign=pagePrevious}{lang}wcf.global.page.previous{/lang}{/capture}{@$pagePrevious|encodeJS}'\r
-                       });\r
-                       new WCF.Date.Time();\r
-               });\r
-               //]]>\r
-       </script>\r
-</head>\r
-\r
-<body id="tpl{$templateName|ucfirst}">\r
-       <!-- HEADER -->\r
-       <a id="top"></a>\r
-       <header class="pageHeader">\r
-               \r
-               <!-- top menu -->\r
-               <nav id="topMenu" class="topMenu">\r
-                       <div>\r
-                               <ul>\r
-                                       <li><a href="#" title="Hello World">Hello World!</a></li>\r
-                               </ul>\r
-                       </div>\r
-               </nav>\r
-               <!-- /top menu -->\r
-               \r
-               <!-- logo -->\r
-               <div id="logo" class="logo">\r
-                       <!-- clickable area -->\r
-                       <a href="index.php{@SID_ARG_1ST}">\r
-                               <h1>WoltLab Community Framework 2.0 Pre-Alpha 1</h1>\r
-                               <img src="{@RELATIVE_WCF_DIR}acp/images/wcfLogoWhite.svg" width="300" height="58" alt="Product-logo" title="WoltLab Community Framework 2.0 Pre-Alpha 1" />\r
-                       </a>\r
-                       <!-- /clickable area -->\r
-                       \r
-                       <!-- search area -->\r
-                       \r
-                       <!-- /search area -->\r
-               </div>\r
-               <!-- /logo -->\r
-               \r
-               <!-- top nav -->\r
-               <nav id="mainMenu" class="mainMenu">\r
-                       {* work-around for unknown core-object during WCFSetup *}\r
-                       {if PACKAGE_ID}\r
-                               <ul>\r
-                                       {foreach from=$__wcf->getACPMenu()->getMenuItems('') item=menuItem}\r
-                                               <li data-menuItem="{$menuItem->menuItem}">{lang}{@$menuItem->menuItem}{/lang}</li>\r
-                                       {/foreach}\r
-                               </ul>\r
-                       {/if}\r
-               </nav>\r
-               <!-- /top nav -->\r
-               \r
-               <!-- sub bar -->\r
-               <nav class="headerNavigation">\r
-                       <ul>\r
-                               <li id="toBottomLink" class="toBottomLink"><a href="#bottom" title="{lang}wcf.global.scrollDown{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/downS.png" alt="{lang}wcf.global.scrollDown{/lang}" /> <span class="invisible">{lang}wcf.global.scrollDown{/lang}</span></a></li>\r
-                       </ul>\r
-               </nav>\r
-               <!-- /sub bar -->\r
-       </header>\r
-       <!-- /HEADER -->\r
-       \r
-       <!-- CONTENT -->\r
-       <div id="main" class="main">\r
-               <div>\r
-                       <aside class="sidebar">\r
-                               <!-- sub nav -->\r
-                               <nav id="sidebarMenu" class="sidebarMenu">\r
-                                       {* work-around for unknown core-object during WCFSetup *}\r
-                                       {if PACKAGE_ID}\r
-                                               {foreach from=$__wcf->getACPMenu()->getMenuItems('') item=parentMenuItem}\r
-                                                       <div data-parentMenuItem="{$parentMenuItem->menuItem}" id="{$parentMenuItem->menuItem}-container" style="display: none;">\r
-                                                               {foreach from=$__wcf->getACPMenu()->getMenuItems($parentMenuItem->menuItem) item=menuItem}\r
-                                                                       <h1 data-menuItem="{$menuItem->menuItem}" class="menuHeader">{lang}{@$menuItem->menuItem}{/lang}</h1>\r
-                                                                       <div class="sidebarMenuGroup">\r
-                                                                               <ul id="{$menuItem->menuItem}">\r
-                                                                                       {foreach from=$__wcf->getACPMenu()->getMenuItems($menuItem->menuItem) item=menuItemCategory}\r
-                                                                                               {if $__wcf->getACPMenu()->getMenuItems($menuItemCategory->menuItem)|count > 0}\r
-                                                                                                       {foreach from=$__wcf->getACPMenu()->getMenuItems($menuItemCategory->menuItem) item=subMenuItem}\r
-                                                                                                               <li data-menuItem="{$subMenuItem->menuItem}" id="{$subMenuItem->menuItem}"><a href="{$subMenuItem->getLink()}">{lang}{$subMenuItem->menuItem}{/lang}</a></li>\r
-                                                                                                       {/foreach}\r
-                                                                                               {else}\r
-                                                                                                       <li data-menuItem="{$menuItemCategory->menuItem}" id="{$menuItemCategory->menuItem}"><a href="{$menuItemCategory->getLink()}">{lang}{$menuItemCategory->menuItem}{/lang}</a></li>\r
-                                                                                               {/if}\r
-                                                                                       {/foreach}\r
-                                                                               </ul>\r
-                                                                       </div>\r
-                                                               {/foreach}\r
-                                                       </div>\r
-                                               {/foreach}\r
-                                       {/if}\r
-                               </nav>\r
-                               <!-- /sub nav -->\r
-                       </aside>\r
-                       \r
-                       <section id="content">\r
+<!DOCTYPE html>
+<html dir="{@$__wcf->getLanguage()->getPageDirection()}" lang="{@$__wcf->getLanguage()->getFixedLanguageCode()}">
+<head>
+       <meta charset="utf-8" />
+       <title>{if $pageTitle|isset}{@$pageTitle}{else}{lang}wcf.global.pageTitle{/lang}{/if} - {lang}wcf.acp{/lang}</title>
+       <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+       <script type="text/javascript">
+               //<![CDATA[
+               var SID_ARG_2ND = '{@SID_ARG_2ND_NOT_ENCODED}';
+               var RELATIVE_WCF_DIR = '{@RELATIVE_WCF_DIR}';
+               var SECURITY_TOKEN = '{@SECURITY_TOKEN}';
+               //]]>
+       </script>
+       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/jquery.min.js"></script>
+       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/jquery-ui.min.js"></script>
+       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/WCF.js"></script>
+       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/WCF.ACP.js"></script>
+       
+       {*
+       {if $specialStyles|isset}
+               <!-- special styles -->
+               {@$specialStyles}
+       {/if}
+       *}
+       
+       <!-- Testing stylesheets -->
+       <link rel="stylesheet" type="text/css" href="{@RELATIVE_WCF_DIR}acp/style/testing-reset.css" />
+       <link rel="stylesheet" type="text/css" href="{@RELATIVE_WCF_DIR}acp/style/testing.css" />
+       <!-- /Testing stylesheets -->
+       
+       {*
+       <style type="text/css">
+               @import url("{@RELATIVE_WCF_DIR}acp/style/style-{@$__wcf->getLanguage()->getPageDirection()}.css");
+       </style>
+       
+       <!--[if IE 8]>
+               <style type="text/css">
+                       @import url("{@RELATIVE_WCF_DIR}style/extra/ie8-fix{if $__wcf->getLanguage()->getPageDirection() == 'rtl'}-rtl{/if}.css");
+               </style>
+       <![endif]-->
+       *}
+       
+       <script type="text/javascript">
+               //<![CDATA[
+               $(function() {
+                       {* work-around for unknown core-object during WCFSetup *}
+                       {if PACKAGE_ID}
+                               {assign var=activeMenuItems value=$__wcf->getACPMenu()->getActiveMenuItems()|array_reverse}
+                               var $activeMenuItems = [{implode from=$activeMenuItems item=menuItem}'{$menuItem}'{/implode}];
+                               new WCF.ACP.Menu($activeMenuItems);
+                       {/if}
+                       
+                       WCF.Language.addObject({
+                               'wcf.global.date.relative.minutes': '{capture assign=relativeMinutes}{lang}wcf.global.date.relative.minutes{/lang}{/capture}{@$relativeMinutes|encodeJS}',
+                               'wcf.global.date.relative.hours': '{capture assign=relativeHours}{lang}wcf.global.date.relative.hours{/lang}{/capture}{@$relativeHours|encodeJS}',
+                               'wcf.global.date.relative.pastDays': '{capture assign=relativePastDays}{lang}wcf.global.date.relative.pastDays{/lang}{/capture}{@$relativePastDays|encodeJS}',
+                               'wcf.global.date.dateTimeFormat': '{lang}wcf.global.date.dateTimeFormat{/lang}',
+                               '__days': [ '{lang}wcf.global.date.day.sunday{/lang}', '{lang}wcf.global.date.day.monday{/lang}', '{lang}wcf.global.date.day.tuesday{/lang}', '{lang}wcf.global.date.day.wednesday{/lang}', '{lang}wcf.global.date.day.thursday{/lang}', '{lang}wcf.global.date.day.friday{/lang}', '{lang}wcf.global.date.day.saturday{/lang}' ],
+                               'wcf.global.thousandsSeparator': '{capture assign=thousandsSeparator}{lang}wcf.global.thousandsSeparator{/lang}{/capture}{@$thousandsSeparator|encodeJS}',
+                               'wcf.global.page.next': '{capture assign=pageNext}{lang}wcf.global.page.next{/lang}{/capture}{@$pageNext|encodeJS}',
+                               'wcf.global.page.previous': '{capture assign=pagePrevious}{lang}wcf.global.page.previous{/lang}{/capture}{@$pagePrevious|encodeJS}'
+                       });
+                       new WCF.Date.Time();
+               });
+               //]]>
+       </script>
+</head>
+
+<body id="tpl{$templateName|ucfirst}">
+       <!-- HEADER -->
+       <a id="top"></a>
+       <header class="pageHeader">
+               
+               <!-- top menu -->
+               <nav id="topMenu" class="topMenu">
+                       <div>
+                               <ul>
+                                       <li><a href="#" title="Hello World">Hello World!</a></li>
+                               </ul>
+                       </div>
+               </nav>
+               <!-- /top menu -->
+               
+               <!-- logo -->
+               <div id="logo" class="logo">
+                       <!-- clickable area -->
+                       <a href="index.php{@SID_ARG_1ST}">
+                               <h1>WoltLab Community Framework 2.0 Pre-Alpha 1</h1>
+                               <img src="{@RELATIVE_WCF_DIR}acp/images/wcfLogoWhite.svg" width="300" height="58" alt="Product-logo" title="WoltLab Community Framework 2.0 Pre-Alpha 1" />
+                       </a>
+                       <!-- /clickable area -->
+                       
+                       <!-- search area -->
+                       
+                       <!-- /search area -->
+               </div>
+               <!-- /logo -->
+               
+               <!-- top nav -->
+               <nav id="mainMenu" class="mainMenu">
+                       {* work-around for unknown core-object during WCFSetup *}
+                       {if PACKAGE_ID}
+                               <ul>
+                                       {foreach from=$__wcf->getACPMenu()->getMenuItems('') item=menuItem}
+                                               <li data-menuItem="{$menuItem->menuItem}">{lang}{@$menuItem->menuItem}{/lang}</li>
+                                       {/foreach}
+                               </ul>
+                       {/if}
+               </nav>
+               <!-- /top nav -->
+               
+               <!-- sub bar -->
+               <nav class="headerNavigation">
+                       <ul>
+                               <li id="toBottomLink" class="toBottomLink"><a href="#bottom" title="{lang}wcf.global.scrollDown{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/downS.png" alt="{lang}wcf.global.scrollDown{/lang}" /> <span class="invisible">{lang}wcf.global.scrollDown{/lang}</span></a></li>
+                       </ul>
+               </nav>
+               <!-- /sub bar -->
+       </header>
+       <!-- /HEADER -->
+       
+       <!-- CONTENT -->
+       <div id="main" class="main">
+               <div>
+                       <aside class="sidebar">
+                               <!-- sub nav -->
+                               <nav id="sidebarMenu" class="sidebarMenu">
+                                       {* work-around for unknown core-object during WCFSetup *}
+                                       {if PACKAGE_ID}
+                                               {foreach from=$__wcf->getACPMenu()->getMenuItems('') item=parentMenuItem}
+                                                       <div data-parentMenuItem="{$parentMenuItem->menuItem}" id="{$parentMenuItem->menuItem}-container" style="display: none;">
+                                                               {foreach from=$__wcf->getACPMenu()->getMenuItems($parentMenuItem->menuItem) item=menuItem}
+                                                                       <h1 data-menuItem="{$menuItem->menuItem}" class="menuHeader">{lang}{@$menuItem->menuItem}{/lang}</h1>
+                                                                       <div class="sidebarMenuGroup">
+                                                                               <ul id="{$menuItem->menuItem}">
+                                                                                       {foreach from=$__wcf->getACPMenu()->getMenuItems($menuItem->menuItem) item=menuItemCategory}
+                                                                                               {if $__wcf->getACPMenu()->getMenuItems($menuItemCategory->menuItem)|count > 0}
+                                                                                                       {foreach from=$__wcf->getACPMenu()->getMenuItems($menuItemCategory->menuItem) item=subMenuItem}
+                                                                                                               <li data-menuItem="{$subMenuItem->menuItem}" id="{$subMenuItem->menuItem}"><a href="{$subMenuItem->getLink()}">{lang}{$subMenuItem->menuItem}{/lang}</a></li>
+                                                                                                       {/foreach}
+                                                                                               {else}
+                                                                                                       <li data-menuItem="{$menuItemCategory->menuItem}" id="{$menuItemCategory->menuItem}"><a href="{$menuItemCategory->getLink()}">{lang}{$menuItemCategory->menuItem}{/lang}</a></li>
+                                                                                               {/if}
+                                                                                       {/foreach}
+                                                                               </ul>
+                                                                       </div>
+                                                               {/foreach}
+                                                       </div>
+                                               {/foreach}
+                                       {/if}
+                               </nav>
+                               <!-- /sub nav -->
+                       </aside>
+                       
+                       <section id="content">
index cff6ff88ed53811ef3d8d3dcfac727ff270a4a7e..c30acad7f8910c11684ab20a6c8dbae3349dd9ea 100644 (file)
@@ -1,3 +1,3 @@
-{include file='header'}\r
-\r
+{include file='header'}
+
 {include file='footer'}
\ No newline at end of file
index 1ae856c113485d0182b8a67965d20c8184a3c3e1..a54cd9651fc99180e9718449142d652f1cf8d0f7 100644 (file)
@@ -1,61 +1,61 @@
-{capture assign='pageTitle'}{lang}wcf.acp.login{/lang}{/capture}\r
-{include file='setupHeader'}\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       onloadEvents.push(function() { if (!'{$username|encodeJS}' || '{$errorField}' == 'username') document.getElementById('username').focus(); else document.getElementById('password').focus(); });\r
-       //]]>\r
-</script>\r
-\r
-<img class="icon" src="{@RELATIVE_WCF_DIR}icon/loginXL.png" alt="" />\r
-\r
-<h1><b>{@$pageTitle}</b></h1>\r
-\r
-<hr />\r
-\r
-{if $errorField != ''}\r
-<p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=Login">\r
-       <fieldset>\r
-               <legend>{lang}wcf.acp.login.data{/lang}</legend>\r
-               \r
-               <div class="inner">\r
-                       <div{if $errorField == 'username'} class="errorField"{/if}>\r
-                               <label for="username">{lang}wcf.user.username{/lang}</label>\r
-                               <input type="text" class="inputText" id="username" name="username" value="{$username}" />\r
-                               {if $errorField == 'username'}\r
-                                       <p>\r
-                                               <img src="{@RELATIVE_WCF_DIR}icon/errorS.png" alt="" />\r
-                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                               {if $errorType == 'notFound'}{lang}wcf.user.error.username.notFound{/lang}{/if}\r
-                                       </p>\r
-                               {/if}\r
-                       </div>\r
-\r
-                       \r
-                       <div{if $errorField == 'password'} class="errorField"{/if}>\r
-                               <label for="password">{lang}wcf.user.password{/lang}</label>\r
-                               <input type="password" class="inputText" id="password" name="password" value="" />\r
-                               {if $errorField == 'password'}\r
-                                       <p>\r
-                                               <img src="{@RELATIVE_WCF_DIR}icon/errorS.png" alt="" />\r
-                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                               {if $errorType == 'false'}{lang}wcf.user.error.password.false{/lang}{/if}\r
-                                       </p>\r
-                               {/if}\r
-                       </div>\r
-                       \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-               </div>\r
-       </fieldset>\r
-       \r
-       <div class="nextButton">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="hidden" name="url" value="{$url}" />\r
-               {@SID_INPUT_TAG}\r
-       </div>\r
-</form>\r
-\r
+{capture assign='pageTitle'}{lang}wcf.acp.login{/lang}{/capture}
+{include file='setupHeader'}
+
+<script type="text/javascript">
+       //<![CDATA[
+       onloadEvents.push(function() { if (!'{$username|encodeJS}' || '{$errorField}' == 'username') document.getElementById('username').focus(); else document.getElementById('password').focus(); });
+       //]]>
+</script>
+
+<img class="icon" src="{@RELATIVE_WCF_DIR}icon/loginXL.png" alt="" />
+
+<h1><b>{@$pageTitle}</b></h1>
+
+<hr />
+
+{if $errorField != ''}
+<p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=Login">
+       <fieldset>
+               <legend>{lang}wcf.acp.login.data{/lang}</legend>
+               
+               <div class="inner">
+                       <div{if $errorField == 'username'} class="errorField"{/if}>
+                               <label for="username">{lang}wcf.user.username{/lang}</label>
+                               <input type="text" class="inputText" id="username" name="username" value="{$username}" />
+                               {if $errorField == 'username'}
+                                       <p>
+                                               <img src="{@RELATIVE_WCF_DIR}icon/errorS.png" alt="" />
+                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                               {if $errorType == 'notFound'}{lang}wcf.user.error.username.notFound{/lang}{/if}
+                                       </p>
+                               {/if}
+                       </div>
+
+                       
+                       <div{if $errorField == 'password'} class="errorField"{/if}>
+                               <label for="password">{lang}wcf.user.password{/lang}</label>
+                               <input type="password" class="inputText" id="password" name="password" value="" />
+                               {if $errorField == 'password'}
+                                       <p>
+                                               <img src="{@RELATIVE_WCF_DIR}icon/errorS.png" alt="" />
+                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                               {if $errorType == 'false'}{lang}wcf.user.error.password.false{/lang}{/if}
+                                       </p>
+                               {/if}
+                       </div>
+                       
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+               </div>
+       </fieldset>
+       
+       <div class="nextButton">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="hidden" name="url" value="{$url}" />
+               {@SID_INPUT_TAG}
+       </div>
+</form>
+
 {include file='setupFooter'}
\ No newline at end of file
index 97867733c3c3fe050d9b4e154c94b07775e6b66c..0a5232301e8f6c9f1295752cb781c50d72d1a8bd 100644 (file)
@@ -1,57 +1,57 @@
-{include file='header'}\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/loginL.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.masterPassword.enter{/lang}</h2>\r
-       </div>\r
-</div>\r
-\r
-\r
-{if $errorField != ''}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=MasterPassword">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.masterPassword.enter{/lang}</legend>\r
-                       \r
-                               <div class="formElement{if $errorField == 'masterPassword'} formError{/if}" id="masterPasswordDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="masterPassword">{lang}wcf.acp.masterPassword{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="password" class="inputText" id="masterPassword" name="masterPassword" value="{$masterPassword}" />\r
-                                               {if $errorField == 'masterPassword'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               {if $errorType == 'invalid'}{lang}wcf.acp.masterPassword.error.invalid{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="masterPasswordHelpMessage">\r
-                                               <p>{lang}wcf.acp.masterPassword.enter.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('masterPassword');\r
-                               //]]></script>\r
-                               \r
-                       </fieldset>\r
-                       \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-               </div>\r
-       </div>\r
-\r
-       <div class="formSubmit">\r
-               <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="url" value="{$url}" />\r
-       </div>\r
-</form>\r
+{include file='header'}
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/loginL.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.masterPassword.enter{/lang}</h2>
+       </div>
+</div>
+
+
+{if $errorField != ''}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=MasterPassword">
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.masterPassword.enter{/lang}</legend>
+                       
+                               <div class="formElement{if $errorField == 'masterPassword'} formError{/if}" id="masterPasswordDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="masterPassword">{lang}wcf.acp.masterPassword{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="password" class="inputText" id="masterPassword" name="masterPassword" value="{$masterPassword}" />
+                                               {if $errorField == 'masterPassword'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               {if $errorType == 'invalid'}{lang}wcf.acp.masterPassword.error.invalid{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="masterPasswordHelpMessage">
+                                               <p>{lang}wcf.acp.masterPassword.enter.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('masterPassword');
+                               //]]></script>
+                               
+                       </fieldset>
+                       
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+               </div>
+       </div>
+
+       <div class="formSubmit">
+               <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="url" value="{$url}" />
+       </div>
+</form>
 
 <script type="text/javascript">
        //<![CDATA[
@@ -60,5 +60,5 @@
        });
        //]]>
 </script>
-\r
+
 {include file='footer'}
\ No newline at end of file
index 315e3165dfd05df3f5e15206a9e345c9bb2c2524..9f0b33d1f15e35d08f25f6dd47735b00626d7bb7 100644 (file)
@@ -1,92 +1,92 @@
-{include file='header'}\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       $(function() {\r
-               $('#setPassword').click(function() {\r
-                       $('input[type="password"]').val($.proxy(function(index, element) {\r
-                               return $(this).text();\r
-                       }, this));\r
-               });\r
-       });\r
-       //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/loginL.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.masterPassword.init{/lang}</h2>\r
-       </div>\r
-</div>\r
-\r
-\r
-{if $errorField != ''}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=MasterPasswordInit">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.masterPassword.init{/lang}</legend>\r
-                       \r
-                               <div class="formElement{if $errorField == 'masterPassword'} formError{/if}" id="masterPasswordDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="masterPassword">{lang}wcf.acp.masterPassword{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="password" class="inputText" id="masterPassword" name="masterPassword" value="{$masterPassword}" />\r
-                                               {if $errorField == 'masterPassword'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               {if $errorType == 'notSecure'}{lang}wcf.acp.masterPassword.error.notSecure{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="masterPasswordHelpMessage">\r
-                                               <p>{lang}wcf.acp.masterPassword.init.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('masterPassword');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement{if $errorField == 'confirmMasterPassword'} formError{/if}">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="confirmMasterPassword">{lang}wcf.acp.masterPassword.confirm{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="password" class="inputText" id="confirmMasterPassword" name="confirmMasterPassword" value="{$confirmMasterPassword}" />\r
-                                               {if $errorField == 'confirmMasterPassword'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               {if $errorType == 'notEqual'}{lang}wcf.acp.masterPassword.error.notEqual{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                               </div>\r
-                               \r
-                               <div class="formElement">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="exampleMasterPassword">{lang}wcf.acp.masterPassword.example{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <p><a href="#" id="setPassword" title="{lang}wcf.acp.masterPassword.example.set{/lang}">{@$exampleMasterPassword}</a></p>\r
-                                               <input type="hidden" id="exampleMasterPassword" name="exampleMasterPassword" value="{@$exampleMasterPassword}" />\r
-                                       </div>\r
-                               </div>\r
-                       </fieldset>\r
-                       \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-               </div>\r
-       </div>\r
-\r
-       <div class="formSubmit">\r
-               <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="url" value="{$url}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<script type="text/javascript">
+       //<![CDATA[
+       $(function() {
+               $('#setPassword').click(function() {
+                       $('input[type="password"]').val($.proxy(function(index, element) {
+                               return $(this).text();
+                       }, this));
+               });
+       });
+       //]]>
+</script>
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/loginL.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.masterPassword.init{/lang}</h2>
+       </div>
+</div>
+
+
+{if $errorField != ''}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=MasterPasswordInit">
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.masterPassword.init{/lang}</legend>
+                       
+                               <div class="formElement{if $errorField == 'masterPassword'} formError{/if}" id="masterPasswordDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="masterPassword">{lang}wcf.acp.masterPassword{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="password" class="inputText" id="masterPassword" name="masterPassword" value="{$masterPassword}" />
+                                               {if $errorField == 'masterPassword'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               {if $errorType == 'notSecure'}{lang}wcf.acp.masterPassword.error.notSecure{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="masterPasswordHelpMessage">
+                                               <p>{lang}wcf.acp.masterPassword.init.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('masterPassword');
+                               //]]></script>
+                               
+                               <div class="formElement{if $errorField == 'confirmMasterPassword'} formError{/if}">
+                                       <div class="formFieldLabel">
+                                               <label for="confirmMasterPassword">{lang}wcf.acp.masterPassword.confirm{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="password" class="inputText" id="confirmMasterPassword" name="confirmMasterPassword" value="{$confirmMasterPassword}" />
+                                               {if $errorField == 'confirmMasterPassword'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               {if $errorType == 'notEqual'}{lang}wcf.acp.masterPassword.error.notEqual{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                               </div>
+                               
+                               <div class="formElement">
+                                       <div class="formFieldLabel">
+                                               <label for="exampleMasterPassword">{lang}wcf.acp.masterPassword.example{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <p><a href="#" id="setPassword" title="{lang}wcf.acp.masterPassword.example.set{/lang}">{@$exampleMasterPassword}</a></p>
+                                               <input type="hidden" id="exampleMasterPassword" name="exampleMasterPassword" value="{@$exampleMasterPassword}" />
+                                       </div>
+                               </div>
+                       </fieldset>
+                       
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+               </div>
+       </div>
+
+       <div class="formSubmit">
+               <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="url" value="{$url}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index db7645357eea551629cb034828bd8e9e8fac94e3..ee638a9b8b5e335a9f877fdbad3ded6eb919a48a 100644 (file)
@@ -1,75 +1,75 @@
-{include file='header'}\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       $(function() {\r
-               WCF.TabMenu.init();\r
-               new WCF.ACP.Options();\r
-       });\r
-       //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/optionL.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.option.category.{$category->categoryName}{/lang}</h1>\r
-               <h2>{lang}wcf.acp.option.category.{$category->categoryName}.description{/lang}</h2>\r
-       </hgroup>\r
-</header>\r
-\r
-{if $success|isset}\r
-       <p class="success">{lang}wcf.acp.option.success{/lang}</p>\r
-{/if}\r
-\r
-{if $errorField}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=Option&amp;categoryID={@$category->categoryID}">\r
-       <div class="tabMenuContainer" data-active="{$activeTabMenuItem}" data-store="activeTabMenuItem">\r
-               <nav>\r
-                       <ul class="tabMenu">\r
-                               {foreach from=$optionTree item=categoryLevel1}\r
-                                       <li><a href="#{@$categoryLevel1[object]->categoryName}">{*<span>*}{lang}wcf.acp.option.category.{@$categoryLevel1[object]->categoryName}{/lang}{*</span>*}</a></li>\r
-                               {/foreach}\r
-                       </ul>\r
-               </nav>\r
-               \r
-               {foreach from=$optionTree item=categoryLevel1}\r
-                       <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}">\r
-                               <div class="container-1">\r
-                                       <hgroup>\r
-                                               <h1 class="subHeading">{lang}wcf.acp.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</h1>\r
-                                               <h2 class="description">{lang}wcf.acp.option.category.{$categoryLevel1[object]->categoryName}.description{/lang}</h2>\r
-                                       </hgroup>\r
-                                       \r
-                                       {if $categoryLevel1[options]|count}\r
-                                               <fieldset>\r
-                                                       <legend>{lang}wcf.acp.option.category.{$categoryLevel1[object]->categoryName}{/lang}</legend>\r
-                                                       {include file='optionFieldList' options=$categoryLevel1[options] langPrefix='wcf.acp.option.'}\r
-                                               </fieldset>\r
-                                       {/if}\r
-                                       \r
-                                       {if $categoryLevel1[categories]|count}\r
-                                               {foreach from=$categoryLevel1[categories] item=categoryLevel2}\r
-                                                       <fieldset>\r
-                                                               <legend>{lang}wcf.acp.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</legend>\r
-                                                               <p class="description">{lang}wcf.acp.option.category.{$categoryLevel2[object]->categoryName}.description{/lang}</p>\r
-                                                               \r
-                                                               {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.acp.option.'}\r
-                                                       </fieldset>\r
-                                               {/foreach}\r
-                                       {/if}\r
-                               </div>\r
-                       </div>\r
-               {/foreach}\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" id="activeTabMenuItem" name="activeTabMenuItem" value="{$activeTabMenuItem}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+<script type="text/javascript">
+       //<![CDATA[
+       $(function() {
+               WCF.TabMenu.init();
+               new WCF.ACP.Options();
+       });
+       //]]>
+</script>
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/optionL.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.option.category.{$category->categoryName}{/lang}</h1>
+               <h2>{lang}wcf.acp.option.category.{$category->categoryName}.description{/lang}</h2>
+       </hgroup>
+</header>
+
+{if $success|isset}
+       <p class="success">{lang}wcf.acp.option.success{/lang}</p>
+{/if}
+
+{if $errorField}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=Option&amp;categoryID={@$category->categoryID}">
+       <div class="tabMenuContainer" data-active="{$activeTabMenuItem}" data-store="activeTabMenuItem">
+               <nav>
+                       <ul class="tabMenu">
+                               {foreach from=$optionTree item=categoryLevel1}
+                                       <li><a href="#{@$categoryLevel1[object]->categoryName}">{*<span>*}{lang}wcf.acp.option.category.{@$categoryLevel1[object]->categoryName}{/lang}{*</span>*}</a></li>
+                               {/foreach}
+                       </ul>
+               </nav>
+               
+               {foreach from=$optionTree item=categoryLevel1}
+                       <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}">
+                               <div class="container-1">
+                                       <hgroup>
+                                               <h1 class="subHeading">{lang}wcf.acp.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</h1>
+                                               <h2 class="description">{lang}wcf.acp.option.category.{$categoryLevel1[object]->categoryName}.description{/lang}</h2>
+                                       </hgroup>
+                                       
+                                       {if $categoryLevel1[options]|count}
+                                               <fieldset>
+                                                       <legend>{lang}wcf.acp.option.category.{$categoryLevel1[object]->categoryName}{/lang}</legend>
+                                                       {include file='optionFieldList' options=$categoryLevel1[options] langPrefix='wcf.acp.option.'}
+                                               </fieldset>
+                                       {/if}
+                                       
+                                       {if $categoryLevel1[categories]|count}
+                                               {foreach from=$categoryLevel1[categories] item=categoryLevel2}
+                                                       <fieldset>
+                                                               <legend>{lang}wcf.acp.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</legend>
+                                                               <p class="description">{lang}wcf.acp.option.category.{$categoryLevel2[object]->categoryName}.description{/lang}</p>
+                                                               
+                                                               {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.acp.option.'}
+                                                       </fieldset>
+                                               {/foreach}
+                                       {/if}
+                               </div>
+                       </div>
+               {/foreach}
+       </div>
+       
+       <div class="formSubmit">
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" id="activeTabMenuItem" name="activeTabMenuItem" value="{$activeTabMenuItem}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index f0a147459a9eb6a3207219bd5720a7bfdb506ac7..af0c56239ae2612fd4f350e6ab6c8c29420edc4a 100644 (file)
@@ -1,22 +1,22 @@
-{foreach from=$options item=optionData}\r
-       {assign var=option value=$optionData[object]}\r
-       {if $errorType|is_array && $errorType[$option->optionName]|isset}\r
-               {assign var=error value=$errorType[$option->optionName]}\r
-       {else}\r
-               {assign var=error value=''}\r
-       {/if}\r
-       <dl class="{$option->optionName}Input">\r
-               <dt><label for="{$option->optionName}">{lang}{@$langPrefix}{$option->optionName}{/lang}</label></dt>\r
-               <dd>{@$optionData[html]}</dd>\r
-               {if $error}\r
-                       <p class="innerError">\r
-                               {if $error == 'empty'}\r
-                                       {lang}wcf.global.error.empty{/lang}\r
-                               {else}  \r
-                                       {lang}wcf.user.option.error.{$error}{/lang}\r
-                               {/if}\r
-                       </p>\r
-               {/if}\r
-               <p>{lang}{@$langPrefix}{$option->optionName}.description{/lang}</p>\r
-       </dl>   \r
+{foreach from=$options item=optionData}
+       {assign var=option value=$optionData[object]}
+       {if $errorType|is_array && $errorType[$option->optionName]|isset}
+               {assign var=error value=$errorType[$option->optionName]}
+       {else}
+               {assign var=error value=''}
+       {/if}
+       <dl class="{$option->optionName}Input">
+               <dt><label for="{$option->optionName}">{lang}{@$langPrefix}{$option->optionName}{/lang}</label></dt>
+               <dd>{@$optionData[html]}</dd>
+               {if $error}
+                       <p class="innerError">
+                               {if $error == 'empty'}
+                                       {lang}wcf.global.error.empty{/lang}
+                               {else}  
+                                       {lang}wcf.user.option.error.{$error}{/lang}
+                               {/if}
+                       </p>
+               {/if}
+               <p>{lang}{@$langPrefix}{$option->optionName}.description{/lang}</p>
+       </dl>   
 {/foreach}
\ No newline at end of file
index 7ed40a7bdf611b45c2f9f254d65b0f61e0c91f9e..87b2e945c1c05feeb515aacfcee03c1ac44aa165 100644 (file)
@@ -1,80 +1,80 @@
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/optionImportAndExportL.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.option.importAndExport{/lang}</h1>\r
-       </hgroup>\r
-</header>\r
-\r
-{if $success|isset}\r
-       <p class="success">{lang}wcf.acp.option.import.success{/lang}</p>       \r
-{/if}\r
-\r
-{if $errorField != ''}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=OptionImport" enctype="multipart/form-data">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.option.import{/lang}</legend>\r
-                       \r
-                               <div class="formElement{if $errorField == 'optionImport'} formError{/if}" id="optionImportDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="optionImport">{lang}wcf.acp.option.import.upload{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="file" id="optionImport" name="optionImport" value="" />\r
-                                               {if $errorField == 'optionImport'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               {if $errorType == 'importFailed'}{lang}wcf.acp.option.import.error.importFailed{/lang}{/if}\r
-                                                               {if $errorType == 'uploadFailed'}{lang}wcf.acp.option.import.error.uploadFailed{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="optionImportHelpMessage">\r
-                                               <p>{lang}wcf.acp.option.import.upload.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('optionImport');\r
-                               //]]></script>\r
-                       </fieldset>\r
-                       \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-               </div>\r
-       </div>\r
-\r
-       <div class="formSubmit">\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-       </div>\r
-</form>\r
-\r
-<div class="border content">\r
-       <div class="container-1">\r
-               <fieldset>\r
-                       <legend>{lang}wcf.acp.option.export{/lang}</legend>\r
-               \r
-                       <div class="formElement" id="optionExportDiv">\r
-                               <div class="formField">\r
-                                       <a href="index.php?action=OptionExport{@SID_ARG_2ND}" id="optionExport">{lang}wcf.acp.option.export.download{/lang}</a>\r
-                               </div>\r
-                               <div class="formFieldDesc hidden" id="optionExportHelpMessage">\r
-                                       <p>{lang}wcf.acp.option.export.download.description{/lang}</p>\r
-                               </div>\r
-                       </div>\r
-                       <script type="text/javascript">//<![CDATA[\r
-                               inlineHelp.register('optionExport');\r
-                       //]]></script>\r
-               </fieldset>\r
-               \r
-               {if $additionalFields|isset}{@$additionalFields}{/if}\r
-       </div>\r
-</div>\r
-\r
+{include file='header'}
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/optionImportAndExportL.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.option.importAndExport{/lang}</h1>
+       </hgroup>
+</header>
+
+{if $success|isset}
+       <p class="success">{lang}wcf.acp.option.import.success{/lang}</p>       
+{/if}
+
+{if $errorField != ''}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=OptionImport" enctype="multipart/form-data">
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.option.import{/lang}</legend>
+                       
+                               <div class="formElement{if $errorField == 'optionImport'} formError{/if}" id="optionImportDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="optionImport">{lang}wcf.acp.option.import.upload{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="file" id="optionImport" name="optionImport" value="" />
+                                               {if $errorField == 'optionImport'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               {if $errorType == 'importFailed'}{lang}wcf.acp.option.import.error.importFailed{/lang}{/if}
+                                                               {if $errorType == 'uploadFailed'}{lang}wcf.acp.option.import.error.uploadFailed{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="optionImportHelpMessage">
+                                               <p>{lang}wcf.acp.option.import.upload.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('optionImport');
+                               //]]></script>
+                       </fieldset>
+                       
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+               </div>
+       </div>
+
+       <div class="formSubmit">
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />
+               {@SID_INPUT_TAG}
+       </div>
+</form>
+
+<div class="border content">
+       <div class="container-1">
+               <fieldset>
+                       <legend>{lang}wcf.acp.option.export{/lang}</legend>
+               
+                       <div class="formElement" id="optionExportDiv">
+                               <div class="formField">
+                                       <a href="index.php?action=OptionExport{@SID_ARG_2ND}" id="optionExport">{lang}wcf.acp.option.export.download{/lang}</a>
+                               </div>
+                               <div class="formFieldDesc hidden" id="optionExportHelpMessage">
+                                       <p>{lang}wcf.acp.option.export.download.description{/lang}</p>
+                               </div>
+                       </div>
+                       <script type="text/javascript">//<![CDATA[
+                               inlineHelp.register('optionExport');
+                       //]]></script>
+               </fieldset>
+               
+               {if $additionalFields|isset}{@$additionalFields}{/if}
+       </div>
+</div>
+
 {include file='footer'}
\ No newline at end of file
index 7e617795628c06f1a43cecf9aa9a30c9876768cb..8d10251bb032f9ec85afb5382b2ea052fbd19ab7 100644 (file)
@@ -1,3 +1,3 @@
-<input {if $disableOptions || $enableOptions}class="enablesOptions" data-disableOptions="[ {@$disableOptions}]" data-enableOptions="[ {@$enableOptions}]" {/if}\r
-id="{$option->optionName}" type="checkbox" name="values[{$option->optionName}]" value="1"\r
+<input {if $disableOptions || $enableOptions}class="enablesOptions" data-disableOptions="[ {@$disableOptions}]" data-enableOptions="[ {@$enableOptions}]" {/if}
+id="{$option->optionName}" type="checkbox" name="values[{$option->optionName}]" value="1"
 {if $value} checked="checked"{/if} />
\ No newline at end of file
index 0c4b9d6f70df4a3ba2d5994139ad5262076e7d74..768b7272d4a663a6e5fc26b2085f33cf70167b3c 100644 (file)
@@ -1,11 +1,11 @@
-<ul class="formOptionsLong smallFont">\r
-       {foreach from=$selectOptions key=key item=selectOption}\r
-               <li>\r
-                       <label><input type="radio" name="values[{$option->optionName}]" value="{$key}"{if $value == $key} checked="checked"{/if} /> {lang}{@$selectOption}{/lang}</label>\r
-               </li>\r
-       {/foreach}\r
-       <li>\r
-               <label><input type="radio" name="values[{$option->optionName}]" value=""{if $value == $customValue} checked="checked"{/if} /></label>\r
-               <input style="width: 400px" id="{$option->optionName}_custom" type="text" class="inputText" name="values[{$option->optionName}_custom]" value="{$customValue}" />\r
-       </li>\r
+<ul class="formOptionsLong smallFont">
+       {foreach from=$selectOptions key=key item=selectOption}
+               <li>
+                       <label><input type="radio" name="values[{$option->optionName}]" value="{$key}"{if $value == $key} checked="checked"{/if} /> {lang}{@$selectOption}{/lang}</label>
+               </li>
+       {/foreach}
+       <li>
+               <label><input type="radio" name="values[{$option->optionName}]" value=""{if $value == $customValue} checked="checked"{/if} /></label>
+               <input style="width: 400px" id="{$option->optionName}_custom" type="text" class="inputText" name="values[{$option->optionName}_custom]" value="{$customValue}" />
+       </li>
 </ul>
\ No newline at end of file
index 2668c3f5698cd71aabdfdb102e43246900aa6a76..b9ad12a41babd6cd9cbaef51d06ac99513d2c405 100644 (file)
@@ -1,26 +1,26 @@
-<div class="floatContainer">\r
-       {foreach from=$dateInputOrder item=element}\r
-               <div class="floatedElement">\r
-                       <label for="{$optionData.optionName}{$element|ucfirst}">{lang}wcf.global.date.{$element}{/lang}</label>\r
-                       \r
-                       {if $element == 'day'}\r
-                               <select id="{$optionData.optionName}Day" name="values[{$optionData.optionName}][day]">\r
-                                       {htmlOptions options=$days selected=$day}\r
-                               </select>\r
-                       {/if}\r
-                       \r
-                       {if $element == 'month'}\r
-                               <select id="{$optionData.optionName}Month" name="values[{$optionData.optionName}][month]">\r
-                                       {htmlOptions options=$months selected=$month}\r
-                               </select>\r
-                       {/if}\r
-                       \r
-                       {if $element == 'year'}\r
-                               <input id="{$optionData.optionName}Year" class="inputText fourDigitInput" type="text" name="values[{$optionData.optionName}][year]" value="{$year}" maxlength="4" />\r
-                       {/if}\r
-               </div>\r
-       {/foreach}\r
-</div>\r
-{if !$yearRequired}\r
-       <p class="smallFont light">{lang}wcf.global.date.year.notRequired{/lang}</p>\r
+<div class="floatContainer">
+       {foreach from=$dateInputOrder item=element}
+               <div class="floatedElement">
+                       <label for="{$optionData.optionName}{$element|ucfirst}">{lang}wcf.global.date.{$element}{/lang}</label>
+                       
+                       {if $element == 'day'}
+                               <select id="{$optionData.optionName}Day" name="values[{$optionData.optionName}][day]">
+                                       {htmlOptions options=$days selected=$day}
+                               </select>
+                       {/if}
+                       
+                       {if $element == 'month'}
+                               <select id="{$optionData.optionName}Month" name="values[{$optionData.optionName}][month]">
+                                       {htmlOptions options=$months selected=$month}
+                               </select>
+                       {/if}
+                       
+                       {if $element == 'year'}
+                               <input id="{$optionData.optionName}Year" class="inputText fourDigitInput" type="text" name="values[{$optionData.optionName}][year]" value="{$year}" maxlength="4" />
+                       {/if}
+               </div>
+       {/foreach}
+</div>
+{if !$yearRequired}
+       <p class="smallFont light">{lang}wcf.global.date.year.notRequired{/lang}</p>
 {/if}
\ No newline at end of file
index 56463312953fada7369ddf273274bf04689f3f2c..11bbeb1156f5dc6666b11ccfdd25e468430a11a1 100644 (file)
@@ -1,5 +1,5 @@
-<select name="values[{$optionData.optionName}][]" id="{$optionData.optionName}" multiple="multiple" size="{if $options|count > 10}10{else}{@$options|count}{/if}">\r
-{foreach from=$options item=option key=key}\r
-       <option value="{$key}"{if $key|in_array:$optionData.optionValue} selected="selected"{/if}>{lang}{@$option}{/lang}</option>\r
-{/foreach}\r
+<select name="values[{$optionData.optionName}][]" id="{$optionData.optionName}" multiple="multiple" size="{if $options|count > 10}10{else}{@$options|count}{/if}">
+{foreach from=$options item=option key=key}
+       <option value="{$key}"{if $key|in_array:$optionData.optionValue} selected="selected"{/if}>{lang}{@$option}{/lang}</option>
+{/foreach}
 </select>
\ No newline at end of file
index c115f199f6cce60ecb42d92f59eccd5c28759416..727083a1849b44a4ffbd78fa9451e292521eabe5 100644 (file)
@@ -1,10 +1,10 @@
-<ul class="formOptionsLong">\r
-       {foreach from=$selectOptions key=key item=selectOption}\r
-               <li>\r
-                       <label><input {if $disableOptions[$key] || $enableOptions[$key]}class="enablesOptions" data-disableOptions="[ {@$disableOptions[$key]}]" data-enableOptions="[ {@$enableOptions[$key]}]" {/if}\r
-                       type="radio" name="values[{$option->optionName}]" value="{$key}"\r
-                       {if $value == $key} checked="checked"{/if} />\r
-                       {lang}{@$selectOption}{/lang}</label>\r
-               </li>\r
-       {/foreach}\r
+<ul class="formOptionsLong">
+       {foreach from=$selectOptions key=key item=selectOption}
+               <li>
+                       <label><input {if $disableOptions[$key] || $enableOptions[$key]}class="enablesOptions" data-disableOptions="[ {@$disableOptions[$key]}]" data-enableOptions="[ {@$enableOptions[$key]}]" {/if}
+                       type="radio" name="values[{$option->optionName}]" value="{$key}"
+                       {if $value == $key} checked="checked"{/if} />
+                       {lang}{@$selectOption}{/lang}</label>
+               </li>
+       {/foreach}
 </ul>
\ No newline at end of file
index 43f398bb9958705a12726b745297dfe60c5d5afa..2fefe2bf327d1bff244f3f6e99bcaca932871bf9 100644 (file)
@@ -1,5 +1,5 @@
-<select name="values[{$option->optionName}]" id="{$option->optionName}">\r
-{foreach from=$selectOptions key=key item=selectOption}\r
-       <option value="{$key}"{if $value == $key} selected="selected"{/if}>{lang}{@$selectOption}{/lang}</option>\r
-{/foreach}\r
+<select name="values[{$option->optionName}]" id="{$option->optionName}">
+{foreach from=$selectOptions key=key item=selectOption}
+       <option value="{$key}"{if $value == $key} selected="selected"{/if}>{lang}{@$selectOption}{/lang}</option>
+{/foreach}
 </select>
\ No newline at end of file
index d23c0341d584c811b9edb79fb7e3f9cbd2621eee..2664b108a335202fdd020ad5b4c5f7993b6a40cf 100644 (file)
@@ -1,2 +1,2 @@
-<input id="{$option->optionName}" type="{@$inputType}" class="inputText" name="values[{$option->optionName}]" \r
+<input id="{$option->optionName}" type="{@$inputType}" class="inputText" name="values[{$option->optionName}]" 
 value="{$value}" />
\ No newline at end of file
index 32914537b31889baf48e37bd5a3293044cd6e51c..dcf3cdd9ce2bc1030f88eb5ac442cbcebab302cc 100644 (file)
-{include file='header'}\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       $(function() {\r
-               var packageInstallation = new WCF.ACP.PackageInstallation('install', {@$queueID}, true);\r
-       });\r
-       //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/package{@$action|ucfirst}L.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{$archive->getPackageInfo('packageName')}</h2>\r
-               <p>{$archive->getPackageInfo('packageDescription')}</p>\r
-       </div>\r
-</div>\r
-\r
-{if $missingPackages > 0}\r
-       <p class="error">{lang}wcf.acp.package.install.error{/lang}</p>\r
-{/if}\r
-\r
-{if $excludingPackages|count > 0}\r
-       <div class="error">{lang}wcf.acp.package.install.error.excludingPackages{/lang}\r
-               <ul>\r
-               {foreach from=$excludingPackages item=excludingPackage}\r
-                       <li>{lang}wcf.acp.package.install.error.excludingPackages.excludingPackage{/lang}</li>\r
-               {/foreach}\r
-               </ul>\r
-       </div>\r
-{/if}\r
-\r
-{if $excludedPackages|count > 0}\r
-       <div class="error">{lang}wcf.acp.package.install.error.excludedPackages{/lang}\r
-               <ul>\r
-               {foreach from=$excludedPackages item=excludedPackage}\r
-                       <li>{lang}wcf.acp.package.install.error.excludedPackages.excludedPackage{/lang}</li>\r
-               {/foreach}\r
-               </ul>\r
-       </div>\r
-{/if}\r
-\r
-<fieldset>\r
-       <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>\r
-\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>\r
-               <p class="formField">{$archive->getPackageInfo('name')}</p>\r
-       </div>\r
-       \r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.install.version{/lang}</p>\r
-               <p class="formField">{$archive->getPackageInfo('version')}</p>\r
-       </div>\r
-\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>\r
-               <p class="formField">{@$archive->getPackageInfo('date')|date}</p>\r
-       </div>\r
-\r
-       {if $archive->getPackageInfo('packageURL') != ''}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>\r
-                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$archive->getPackageInfo('packageURL')|rawurlencode}" class="externalURL">{$archive->getPackageInfo('packageURL')}</a></p>\r
-               </div>\r
-       {/if}\r
-       \r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>\r
-               <p class="formField">{if $archive->getPackageInfo('authorURL')}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$archive->getPackageInfo('authorURL')|rawurlencode}" class="externalURL">{$archive->getPackageInfo('author')}</a>{else}{$archive->getPackageInfo('author')}{/if}</p>\r
-       </div>\r
-       \r
-       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-</fieldset>\r
-\r
-{if $updatableInstances|count > 0}\r
-       <p class="warning" style="margin: 20px 0 10px 0">{lang}wcf.acp.package.install.updatableInstances.warning{/lang}</p>\r
-       \r
-       <div class="border titleBarPanel">\r
-               <div class="containerHead">\r
-                       <h3>{lang}wcf.acp.package.install.updatableInstances{/lang}</h3>\r
-                       <p class="smallFont light">{lang}wcf.acp.package.install.updatableInstances.description{/lang}</p>\r
-               </div>\r
-       </div>\r
-       <div class="border borderMarginRemove">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                       {foreach from=$updatableInstances item=$package}\r
-                               <tr class="{cycle values="container-1,container-2"}">\r
-                                       <td class="columnText"><a href="index.php?page=Package&amp;action=install&amp;queueID={@$queueID}&amp;step=changeToUpdate&amp;updatePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>\r
-                                       <td class="columnText">{$package.packageVersion}</td>\r
-                               </tr>\r
-                       {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-{/if}\r
-\r
-{if $requiredPackages|count > 0}\r
-       <div class="border titleBarPanel">\r
-               <div class="containerHead">\r
-                       <h3>{lang}wcf.acp.package.view.requiredPackages{/lang}</h3>\r
-                       <p class="smallFont light">{lang}wcf.acp.package.view.requiredPackages.description{/lang}</p>\r
-               </div>\r
-       </div>\r
-       <div class="border borderMarginRemove">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                       {foreach from=$requiredPackages item=$package}\r
-                               <tr class="{cycle values="container-1,container-2"}">\r
-                                       <td class="columnText">{lang}wcf.acp.package.install.packageName{/lang}</td>\r
-                                       <td class="columnText">{if $package.minversion|isset}{$package.minversion}{/if}</td>\r
-                               </tr>\r
-                       {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-{/if}\r
-\r
-<div class="formSubmit">\r
-       <input type="button" accesskey="c" value="{lang}wcf.global.button.back{/lang}" onclick="document.location.href=fixURL('index.php?page=Package&amp;action={@$action}&amp;queueID={@$queueID}&amp;step=cancel{@SID_ARG_2ND}')" />\r
-       \r
-       {if $missingPackages == 0 && $excludingPackages|count == 0 && $excludedPackages|count == 0}\r
-               <input type="button" accesskey="s" id="submitButton" value="{lang}wcf.global.button.next{/lang}" />\r
-       {/if}\r
-</div>\r
-\r
+{include file='header'}
+
+<script type="text/javascript">
+       //<![CDATA[
+       $(function() {
+               var packageInstallation = new WCF.ACP.PackageInstallation('install', {@$queueID}, true);
+       });
+       //]]>
+</script>
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/package{@$action|ucfirst}L.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{$archive->getPackageInfo('packageName')}</h2>
+               <p>{$archive->getPackageInfo('packageDescription')}</p>
+       </div>
+</div>
+
+{if $missingPackages > 0}
+       <p class="error">{lang}wcf.acp.package.install.error{/lang}</p>
+{/if}
+
+{if $excludingPackages|count > 0}
+       <div class="error">{lang}wcf.acp.package.install.error.excludingPackages{/lang}
+               <ul>
+               {foreach from=$excludingPackages item=excludingPackage}
+                       <li>{lang}wcf.acp.package.install.error.excludingPackages.excludingPackage{/lang}</li>
+               {/foreach}
+               </ul>
+       </div>
+{/if}
+
+{if $excludedPackages|count > 0}
+       <div class="error">{lang}wcf.acp.package.install.error.excludedPackages{/lang}
+               <ul>
+               {foreach from=$excludedPackages item=excludedPackage}
+                       <li>{lang}wcf.acp.package.install.error.excludedPackages.excludedPackage{/lang}</li>
+               {/foreach}
+               </ul>
+       </div>
+{/if}
+
+<fieldset>
+       <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>
+
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>
+               <p class="formField">{$archive->getPackageInfo('name')}</p>
+       </div>
+       
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.install.version{/lang}</p>
+               <p class="formField">{$archive->getPackageInfo('version')}</p>
+       </div>
+
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>
+               <p class="formField">{@$archive->getPackageInfo('date')|date}</p>
+       </div>
+
+       {if $archive->getPackageInfo('packageURL') != ''}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>
+                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$archive->getPackageInfo('packageURL')|rawurlencode}" class="externalURL">{$archive->getPackageInfo('packageURL')}</a></p>
+               </div>
+       {/if}
+       
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>
+               <p class="formField">{if $archive->getPackageInfo('authorURL')}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$archive->getPackageInfo('authorURL')|rawurlencode}" class="externalURL">{$archive->getPackageInfo('author')}</a>{else}{$archive->getPackageInfo('author')}{/if}</p>
+       </div>
+       
+       {if $additionalFields|isset}{@$additionalFields}{/if}
+</fieldset>
+
+{if $updatableInstances|count > 0}
+       <p class="warning" style="margin: 20px 0 10px 0">{lang}wcf.acp.package.install.updatableInstances.warning{/lang}</p>
+       
+       <div class="border titleBarPanel">
+               <div class="containerHead">
+                       <h3>{lang}wcf.acp.package.install.updatableInstances{/lang}</h3>
+                       <p class="smallFont light">{lang}wcf.acp.package.install.updatableInstances.description{/lang}</p>
+               </div>
+       </div>
+       <div class="border borderMarginRemove">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+                               </tr>
+                       </thead>
+                       <tbody>
+                       {foreach from=$updatableInstances item=$package}
+                               <tr class="{cycle values="container-1,container-2"}">
+                                       <td class="columnText"><a href="index.php?page=Package&amp;action=install&amp;queueID={@$queueID}&amp;step=changeToUpdate&amp;updatePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>
+                                       <td class="columnText">{$package.packageVersion}</td>
+                               </tr>
+                       {/foreach}
+                       </tbody>
+               </table>
+       </div>
+{/if}
+
+{if $requiredPackages|count > 0}
+       <div class="border titleBarPanel">
+               <div class="containerHead">
+                       <h3>{lang}wcf.acp.package.view.requiredPackages{/lang}</h3>
+                       <p class="smallFont light">{lang}wcf.acp.package.view.requiredPackages.description{/lang}</p>
+               </div>
+       </div>
+       <div class="border borderMarginRemove">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+                               </tr>
+                       </thead>
+                       <tbody>
+                       {foreach from=$requiredPackages item=$package}
+                               <tr class="{cycle values="container-1,container-2"}">
+                                       <td class="columnText">{lang}wcf.acp.package.install.packageName{/lang}</td>
+                                       <td class="columnText">{if $package.minversion|isset}{$package.minversion}{/if}</td>
+                               </tr>
+                       {/foreach}
+                       </tbody>
+               </table>
+       </div>
+{/if}
+
+<div class="formSubmit">
+       <input type="button" accesskey="c" value="{lang}wcf.global.button.back{/lang}" onclick="document.location.href=fixURL('index.php?page=Package&amp;action={@$action}&amp;queueID={@$queueID}&amp;step=cancel{@SID_ARG_2ND}')" />
+       
+       {if $missingPackages == 0 && $excludingPackages|count == 0 && $excludedPackages|count == 0}
+               <input type="button" accesskey="s" id="submitButton" value="{lang}wcf.global.button.next{/lang}" />
+       {/if}
+</div>
+
 {include file='footer'}
\ No newline at end of file
index aaf131d9b7c12be7a82b78151808575e3ac7df9b..b9d9ec5ac488f8b4121054ef1943b4cb865827b8 100644 (file)
@@ -1,10 +1,10 @@
-{include file='header' templateName='packageInstallationSetup'}\r
-\r
+{include file='header' templateName='packageInstallationSetup'}
+
 <script type="text/javascript">
-       //<![CDATA[\r
-       $installation = new WCF.ACP.PackageInstallation('install', {@$queueID}, false);\r
-       $installation.prepareInstallation();\r
+       //<![CDATA[
+       $installation = new WCF.ACP.PackageInstallation('install', {@$queueID}, false);
+       $installation.prepareInstallation();
        //]]>
-</script>\r
-\r
+</script>
+
 {include file='footer'}
\ No newline at end of file
index 24c1c2994e2fbf2f514c7b5639f65f9fa2a09efa..688281c6f6439b40aaa1aa541bf2955bf7ce244c 100644 (file)
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       $(function() {\r
-               WCF.Language.add('wcf.acp.package.view.button.uninstall.sure', '{lang}wcf.acp.package.view.button.uninstall.sure{/lang}');\r
-               \r
-               new WCF.ACP.PackageUninstallation($('.packageRow .uninstallButton'));\r
-       });\r
-       //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/packageL.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.package.list{/lang}</h1>\r
-       </hgroup>\r
-</header>\r
-\r
-<div class="contentHeader">\r
-       {pages print=true assign=pagesLinks link="index.php?page=PackageList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}\r
-\r
-       {if $__wcf->session->getPermission('admin.system.package.canInstallPackage') || $additionalLargeButtons|isset}\r
-               <nav class="largeButtons">\r
-                       <ul>\r
-                               {if $__wcf->session->getPermission('admin.system.package.canInstallPackage')}<li><a href="index.php?form=PackageStartInstall&amp;action=install{@SID_ARG_2ND}" title="{lang}wcf.acp.package.startInstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageInstallM.png" alt="" /> <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>{/if}\r
-                               {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-                       </ul>\r
-               </nav>\r
-       {/if}\r
-</div>\r
-\r
-{if $packages|count > 0}\r
-       <div class="border titleBarPanel">\r
-               <div class="containerHead"><h3>{lang}wcf.acp.package.list.count{/lang}</h3></div>\r
-       </div>\r
-       <div class="border borderMarginRemove">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th colspan="2"{if $sortField == 'packageID'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=packageID&amp;sortOrder={if $sortField == 'packageID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.id{/lang}{if $sortField == 'packageID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th colspan="2"{if $sortField == 'packageName'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=packageName&amp;sortOrder={if $sortField == 'packageName' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.name{/lang}{if $sortField == 'packageName'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th{if $sortField == 'author'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=author&amp;sortOrder={if $sortField == 'author' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.author{/lang}{if $sortField == 'author'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th{if $sortField == 'packageVersion'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=packageVersion&amp;sortOrder={if $sortField == 'packageVersion' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.version{/lang}{if $sortField == 'packageVersion'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th{if $sortField == 'updateDate'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=updateDate&amp;sortOrder={if $sortField == 'updateDate' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.updateDate{/lang}{if $sortField == 'updateDate'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       \r
-                                       {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                               {foreach from=$packages item=$package}\r
-                                       <tr class="packageRow {cycle values="container-1,container-2"}">\r
-                                               <td class="columnIcon">\r
-                                                       {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}\r
-                                                               <a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package->packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>\r
-                                                       {else}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />\r
-                                                       {/if}\r
-                                                       {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package->package != 'com.woltlab.wcf' && $package->packageID != PACKAGE_ID}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" class="uninstallButton" data-objectID="{@$package->packageID}" />\r
-                                                       {else}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />\r
-                                                       {/if}\r
-                                                       \r
-                                                       {if $additionalButtons[$package->packageID]|isset}{@$additionalButtons[$package->packageID]}{/if}\r
-                                               </td>\r
-                                               <td class="columnID">{@$package->packageID}</td>\r
-                                               <td class="columnIcon">\r
-                                                       {if $package->standalone}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />\r
-                                                       {elseif $package->isPlugin()}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />\r
-                                                       {else}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />\r
-                                                       {/if}\r
-                                               </td>\r
-                                               <td class="columnText" title="{$package->packageDescription}" id="packageName{@$package->packageID}">\r
-                                                       <a href="index.php?page=PackageView&amp;activePackageID={@$package->packageID}{@SID_ARG_2ND}"><span>{$package->getName()}{if $package->instanceNo > 1 && $package->instanceName == ''} (#{#$package->instanceNo}){/if}</span></a>\r
-                                               </td>\r
-                                               <td class="columnText">{if $package->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->authorURL|rawurlencode}" class="externalURL">{$package->author}</a>{else}{$package->author}{/if}</td>\r
-                                               <td class="columnText">{$package->packageVersion}</td>\r
-                                               <td class="columnDate">{@$package->updateDate|time}</td>\r
-                                               \r
-                                               {if $additionalColumns[$package->packageID]|isset}{@$additionalColumns[$package->packageID]}{/if}\r
-                                       </tr>\r
-                               {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-{/if}\r
-\r
-<div class="contentFooter">\r
-       {@$pagesLinks}\r
-       \r
-       {if $__wcf->session->getPermission('admin.system.package.canInstallPackage') || $additionalLargeButtons|isset}\r
-               <nav class="largeButtons">\r
-                       <ul>\r
-                               {if $__wcf->session->getPermission('admin.system.package.canInstallPackage')}<li><a href="index.php?form=PackageStartInstall&amp;action=install{@SID_ARG_2ND}" title="{lang}wcf.acp.package.startInstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageInstallM.png" alt="" /> <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>{/if}\r
-                               {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-                       </ul>\r
-               </nav>\r
-       {/if}\r
-</div>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>
+<script type="text/javascript">
+       //<![CDATA[
+       $(function() {
+               WCF.Language.add('wcf.acp.package.view.button.uninstall.sure', '{lang}wcf.acp.package.view.button.uninstall.sure{/lang}');
+               
+               new WCF.ACP.PackageUninstallation($('.packageRow .uninstallButton'));
+       });
+       //]]>
+</script>
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/packageL.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.package.list{/lang}</h1>
+       </hgroup>
+</header>
+
+<div class="contentHeader">
+       {pages print=true assign=pagesLinks link="index.php?page=PackageList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}
+
+       {if $__wcf->session->getPermission('admin.system.package.canInstallPackage') || $additionalLargeButtons|isset}
+               <nav class="largeButtons">
+                       <ul>
+                               {if $__wcf->session->getPermission('admin.system.package.canInstallPackage')}<li><a href="index.php?form=PackageStartInstall&amp;action=install{@SID_ARG_2ND}" title="{lang}wcf.acp.package.startInstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageInstallM.png" alt="" /> <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>{/if}
+                               {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+                       </ul>
+               </nav>
+       {/if}
+</div>
+
+{if $packages|count > 0}
+       <div class="border titleBarPanel">
+               <div class="containerHead"><h3>{lang}wcf.acp.package.list.count{/lang}</h3></div>
+       </div>
+       <div class="border borderMarginRemove">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th colspan="2"{if $sortField == 'packageID'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=packageID&amp;sortOrder={if $sortField == 'packageID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.id{/lang}{if $sortField == 'packageID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th colspan="2"{if $sortField == 'packageName'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=packageName&amp;sortOrder={if $sortField == 'packageName' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.name{/lang}{if $sortField == 'packageName'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th{if $sortField == 'author'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=author&amp;sortOrder={if $sortField == 'author' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.author{/lang}{if $sortField == 'author'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th{if $sortField == 'packageVersion'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=packageVersion&amp;sortOrder={if $sortField == 'packageVersion' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.version{/lang}{if $sortField == 'packageVersion'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th{if $sortField == 'updateDate'} class="active"{/if}><div><a href="index.php?page=PackageList&amp;pageNo={@$pageNo}&amp;sortField=updateDate&amp;sortOrder={if $sortField == 'updateDate' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.updateDate{/lang}{if $sortField == 'updateDate'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       
+                                       {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}
+                               </tr>
+                       </thead>
+                       <tbody>
+                               {foreach from=$packages item=$package}
+                                       <tr class="packageRow {cycle values="container-1,container-2"}">
+                                               <td class="columnIcon">
+                                                       {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}
+                                                               <a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package->packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>
+                                                       {else}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />
+                                                       {/if}
+                                                       {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package->package != 'com.woltlab.wcf' && $package->packageID != PACKAGE_ID}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" class="uninstallButton" data-objectID="{@$package->packageID}" />
+                                                       {else}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />
+                                                       {/if}
+                                                       
+                                                       {if $additionalButtons[$package->packageID]|isset}{@$additionalButtons[$package->packageID]}{/if}
+                                               </td>
+                                               <td class="columnID">{@$package->packageID}</td>
+                                               <td class="columnIcon">
+                                                       {if $package->standalone}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />
+                                                       {elseif $package->isPlugin()}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />
+                                                       {else}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />
+                                                       {/if}
+                                               </td>
+                                               <td class="columnText" title="{$package->packageDescription}" id="packageName{@$package->packageID}">
+                                                       <a href="index.php?page=PackageView&amp;activePackageID={@$package->packageID}{@SID_ARG_2ND}"><span>{$package->getName()}{if $package->instanceNo > 1 && $package->instanceName == ''} (#{#$package->instanceNo}){/if}</span></a>
+                                               </td>
+                                               <td class="columnText">{if $package->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->authorURL|rawurlencode}" class="externalURL">{$package->author}</a>{else}{$package->author}{/if}</td>
+                                               <td class="columnText">{$package->packageVersion}</td>
+                                               <td class="columnDate">{@$package->updateDate|time}</td>
+                                               
+                                               {if $additionalColumns[$package->packageID]|isset}{@$additionalColumns[$package->packageID]}{/if}
+                                       </tr>
+                               {/foreach}
+                       </tbody>
+               </table>
+       </div>
+{/if}
+
+<div class="contentFooter">
+       {@$pagesLinks}
+       
+       {if $__wcf->session->getPermission('admin.system.package.canInstallPackage') || $additionalLargeButtons|isset}
+               <nav class="largeButtons">
+                       <ul>
+                               {if $__wcf->session->getPermission('admin.system.package.canInstallPackage')}<li><a href="index.php?form=PackageStartInstall&amp;action=install{@SID_ARG_2ND}" title="{lang}wcf.acp.package.startInstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageInstallM.png" alt="" /> <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>{/if}
+                               {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+                       </ul>
+               </nav>
+       {/if}
+</div>
+
+{include file='footer'}
index f077b20d76bf8ea40f78381b5cce0a7ef063975e..ea31a3b2a2bd7deebe72b93b0866ee12b93421a2 100644 (file)
-{include file='header'}\r
-\r
-\r
-<header class="mainHeading">\r
-       {if $packageID == 0}\r
-               <img src="{@RELATIVE_WCF_DIR}icon/packageInstallL.png" alt="" />\r
-               <hgroup class="headlineContainer">\r
-                       <h1>{lang}wcf.acp.package.startInstall{/lang}</h1>\r
-               </hgroup>\r
-       {else}\r
-               <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateL.png" alt="" />\r
-               <hgroup class="headlineContainer">\r
-                       <h1>{lang}wcf.acp.package.startUpdate{/lang}</h1>\r
-               </hgroup>\r
-       {/if}\r
-</header>\r
-\r
-{if $errorField != ''}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<div class="contentHeader">\r
-       <nav class="largeButtons">\r
-               <ul>\r
-                       <li><a href="index.php?page=PackageList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.view{/lang}</span></a></li>\r
-                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-               </ul>\r
-       </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=PackageStartInstall" enctype="multipart/form-data">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.package.startInstall.source{/lang}</legend>\r
-                       \r
-                               <div class="formElement{if $errorField == 'uploadPackage'} formError{/if}" id="uploadPackageDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="uploadPackage">{lang}wcf.acp.package.startInstall.source.upload{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="file" id="uploadPackage" name="uploadPackage" value="" />\r
-                                               {if $errorField == 'uploadPackage'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               {if $errorType == 'noValidPackage'}{lang}wcf.acp.package.startInstall.error.noValidPackage{/lang}{/if}\r
-                                                               {if $errorType == 'noValidUpdate'}{lang}wcf.acp.package.startInstall.error.noValidUpdate{/lang}{/if}\r
-                                                               {if $errorType == 'noValidInstall'}{lang}wcf.acp.package.startInstall.error.noValidInstall{/lang}{/if}\r
-                                                               {if $errorType == 'uploadFailed'}{lang}wcf.acp.package.startInstall.error.uploadFailed{/lang}{/if}\r
-                                                               {if $errorType == 'uniqueAlreadyInstalled'}{lang}wcf.acp.package.startInstall.error.uniqueAlreadyInstalled{/lang}{/if}\r
-                                                               {if $errorType == 'phpRequirements'}<pre>{$phpRequirements|print_r}</pre>{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="uploadPackageHelpMessage">\r
-                                               <p>{lang}wcf.acp.package.startInstall.source.upload.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('uploadPackage');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement{if $errorField == 'downloadPackage'} formError{/if}" id="downloadPackageDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="downloadPackage">{lang}wcf.acp.package.startInstall.source.download{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="downloadPackage" name="downloadPackage" value="" />\r
-                                               {if $errorField == 'downloadPackage'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'notFound'}{lang}wcf.acp.package.startInstall.error.notFound{/lang}{/if}\r
-                                                               {if $errorType == 'noValidPackage'}{lang}wcf.acp.package.startInstall.error.noValidPackage{/lang}{/if}\r
-                                                               {if $errorType == 'noValidUpdate'}{lang}wcf.acp.package.startInstall.error.noValidUpdate{/lang}{/if}\r
-                                                               {if $errorType == 'noValidInstall'}{lang}wcf.acp.package.startInstall.error.noValidInstall{/lang}{/if}\r
-                                                               {if $errorType == 'uniqueAlreadyInstalled'}{lang}wcf.acp.package.startInstall.error.uniqueAlreadyInstalled{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="downloadPackageHelpMessage">\r
-                                               <p>{lang}wcf.acp.package.startInstall.source.download.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('downloadPackage');\r
-                               //]]></script>\r
-                               \r
-                       </fieldset>\r
-                       \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-               </div>\r
-       </div>\r
-\r
-       <div class="formSubmit">\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />\r
-               \r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="action" value="{$action}" />\r
-               {if $packageID != 0}<input type="hidden" name="activePackageID" value="{@$packageID}" />{/if}\r
-       </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+
+<header class="mainHeading">
+       {if $packageID == 0}
+               <img src="{@RELATIVE_WCF_DIR}icon/packageInstallL.png" alt="" />
+               <hgroup class="headlineContainer">
+                       <h1>{lang}wcf.acp.package.startInstall{/lang}</h1>
+               </hgroup>
+       {else}
+               <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateL.png" alt="" />
+               <hgroup class="headlineContainer">
+                       <h1>{lang}wcf.acp.package.startUpdate{/lang}</h1>
+               </hgroup>
+       {/if}
+</header>
+
+{if $errorField != ''}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+       <nav class="largeButtons">
+               <ul>
+                       <li><a href="index.php?page=PackageList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.view{/lang}</span></a></li>
+                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+               </ul>
+       </nav>
+</div>
+
+<form method="post" action="index.php?form=PackageStartInstall" enctype="multipart/form-data">
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.package.startInstall.source{/lang}</legend>
+                       
+                               <div class="formElement{if $errorField == 'uploadPackage'} formError{/if}" id="uploadPackageDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="uploadPackage">{lang}wcf.acp.package.startInstall.source.upload{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="file" id="uploadPackage" name="uploadPackage" value="" />
+                                               {if $errorField == 'uploadPackage'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               {if $errorType == 'noValidPackage'}{lang}wcf.acp.package.startInstall.error.noValidPackage{/lang}{/if}
+                                                               {if $errorType == 'noValidUpdate'}{lang}wcf.acp.package.startInstall.error.noValidUpdate{/lang}{/if}
+                                                               {if $errorType == 'noValidInstall'}{lang}wcf.acp.package.startInstall.error.noValidInstall{/lang}{/if}
+                                                               {if $errorType == 'uploadFailed'}{lang}wcf.acp.package.startInstall.error.uploadFailed{/lang}{/if}
+                                                               {if $errorType == 'uniqueAlreadyInstalled'}{lang}wcf.acp.package.startInstall.error.uniqueAlreadyInstalled{/lang}{/if}
+                                                               {if $errorType == 'phpRequirements'}<pre>{$phpRequirements|print_r}</pre>{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="uploadPackageHelpMessage">
+                                               <p>{lang}wcf.acp.package.startInstall.source.upload.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('uploadPackage');
+                               //]]></script>
+                               
+                               <div class="formElement{if $errorField == 'downloadPackage'} formError{/if}" id="downloadPackageDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="downloadPackage">{lang}wcf.acp.package.startInstall.source.download{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="downloadPackage" name="downloadPackage" value="" />
+                                               {if $errorField == 'downloadPackage'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'notFound'}{lang}wcf.acp.package.startInstall.error.notFound{/lang}{/if}
+                                                               {if $errorType == 'noValidPackage'}{lang}wcf.acp.package.startInstall.error.noValidPackage{/lang}{/if}
+                                                               {if $errorType == 'noValidUpdate'}{lang}wcf.acp.package.startInstall.error.noValidUpdate{/lang}{/if}
+                                                               {if $errorType == 'noValidInstall'}{lang}wcf.acp.package.startInstall.error.noValidInstall{/lang}{/if}
+                                                               {if $errorType == 'uniqueAlreadyInstalled'}{lang}wcf.acp.package.startInstall.error.uniqueAlreadyInstalled{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="downloadPackageHelpMessage">
+                                               <p>{lang}wcf.acp.package.startInstall.source.download.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('downloadPackage');
+                               //]]></script>
+                               
+                       </fieldset>
+                       
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+               </div>
+       </div>
+
+       <div class="formSubmit">
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />
+               
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="action" value="{$action}" />
+               {if $packageID != 0}<input type="hidden" name="activePackageID" value="{@$packageID}" />{/if}
+       </div>
+</form>
+
+{include file='footer'}
index 4de1d5b04a672f29862f7493556a1538b9a215bd..5bd8d3966ed3aa9104d3efe3bfa5592c4a3f67a8 100644 (file)
-{include file='header'}\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       $(function() {\r
-               new WCF.ACP.PackageUninstallation({@$packageObj->packageID});\r
-       });\r
-//     ]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/packageUninstallL.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.package.uninstall{/lang}: {$packageObj->getName()}</h2>\r
-               <p>{$packageObj->packageDescription}</p>\r
-       </div>\r
-</div>\r
-\r
-<fieldset>\r
-       <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>\r
-               <p class="formField">{$packageObj->package}</p>\r
-       </div>\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.version{/lang}</p>\r
-               <p class="formField">{$packageObj->packageVersion}</p>\r
-       </div>\r
-       {if $packageObj->instanceNo > 0}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>\r
-                       <p class="formField">{$packageObj->instanceNo}</p>\r
-               </div>\r
-       {/if}\r
-       {if $packageObj->packageDir != ''}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>\r
-                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}{$packageObj->packageDir}">{$packageObj->packageDir}</a></p>\r
-               </div>\r
-       {/if}\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>\r
-               <p class="formField">{@$packageObj->packageDate|date}</p>\r
-       </div>\r
-       {if $packageObj->packageURL != ''}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>\r
-                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$packageObj->packageURL|rawurlencode}" class="externalURL">{$packageObj->packageURL}</a></p>\r
-               </div>\r
-       {/if}\r
-       {if $packageObj->parentPackageID}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.parent{/lang}</p>\r
-                       <p class="formField"><a href="index.php?page=PackageView&amp;activePackageID={@$packageObj->parentPackageID}{@SID_ARG_2ND}">{$packageObj->getParentPackage()->getName()}</a></p>\r
-               </div>\r
-       {/if}\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>\r
-               <p class="formField">{if $packageObj->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$packageObj->authorURL|rawurlencode}" class="externalURL">{$packageObj->author}</a>{else}{$packageObj->author}{/if}</p>\r
-       </div>\r
-       \r
-       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-</fieldset>\r
-\r
-{if $dependentPackages|count > 0}\r
-       {if $uninstallAvailable}\r
-               <p class="warning">{lang}wcf.acp.package.uninstall.dependentPackages.warning{/lang}</p>\r
-       {else}\r
-               <p class="error">{lang}wcf.acp.package.uninstall.dependentPackages.error{/lang}</p>\r
-       {/if}\r
-\r
-       <div class="border titleBarPanel">\r
-               <div class="containerHead"><h3>{lang}wcf.acp.package.view.dependentPackages{/lang}</h3></div>\r
-       </div>\r
-       <div class="border borderMarginRemove">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>\r
-                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>\r
-                                       \r
-                                       {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                       {foreach from=$dependentPackages item=package}\r
-                               <tr class="{cycle values="container-1,container-2"}">\r
-                                       <td class="columnIcon">\r
-                                               {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}\r
-                                                       <a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />\r
-                                               {/if}\r
-                                               {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}\r
-                                                       <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&amp;action=startUninstall&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />\r
-                                               {/if}\r
-                                               \r
-                                               {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}\r
-                                       </td>\r
-                                       <td class="columnID">{@$package.packageID}</td>\r
-                                       <td class="columnIcon">\r
-                                               {if $package.standalone}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />\r
-                                               {elseif $package.parentPackageID}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />\r
-                                               {/if}\r
-                                       </td>\r
-                                       <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>\r
-                                       <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>\r
-                                       <td class="columnText">{$package.packageVersion}</td>\r
-                                       <td class="columnDate">{@$package.packageDate|date}</td>\r
-                                       \r
-                                       {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}\r
-                               </tr>\r
-                       {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-{/if}\r
-\r
-<div class="formSubmit">\r
-       {@SID_INPUT_TAG}\r
-       <input type="hidden" name="action" value="startUninstall" />\r
-       <input type="hidden" name="activePackageID" value="{@$packageObj->packageID}" />\r
-       <input type="hidden" name="send" value="1" />\r
-       <input type="button" accesskey="c" value="{lang}wcf.global.button.back{/lang}" onclick="document.location.href=fixURL('index.php?page=PackageView&amp;activePackageID={$activePackageID}{@SID_ARG_2ND}')" />\r
-       <input type="button" accesskey="s" id="uninstallPackage" value="{lang}wcf.global.button.next{/lang}" />\r
-</div>\r
-\r
+{include file='header'}
+
+<script type="text/javascript">
+       //<![CDATA[
+       $(function() {
+               new WCF.ACP.PackageUninstallation({@$packageObj->packageID});
+       });
+//     ]]>
+</script>
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/packageUninstallL.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.package.uninstall{/lang}: {$packageObj->getName()}</h2>
+               <p>{$packageObj->packageDescription}</p>
+       </div>
+</div>
+
+<fieldset>
+       <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>
+               <p class="formField">{$packageObj->package}</p>
+       </div>
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.version{/lang}</p>
+               <p class="formField">{$packageObj->packageVersion}</p>
+       </div>
+       {if $packageObj->instanceNo > 0}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>
+                       <p class="formField">{$packageObj->instanceNo}</p>
+               </div>
+       {/if}
+       {if $packageObj->packageDir != ''}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>
+                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}{$packageObj->packageDir}">{$packageObj->packageDir}</a></p>
+               </div>
+       {/if}
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>
+               <p class="formField">{@$packageObj->packageDate|date}</p>
+       </div>
+       {if $packageObj->packageURL != ''}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>
+                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$packageObj->packageURL|rawurlencode}" class="externalURL">{$packageObj->packageURL}</a></p>
+               </div>
+       {/if}
+       {if $packageObj->parentPackageID}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.parent{/lang}</p>
+                       <p class="formField"><a href="index.php?page=PackageView&amp;activePackageID={@$packageObj->parentPackageID}{@SID_ARG_2ND}">{$packageObj->getParentPackage()->getName()}</a></p>
+               </div>
+       {/if}
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>
+               <p class="formField">{if $packageObj->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$packageObj->authorURL|rawurlencode}" class="externalURL">{$packageObj->author}</a>{else}{$packageObj->author}{/if}</p>
+       </div>
+       
+       {if $additionalFields|isset}{@$additionalFields}{/if}
+</fieldset>
+
+{if $dependentPackages|count > 0}
+       {if $uninstallAvailable}
+               <p class="warning">{lang}wcf.acp.package.uninstall.dependentPackages.warning{/lang}</p>
+       {else}
+               <p class="error">{lang}wcf.acp.package.uninstall.dependentPackages.error{/lang}</p>
+       {/if}
+
+       <div class="border titleBarPanel">
+               <div class="containerHead"><h3>{lang}wcf.acp.package.view.dependentPackages{/lang}</h3></div>
+       </div>
+       <div class="border borderMarginRemove">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>
+                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>
+                                       
+                                       {if $additionalColumns|isset}{@$additionalColumns}{/if}
+                               </tr>
+                       </thead>
+                       <tbody>
+                       {foreach from=$dependentPackages item=package}
+                               <tr class="{cycle values="container-1,container-2"}">
+                                       <td class="columnIcon">
+                                               {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}
+                                                       <a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />
+                                               {/if}
+                                               {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}
+                                                       <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&amp;action=startUninstall&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />
+                                               {/if}
+                                               
+                                               {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}
+                                       </td>
+                                       <td class="columnID">{@$package.packageID}</td>
+                                       <td class="columnIcon">
+                                               {if $package.standalone}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />
+                                               {elseif $package.parentPackageID}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />
+                                               {/if}
+                                       </td>
+                                       <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>
+                                       <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>
+                                       <td class="columnText">{$package.packageVersion}</td>
+                                       <td class="columnDate">{@$package.packageDate|date}</td>
+                                       
+                                       {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}
+                               </tr>
+                       {/foreach}
+                       </tbody>
+               </table>
+       </div>
+{/if}
+
+<div class="formSubmit">
+       {@SID_INPUT_TAG}
+       <input type="hidden" name="action" value="startUninstall" />
+       <input type="hidden" name="activePackageID" value="{@$packageObj->packageID}" />
+       <input type="hidden" name="send" value="1" />
+       <input type="button" accesskey="c" value="{lang}wcf.global.button.back{/lang}" onclick="document.location.href=fixURL('index.php?page=PackageView&amp;activePackageID={$activePackageID}{@SID_ARG_2ND}')" />
+       <input type="button" accesskey="s" id="uninstallPackage" value="{lang}wcf.global.button.next{/lang}" />
+</div>
+
 {include file='footer'}
\ No newline at end of file
index 183dbe12fe913c22f7530015aca951d90130344a..29cc6213bfe254659e72fd67207ddbdf6e1fab7b 100644 (file)
-{include file='header'}\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateL.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.packageUpdate.auth{/lang}</h2>\r
-       </div>\r
-</div>\r
-\r
-{if $errorField != ''}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="{$requestMethod}" action="index.php{if $getParameters}?{@$getParameters}{/if}">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.packageUpdate.auth.data{/lang}</legend>\r
-                               \r
-                               <div class="formElement">\r
-                                       <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.url{/lang}</p>\r
-                                       <p class="formField">{$url}</p>\r
-                               </div>\r
-                               {if $realm}\r
-                                       <div class="formElement">\r
-                                               <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.realm{/lang}</p>\r
-                                               <p class="formField">{$realm}</p>\r
-                                       </div>\r
-                               {/if}\r
-                               {if $message}\r
-                                       <div class="formElement">\r
-                                               <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.message{/lang}</p>\r
-                                               <p class="formField">{@$message}</p>\r
-                                       </div>\r
-                               {/if}\r
-                       </fieldset>\r
-                       \r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.packageUpdate.auth.input{/lang}</legend>\r
-                               \r
-                               <div class="formElement{if $errorField == 'loginPassword'} formError{/if}" id="loginUsernameDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="loginUsername">{lang}wcf.acp.packageUpdate.auth.loginUsername{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="loginUsername" name="loginUsername" value="{$loginUsername}" />\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="loginUsernameHelpMessage">\r
-                                               <p>{lang}wcf.acp.packageUpdate.auth.loginUsername.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('loginUsername');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement{if $errorField == 'loginPassword'} formError{/if}" id="loginPasswordDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="loginPassword">{lang}wcf.acp.packageUpdate.auth.loginPassword{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="password" class="inputText" id="loginPassword" name="loginPassword" value="{$loginPassword}" />\r
-                                               {if $errorField == 'loginPassword'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'invalid'}{lang}wcf.acp.packageUpdate.auth.error{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="loginPasswordHelpMessage">\r
-                                               <p>{lang}wcf.acp.packageUpdate.auth.loginPassword.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('loginPassword');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement" id="saveAuthDataDiv">\r
-                                       <div class="formField">\r
-                                               <label><input type="checkbox" id="saveAuthData" name="saveAuthData" value="1" {if $saveAuthData == 1}checked="checked" {/if}/> {lang}wcf.acp.packageUpdate.auth.save{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="saveAuthDataHelpMessage">\r
-                                               <p>{lang}wcf.acp.packageUpdate.auth.save.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('saveAuthData');\r
-                               //]]></script>\r
-                       </fieldset>\r
-                       \r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               \r
-               <input type="hidden" name="form" value="PackageUpdateAuth" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="packageUpdateServerID" value="{@$packageUpdateServerID}" />\r
-               \r
-               {@$postParameters}\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateL.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.packageUpdate.auth{/lang}</h2>
+       </div>
+</div>
+
+{if $errorField != ''}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="{$requestMethod}" action="index.php{if $getParameters}?{@$getParameters}{/if}">
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.packageUpdate.auth.data{/lang}</legend>
+                               
+                               <div class="formElement">
+                                       <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.url{/lang}</p>
+                                       <p class="formField">{$url}</p>
+                               </div>
+                               {if $realm}
+                                       <div class="formElement">
+                                               <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.realm{/lang}</p>
+                                               <p class="formField">{$realm}</p>
+                                       </div>
+                               {/if}
+                               {if $message}
+                                       <div class="formElement">
+                                               <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.message{/lang}</p>
+                                               <p class="formField">{@$message}</p>
+                                       </div>
+                               {/if}
+                       </fieldset>
+                       
+                       <fieldset>
+                               <legend>{lang}wcf.acp.packageUpdate.auth.input{/lang}</legend>
+                               
+                               <div class="formElement{if $errorField == 'loginPassword'} formError{/if}" id="loginUsernameDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="loginUsername">{lang}wcf.acp.packageUpdate.auth.loginUsername{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="loginUsername" name="loginUsername" value="{$loginUsername}" />
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="loginUsernameHelpMessage">
+                                               <p>{lang}wcf.acp.packageUpdate.auth.loginUsername.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('loginUsername');
+                               //]]></script>
+                               
+                               <div class="formElement{if $errorField == 'loginPassword'} formError{/if}" id="loginPasswordDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="loginPassword">{lang}wcf.acp.packageUpdate.auth.loginPassword{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="password" class="inputText" id="loginPassword" name="loginPassword" value="{$loginPassword}" />
+                                               {if $errorField == 'loginPassword'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'invalid'}{lang}wcf.acp.packageUpdate.auth.error{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="loginPasswordHelpMessage">
+                                               <p>{lang}wcf.acp.packageUpdate.auth.loginPassword.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('loginPassword');
+                               //]]></script>
+                               
+                               <div class="formElement" id="saveAuthDataDiv">
+                                       <div class="formField">
+                                               <label><input type="checkbox" id="saveAuthData" name="saveAuthData" value="1" {if $saveAuthData == 1}checked="checked" {/if}/> {lang}wcf.acp.packageUpdate.auth.save{/lang}</label>
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="saveAuthDataHelpMessage">
+                                               <p>{lang}wcf.acp.packageUpdate.auth.save.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('saveAuthData');
+                               //]]></script>
+                       </fieldset>
+                       
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               
+               <input type="hidden" name="form" value="PackageUpdateAuth" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="packageUpdateServerID" value="{@$packageUpdateServerID}" />
+               
+               {@$postParameters}
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index 1a56a7dce80d1922d511445733d87427b653c619..4095598f0ef3a6b8797766958b1c15b4bacbb4f8 100644 (file)
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/packageL.png" alt="" />\r
-       <hgroup>\r
-               <h1>{$package->getName()}</h1>\r
-               <h2>{$package->packageDescription}</h2>\r
-       </hgroup>\r
-</header>\r
-\r
-<fieldset>\r
-       <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>\r
-               <p class="formField">{$package->package}</p>\r
-       </div>\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.version{/lang}</p>\r
-               <p class="formField">{$package->packageVersion}</p>\r
-       </div>\r
-       {if $package->instanceNo > 1}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>\r
-                       <p class="formField">{#$package->instanceNo}</p>\r
-               </div>\r
-       {elseif $package->package == 'com.woltlab.wcf' && WCF_N != 1}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>\r
-                       <p class="formField">{#WCF_N}</p>\r
-               </div>\r
-       {/if}\r
-       {if $package->packageDir != ''}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>\r
-                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}{$package->packageDir}">{$package->packageDir}</a></p>\r
-               </div>\r
-       {elseif $package->package == 'com.woltlab.wcf'}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>\r
-                       <p class="formField">{WCF_DIR}</p>\r
-               </div>\r
-       {/if}\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>\r
-               <p class="formField">{@$package->packageDate|date}</p>\r
-       </div>\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.installDate{/lang}</p>\r
-               <p class="formField">{@$package->installDate|time}</p>\r
-       </div>\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.updateDate{/lang}</p>\r
-               <p class="formField">{@$package->updateDate|time}</p>\r
-       </div>\r
-       {if $package->packageURL != ''}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>\r
-                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->packageURL|rawurlencode}" class="externalURL">{$package->packageURL}</a></p>\r
-               </div>\r
-       {/if}\r
-       {if $package->parentPackageID}\r
-               <div class="formElement">\r
-                       <p class="formFieldLabel">{lang}wcf.acp.package.view.parent{/lang}</p>\r
-                       <p class="formField"><a href="index.php?page=PackageView&amp;activePackageID={@$package->parentPackageID}{@SID_ARG_2ND}">{$package->parentPackage()->getName()}</a></p>\r
-               </div>\r
-       {/if}\r
-       <div class="formElement">\r
-               <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>\r
-               <p class="formField">{if $package->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->authorURL|rawurlencode}" class="externalURL">{$package->author}</a>{else}{$package->author}{/if}</p>\r
-       </div>\r
-       \r
-       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-</fieldset>\r
-\r
-{assign var=noDependentIsActive value=true}\r
-{foreach from=$dependentPackages item=dependentPackage}\r
-       {if $dependentPackage.package != 'com.woltlab.wcf' && $dependentPackage.packageID == PACKAGE_ID}\r
-               {assign var=noDependentIsActive value=false}\r
-               {* TODO: maybe show user that this package can't be uninstalled because a dependent package is the active standalone application *}\r
-       {/if}\r
-{/foreach}\r
-\r
-<div class="contentHeader">\r
-       <nav class="largeButtons">\r
-               <ul>\r
-                       {if PACKAGE_ID != $package->packageID}\r
-                               {if $package->standalone && $package->package != 'com.woltlab.wcf'}<li><a href="{@RELATIVE_WCF_DIR}{$package->packageDir}acp/index.php?packageID={@$package->packageID}{@SID_ARG_2ND}" title="{lang}wcf.acp.package.view.button.makeActive{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageMakeActiveM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.makeActive{/lang}</span></a></li>{/if}\r
-                               {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $noDependentIsActive}<li><a href="index.php?page=Package&amp;action=startUninstall&amp;activePackageID={@$package->packageID}{@SID_ARG_2ND}" onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" title="{lang}wcf.acp.package.view.button.uninstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageUninstallM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.uninstall{/lang}</span></a></li>{/if}\r
-                       {/if}\r
-                       {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}<li><a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package->packageID}{@SID_ARG_2ND}" title="{lang}wcf.acp.package.view.button.update{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.update{/lang}</span></a></li>{/if}\r
-                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-               </ul>\r
-       </nav>\r
-</div>\r
-\r
-{if $requiredPackages|count > 0}\r
-       <div class="border titleBarPanel">\r
-               <div class="containerHead">\r
-                       <div class="containerIcon"><a onclick="openList('requiredPackages')"><img id="requiredPackagesImage" src="{@RELATIVE_WCF_DIR}icon/minusS.png" alt="" /></a></div>\r
-                       <div class="containerContent">\r
-                               <h3><a onclick="openList('requiredPackages')">{lang}wcf.acp.package.view.requiredPackages{/lang}</a></h3>\r
-                               <p class="smallFont light">{lang}wcf.acp.package.view.requiredPackages.description{/lang}</p>\r
-                       </div>\r
-               </div>\r
-       </div>\r
-       <div class="border borderMarginRemove" id="requiredPackages">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>\r
-                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>\r
-                                       \r
-                                       {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                       {foreach from=$requiredPackages item=$package}\r
-                               <tr class="{cycle values="container-1,container-2"}">\r
-                                       <td class="columnIcon">\r
-                                               {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}\r
-                                                       <a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />\r
-                                               {/if}\r
-                                               {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}\r
-                                                       <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&amp;action=startUninstall&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />\r
-                                               {/if}\r
-                                               \r
-                                               {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}\r
-                                       </td>\r
-                                       <td class="columnID">{@$package.packageID}</td>\r
-                                       <td class="columnIcon">\r
-                                               {if $package.standalone}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />\r
-                                               {elseif $package.parentPackageID}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />\r
-                                               {/if}\r
-                                       </td>\r
-                                       <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>\r
-                                       <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>\r
-                                       <td class="columnText">{$package.packageVersion}</td>\r
-                                       <td class="columnDate">{@$package.packageDate|date}</td>\r
-                                       \r
-                                       {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}\r
-                               </tr>\r
-                       {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-       \r
-       <script type="text/javascript">\r
-               //<![CDATA[\r
-               initList('requiredPackages', 0);\r
-               //]]>\r
-       </script>\r
-{/if}\r
-\r
-{if $dependentPackages|count > 0}\r
-       <div class="border titleBarPanel">\r
-               <div class="containerHead">\r
-                       <div class="containerIcon"><a onclick="openList('dependentPackages')"><img id="dependentPackagesImage" src="{@RELATIVE_WCF_DIR}icon/minusS.png" alt="" /></a></div>\r
-                       <div class="containerContent">\r
-                               <h3><a onclick="openList('dependentPackages')">{lang}wcf.acp.package.view.dependentPackages{/lang}</a></h3>\r
-                               <p class="smallFont light">{lang}wcf.acp.package.view.dependentPackages.description{/lang}</p>\r
-                       </div>\r
-               </div>\r
-       </div>\r
-       <div class="border borderMarginRemove" id="dependentPackages">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>\r
-                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
-                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>\r
-                                       \r
-                                       {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                       {foreach from=$dependentPackages item=$package}\r
-                               <tr class="{cycle values="container-1,container-2"}">\r
-                                       <td class="columnIcon">\r
-                                               {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}\r
-                                                       <a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />\r
-                                               {/if}\r
-                                               {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}\r
-                                                       <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&amp;action=startUninstall&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />\r
-                                               {/if}\r
-                                               \r
-                                               {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}\r
-                                       </td>\r
-                                       <td class="columnID">{@$package.packageID}</td>\r
-                                       <td class="columnIcon">\r
-                                               {if $package.standalone}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />\r
-                                               {elseif $package.parentPackageID}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />\r
-                                               {/if}\r
-                                       </td>\r
-                                       <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>\r
-                                       <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>\r
-                                       <td class="columnText">{$package.packageVersion}</td>\r
-                                       <td class="columnDate">{@$package.packageDate|date}</td>\r
-                                       \r
-                                       {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}\r
-                               </tr>\r
-                       {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-       \r
-       <script type="text/javascript">\r
-               //<![CDATA[\r
-               initList('dependentPackages', 0);\r
-               //]]>\r
-       </script>\r
-{/if}\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/packageL.png" alt="" />
+       <hgroup>
+               <h1>{$package->getName()}</h1>
+               <h2>{$package->packageDescription}</h2>
+       </hgroup>
+</header>
+
+<fieldset>
+       <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>
+               <p class="formField">{$package->package}</p>
+       </div>
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.version{/lang}</p>
+               <p class="formField">{$package->packageVersion}</p>
+       </div>
+       {if $package->instanceNo > 1}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>
+                       <p class="formField">{#$package->instanceNo}</p>
+               </div>
+       {elseif $package->package == 'com.woltlab.wcf' && WCF_N != 1}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>
+                       <p class="formField">{#WCF_N}</p>
+               </div>
+       {/if}
+       {if $package->packageDir != ''}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>
+                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}{$package->packageDir}">{$package->packageDir}</a></p>
+               </div>
+       {elseif $package->package == 'com.woltlab.wcf'}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>
+                       <p class="formField">{WCF_DIR}</p>
+               </div>
+       {/if}
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>
+               <p class="formField">{@$package->packageDate|date}</p>
+       </div>
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.installDate{/lang}</p>
+               <p class="formField">{@$package->installDate|time}</p>
+       </div>
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.updateDate{/lang}</p>
+               <p class="formField">{@$package->updateDate|time}</p>
+       </div>
+       {if $package->packageURL != ''}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>
+                       <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->packageURL|rawurlencode}" class="externalURL">{$package->packageURL}</a></p>
+               </div>
+       {/if}
+       {if $package->parentPackageID}
+               <div class="formElement">
+                       <p class="formFieldLabel">{lang}wcf.acp.package.view.parent{/lang}</p>
+                       <p class="formField"><a href="index.php?page=PackageView&amp;activePackageID={@$package->parentPackageID}{@SID_ARG_2ND}">{$package->parentPackage()->getName()}</a></p>
+               </div>
+       {/if}
+       <div class="formElement">
+               <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>
+               <p class="formField">{if $package->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->authorURL|rawurlencode}" class="externalURL">{$package->author}</a>{else}{$package->author}{/if}</p>
+       </div>
+       
+       {if $additionalFields|isset}{@$additionalFields}{/if}
+</fieldset>
+
+{assign var=noDependentIsActive value=true}
+{foreach from=$dependentPackages item=dependentPackage}
+       {if $dependentPackage.package != 'com.woltlab.wcf' && $dependentPackage.packageID == PACKAGE_ID}
+               {assign var=noDependentIsActive value=false}
+               {* TODO: maybe show user that this package can't be uninstalled because a dependent package is the active standalone application *}
+       {/if}
+{/foreach}
+
+<div class="contentHeader">
+       <nav class="largeButtons">
+               <ul>
+                       {if PACKAGE_ID != $package->packageID}
+                               {if $package->standalone && $package->package != 'com.woltlab.wcf'}<li><a href="{@RELATIVE_WCF_DIR}{$package->packageDir}acp/index.php?packageID={@$package->packageID}{@SID_ARG_2ND}" title="{lang}wcf.acp.package.view.button.makeActive{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageMakeActiveM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.makeActive{/lang}</span></a></li>{/if}
+                               {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $noDependentIsActive}<li><a href="index.php?page=Package&amp;action=startUninstall&amp;activePackageID={@$package->packageID}{@SID_ARG_2ND}" onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" title="{lang}wcf.acp.package.view.button.uninstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageUninstallM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.uninstall{/lang}</span></a></li>{/if}
+                       {/if}
+                       {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}<li><a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package->packageID}{@SID_ARG_2ND}" title="{lang}wcf.acp.package.view.button.update{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.update{/lang}</span></a></li>{/if}
+                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+               </ul>
+       </nav>
+</div>
+
+{if $requiredPackages|count > 0}
+       <div class="border titleBarPanel">
+               <div class="containerHead">
+                       <div class="containerIcon"><a onclick="openList('requiredPackages')"><img id="requiredPackagesImage" src="{@RELATIVE_WCF_DIR}icon/minusS.png" alt="" /></a></div>
+                       <div class="containerContent">
+                               <h3><a onclick="openList('requiredPackages')">{lang}wcf.acp.package.view.requiredPackages{/lang}</a></h3>
+                               <p class="smallFont light">{lang}wcf.acp.package.view.requiredPackages.description{/lang}</p>
+                       </div>
+               </div>
+       </div>
+       <div class="border borderMarginRemove" id="requiredPackages">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>
+                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>
+                                       
+                                       {if $additionalColumns|isset}{@$additionalColumns}{/if}
+                               </tr>
+                       </thead>
+                       <tbody>
+                       {foreach from=$requiredPackages item=$package}
+                               <tr class="{cycle values="container-1,container-2"}">
+                                       <td class="columnIcon">
+                                               {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}
+                                                       <a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />
+                                               {/if}
+                                               {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}
+                                                       <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&amp;action=startUninstall&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />
+                                               {/if}
+                                               
+                                               {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}
+                                       </td>
+                                       <td class="columnID">{@$package.packageID}</td>
+                                       <td class="columnIcon">
+                                               {if $package.standalone}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />
+                                               {elseif $package.parentPackageID}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />
+                                               {/if}
+                                       </td>
+                                       <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>
+                                       <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>
+                                       <td class="columnText">{$package.packageVersion}</td>
+                                       <td class="columnDate">{@$package.packageDate|date}</td>
+                                       
+                                       {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}
+                               </tr>
+                       {/foreach}
+                       </tbody>
+               </table>
+       </div>
+       
+       <script type="text/javascript">
+               //<![CDATA[
+               initList('requiredPackages', 0);
+               //]]>
+       </script>
+{/if}
+
+{if $dependentPackages|count > 0}
+       <div class="border titleBarPanel">
+               <div class="containerHead">
+                       <div class="containerIcon"><a onclick="openList('dependentPackages')"><img id="dependentPackagesImage" src="{@RELATIVE_WCF_DIR}icon/minusS.png" alt="" /></a></div>
+                       <div class="containerContent">
+                               <h3><a onclick="openList('dependentPackages')">{lang}wcf.acp.package.view.dependentPackages{/lang}</a></h3>
+                               <p class="smallFont light">{lang}wcf.acp.package.view.dependentPackages.description{/lang}</p>
+                       </div>
+               </div>
+       </div>
+       <div class="border borderMarginRemove" id="dependentPackages">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>
+                                       <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+                                       <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>
+                                       
+                                       {if $additionalColumns|isset}{@$additionalColumns}{/if}
+                               </tr>
+                       </thead>
+                       <tbody>
+                       {foreach from=$dependentPackages item=$package}
+                               <tr class="{cycle values="container-1,container-2"}">
+                                       <td class="columnIcon">
+                                               {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}
+                                                       <a href="index.php?form=PackageStartInstall&amp;action=update&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />
+                                               {/if}
+                                               {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}
+                                                       <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&amp;action=startUninstall&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />
+                                               {/if}
+                                               
+                                               {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}
+                                       </td>
+                                       <td class="columnID">{@$package.packageID}</td>
+                                       <td class="columnIcon">
+                                               {if $package.standalone}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />
+                                               {elseif $package.parentPackageID}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />
+                                               {/if}
+                                       </td>
+                                       <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&amp;activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>
+                                       <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>
+                                       <td class="columnText">{$package.packageVersion}</td>
+                                       <td class="columnDate">{@$package.packageDate|date}</td>
+                                       
+                                       {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}
+                               </tr>
+                       {/foreach}
+                       </tbody>
+               </table>
+       </div>
+       
+       <script type="text/javascript">
+               //<![CDATA[
+               initList('dependentPackages', 0);
+               //]]>
+       </script>
+{/if}
+
+{include file='footer'}
index 78696635096f138973d8b192755093b6e44c4b5f..868bf62d5b6a71203771e496e38b0e600d1f6fe3 100644 (file)
@@ -1,18 +1,18 @@
-{if $__wcf->session->getPermission('admin.general.canUseAcp')}{include file='header' templateName='permissionDenied'}\r
-\r
-<p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>\r
-\r
-{include file='footer'}\r
-{else}{capture assign='pageTitle'}{lang}wcf.global.error.permissionDenied.title{/lang}{/capture}\r
-{include file='setupHeader'}\r
-\r
-<img class="icon" src="{@RELATIVE_WCF_DIR}icon/loginXL.png" alt="" />\r
-\r
-<h1><b>{@$pageTitle}</b></h1>\r
-\r
-<hr />\r
-\r
-<p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>\r
-\r
-{include file='setupFooter'}\r
-{/if}\r
+{if $__wcf->session->getPermission('admin.general.canUseAcp')}{include file='header' templateName='permissionDenied'}
+
+<p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>
+
+{include file='footer'}
+{else}{capture assign='pageTitle'}{lang}wcf.global.error.permissionDenied.title{/lang}{/capture}
+{include file='setupHeader'}
+
+<img class="icon" src="{@RELATIVE_WCF_DIR}icon/loginXL.png" alt="" />
+
+<h1><b>{@$pageTitle}</b></h1>
+
+<hr />
+
+<p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>
+
+{include file='setupFooter'}
+{/if}
index b034bf680b6d9c428fcf64006cb91ae034171ada..17c7245b6472a7de7254beecda2dda49f01d8381 100644 (file)
@@ -1,3 +1,3 @@
-</div>\r
-</body>\r
+</div>
+</body>
 </html>
\ No newline at end of file
index 952a0d135659dd843093e1805f944e1ade26d332..4dcd9d7e91d3ed891dfb3b627e3f87e4820ed6eb 100644 (file)
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" dir="{@$__wcf->getLanguage()->getPageDirection()}" xml:lang="{@$__wcf->getLanguage()->getFixedLanguageCode()}">\r
-       <head>\r
-               <title>{@$pageTitle} - {lang}wcf.global.pageTitle{/lang}</title>\r
-               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
-               <script type="text/javascript">\r
-                       //<![CDATA[\r
-                       var SID_ARG_2ND = '{@SID_ARG_2ND_NOT_ENCODED}';\r
-                       var RELATIVE_WCF_DIR = '{@RELATIVE_WCF_DIR}';\r
-                       //]]>\r
-               </script>\r
-               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/x.js"></script>\r
-               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/protoaculous.1.8.2.min.js"></script>\r
-               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/default.js"></script>\r
-               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>\r
-               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/default.js"></script>\r
-               <style type="text/css">\r
-                       @import url("{@RELATIVE_WCF_DIR}acp/style/extra/setupStyle{if $__wcf->getLanguage()->getPageDirection() == 'rtl'}-rtl{/if}.css");\r
-               </style>\r
-               \r
-               <!--[if lt IE 7]>\r
-                       <style type="text/css">\r
-                               .page {\r
-                                       width: 800px;\r
-                               }\r
-                               .progressText {\r
-                                       margin-top: -16px;\r
-                               }\r
-                       </style>\r
-               <![endif]-->\r
-               <!--[if IE]>\r
-                       <style type="text/css">\r
-                               hr {\r
-                                       margin: 0;\r
-                               }\r
-                               fieldset p, fieldset div {\r
-                                       min-height: 0;\r
-                               }\r
-                       </style>\r
-               <![endif]-->\r
-       </head>\r
-<body>\r
-<div class="page">\r
-\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" dir="{@$__wcf->getLanguage()->getPageDirection()}" xml:lang="{@$__wcf->getLanguage()->getFixedLanguageCode()}">
+       <head>
+               <title>{@$pageTitle} - {lang}wcf.global.pageTitle{/lang}</title>
+               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+               <script type="text/javascript">
+                       //<![CDATA[
+                       var SID_ARG_2ND = '{@SID_ARG_2ND_NOT_ENCODED}';
+                       var RELATIVE_WCF_DIR = '{@RELATIVE_WCF_DIR}';
+                       //]]>
+               </script>
+               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/x.js"></script>
+               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/protoaculous.1.8.2.min.js"></script>
+               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/default.js"></script>
+               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>
+               <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/default.js"></script>
+               <style type="text/css">
+                       @import url("{@RELATIVE_WCF_DIR}acp/style/extra/setupStyle{if $__wcf->getLanguage()->getPageDirection() == 'rtl'}-rtl{/if}.css");
+               </style>
+               
+               <!--[if lt IE 7]>
+                       <style type="text/css">
+                               .page {
+                                       width: 800px;
+                               }
+                               .progressText {
+                                       margin-top: -16px;
+                               }
+                       </style>
+               <![endif]-->
+               <!--[if IE]>
+                       <style type="text/css">
+                               hr {
+                                       margin: 0;
+                               }
+                               fieldset p, fieldset div {
+                                       min-height: 0;
+                               }
+                       </style>
+               <![endif]-->
+       </head>
+<body>
+<div class="page">
+
index b034bf680b6d9c428fcf64006cb91ae034171ada..17c7245b6472a7de7254beecda2dda49f01d8381 100644 (file)
@@ -1,3 +1,3 @@
-</div>\r
-</body>\r
+</div>
+</body>
 </html>
\ No newline at end of file
index 3fa06c2c972e316975b0358de16a0488b1447f5f..30371537fad25510a8e74962d84f06d86b067efe 100644 (file)
@@ -1,5 +1,5 @@
-{include file='header'}\r
-\r
-<p class="success">{lang}{@$message}{/lang}</p>        \r
-\r
+{include file='header'}
+
+<p class="success">{lang}{@$message}{/lang}</p>        
+
 {include file='footer'}
\ No newline at end of file
index f5d6c0fe14b21b8d15bd317f44799c0f64074bed..ad90e8c2f41189150f30738b7301d1be7399d35d 100644 (file)
@@ -1,97 +1,97 @@
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/updateServer{@$action|ucfirst}L.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.updateServer.{$action}{/lang}</h1>\r
-       </hgroup>\r
-</header>\r
-\r
-{if $errorField}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $success|isset}\r
-       <p class="success">{lang}wcf.acp.updateServer.{$action}.success{/lang}</p>      \r
-{/if}\r
-\r
-{if $packageUpdateServer|isset && $packageUpdateServer->errorMessage}\r
-       <p class="warning">{lang}wcf.acp.updateServer.lastErrorMessage{/lang}<br />{$packageUpdateServer->errorMessage}</p>     \r
-{/if}\r
-\r
-<div class="contentHeader">\r
-       <nav class="largeButtons">\r
-               <ul><li><a href="index.php?page=UpdateServerList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.server.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.server.view{/lang}</span></a></li></ul>\r
-       </nav>\r
-</div>\r
-<form method="post" action="index.php?form=UpdateServer{@$action|ucfirst}{if $packageUpdateServerID|isset}&amp;packageUpdateServerID={@$packageUpdateServerID}{/if}">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-       \r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.updateServer.data{/lang}</legend>\r
-                               \r
-                               <div class="formElement{if $errorField == 'server'} formError{/if}" id="serverDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="server">{lang}wcf.acp.updateServer.server{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" name="server" value="{$server}" id="server" />\r
-                                               {if $errorField == 'server'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               {if $errorType == 'notValid'}{lang}wcf.acp.updateServer.server.error.notValid{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="serverHelpMessage">\r
-                                               <p>{lang}wcf.acp.updateServer.server.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('server');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement" id="loginUsernameDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="loginUsername">{lang}wcf.acp.updateServer.loginUsername{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" name="loginUsername" value="{$loginUsername}" id="loginUsername" />\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="loginUsernameHelpMessage">\r
-                                               <p>{lang}wcf.acp.updateServer.loginUsername.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('loginUsername');\r
-                               //]]></script>\r
-                               \r
-                               <div class="formElement" id="loginPasswordDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="loginPassword">{lang}wcf.acp.updateServer.loginPassword{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="password" class="inputText" name="loginPassword" value="{$loginPassword}" id="loginPassword" />\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="loginPasswordHelpMessage">\r
-                                               <p>{lang}wcf.acp.updateServer.loginPassword.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('loginPassword');\r
-                               //]]></script>\r
-                               \r
-                               {if $additionalFields|isset}{@$additionalFields}{/if}\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-       </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/updateServer{@$action|ucfirst}L.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.updateServer.{$action}{/lang}</h1>
+       </hgroup>
+</header>
+
+{if $errorField}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $success|isset}
+       <p class="success">{lang}wcf.acp.updateServer.{$action}.success{/lang}</p>      
+{/if}
+
+{if $packageUpdateServer|isset && $packageUpdateServer->errorMessage}
+       <p class="warning">{lang}wcf.acp.updateServer.lastErrorMessage{/lang}<br />{$packageUpdateServer->errorMessage}</p>     
+{/if}
+
+<div class="contentHeader">
+       <nav class="largeButtons">
+               <ul><li><a href="index.php?page=UpdateServerList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.server.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.server.view{/lang}</span></a></li></ul>
+       </nav>
+</div>
+<form method="post" action="index.php?form=UpdateServer{@$action|ucfirst}{if $packageUpdateServerID|isset}&amp;packageUpdateServerID={@$packageUpdateServerID}{/if}">
+       <div class="border content">
+               <div class="container-1">
+       
+                       <fieldset>
+                               <legend>{lang}wcf.acp.updateServer.data{/lang}</legend>
+                               
+                               <div class="formElement{if $errorField == 'server'} formError{/if}" id="serverDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="server">{lang}wcf.acp.updateServer.server{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" name="server" value="{$server}" id="server" />
+                                               {if $errorField == 'server'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               {if $errorType == 'notValid'}{lang}wcf.acp.updateServer.server.error.notValid{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="serverHelpMessage">
+                                               <p>{lang}wcf.acp.updateServer.server.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('server');
+                               //]]></script>
+                               
+                               <div class="formElement" id="loginUsernameDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="loginUsername">{lang}wcf.acp.updateServer.loginUsername{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" name="loginUsername" value="{$loginUsername}" id="loginUsername" />
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="loginUsernameHelpMessage">
+                                               <p>{lang}wcf.acp.updateServer.loginUsername.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('loginUsername');
+                               //]]></script>
+                               
+                               <div class="formElement" id="loginPasswordDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="loginPassword">{lang}wcf.acp.updateServer.loginPassword{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="password" class="inputText" name="loginPassword" value="{$loginPassword}" id="loginPassword" />
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="loginPasswordHelpMessage">
+                                               <p>{lang}wcf.acp.updateServer.loginPassword.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('loginPassword');
+                               //]]></script>
+                               
+                               {if $additionalFields|isset}{@$additionalFields}{/if}
+                       </fieldset>
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               {@SID_INPUT_TAG}
+       </div>
+</form>
+
+{include file='footer'}
index fa9dec31cbf8f9365588f66a4887f8bb50831188..7545decb8068d550f017d93d856155615258914b 100644 (file)
@@ -1,97 +1,97 @@
-{include file='header'}\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       $(function() {\r
-               new WCF.Action.Delete('wcf\\data\\package\\update\\server\\PackageUpdateServerAction', $('.updateServerRow'));\r
-               new WCF.Action.Toggle('wcf\\data\\package\\update\\server\\PackageUpdateServerAction', $('.updateServerRow'));\r
-       });\r
-       //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/updateServerL.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.updateServer.view{/lang}</h1>\r
-       </hgroup>\r
-</header>\r
-\r
-{if $deletedPackageUpdateServerID}\r
-       <p class="success">{lang}wcf.acp.updateServer.delete.success{/lang}</p>\r
-{/if}\r
-\r
-<div class="contentHeader">\r
-       <nav class="largeButtons">\r
-               <ul><li><a href="index.php?form=UpdateServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.updateServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerAddM.png" alt="" /> <span>{lang}wcf.acp.updateServer.add{/lang}</span></a></li></ul>\r
-       </nav>\r
-</div>\r
-\r
-{if !$updateServers|count}\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <p>{lang}wcf.acp.updateServer.view.noneAvailable{/lang}</p>\r
-               </div>\r
-       </div>\r
-{else}\r
-       <div class="border titleBarPanel">\r
-               <div class="containerHead"><h3>{lang}wcf.acp.updateServer.list.available{/lang}</h3></div>\r
-       </div>\r
-       <div class="border borderMarginRemove">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th class="columnPackageUpdateServerID{if $sortField == 'packageUpdateServerID'} active{/if}" colspan="2"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=packageUpdateServerID&amp;sortOrder={if $sortField == 'packageUpdateServerID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.packageUpdateServerID{/lang}{if $sortField == 'packageUpdateServerID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th class="columnServer{if $sortField == 'server'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=server&amp;sortOrder={if $sortField == 'server' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.server{/lang}{if $sortField == 'server'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th class="columnPackages{if $sortField == 'packages'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=packages&amp;sortOrder={if $sortField == 'packages' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.packages{/lang}{if $sortField == 'packages'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th class="columnStatus{if $sortField == 'status'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=status&amp;sortOrder={if $sortField == 'status' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.status{/lang}{if $sortField == 'status'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th class="columnErrorText{if $sortField == 'errorMessage'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=errorMessage&amp;sortOrder={if $sortField == 'errorMessage' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.errorMessage{/lang}{if $sortField == 'errorMessage'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th class="columnTimestamp{if $sortField == 'lastUpdateTime'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=lastUpdateTime&amp;sortOrder={if $sortField == 'lastUpdateTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.lastUpdateTime{/lang}{if $sortField == 'lastUpdateTime'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       \r
-                                       {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                               {foreach from=$updateServers item=updateServer}\r
-                                       <tr class="updateServerRow {cycle values="container-1,container-2"}">\r
-                                               <td class="columnIcon">\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/{if !$updateServer->disabled}enabled{else}disabled{/if}S.png" alt="" class="toggleButton" title="{lang}wcf.acp.updateServer.{if !$updateServer->disabled}disable{else}enable{/if}{/lang}" data-objectID="{@$updateServer->packageUpdateServerID}" data-disableMessage="{lang}wcf.acp.updateServer.disable{/lang}" data-enableMessage="{lang}wcf.acp.updateServer.enable{/lang}" />\r
-                                                       <a href="index.php?form=UpdateServerEdit&amp;packageUpdateServerID={@$updateServer->packageUpdateServerID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.updateServer.edit{/lang}" /></a>\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.updateServer.delete{/lang}" class="deleteButton" data-objectID="{@$updateServer->packageUpdateServerID}" data-confirmMessage="{lang}wcf.acp.updateServer.delete.sure{/lang}" />\r
-                                                       \r
-                                                       {if $additionalButtons[$updateServer->packageUpdateServerID]|isset}{@$additionalButtons[$updateServer->packageUpdateServerID]}{/if}\r
-                                               </td>\r
-                                               <td class="columnID">{@$updateServer->packageUpdateServerID}</td>\r
-                                               <td class="columnText">\r
-                                                       <a href="index.php?form=UpdateServerEdit&amp;packageUpdateServerID={@$updateServer->packageUpdateServerID}{@SID_ARG_2ND}">\r
-                                                               {@$updateServer->serverURL}\r
-                                                       </a>\r
-                                               </td>\r
-                                               <td class="columnText smallFont">\r
-                                                       {#$updateServer->packages}\r
-                                               </td>\r
-                                               <td class="columnText smallFont" style="color: {if $updateServer->status == 'online'}green{else}red{/if}">\r
-                                                       {@$updateServer->status}\r
-                                               </td>\r
-                                               <td class="columnText smallFont">\r
-                                                       <div title="{@$updateServer->errorMessage}">\r
-                                                               {@$updateServer->errorMessage|truncate:"30"}\r
-                                                       </div>\r
-                                               </td>\r
-                                               <td class="columnDate smallFont">\r
-                                                       {if $updateServer->lastUpdateTime}{@$updateServer->lastUpdateTime|time}{/if}\r
-                                               </td>\r
-                                               \r
-                                               {if $additionalColumns[$updateServer->packageUpdateServerID]|isset}{@$additionalColumns[$updateServer->packageUpdateServerID]}{/if}\r
-                                       </tr>\r
-                               {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-       <div class="contentHeader">\r
-               <nav class="largeButtons">\r
-                       <ul><li><a href="index.php?form=UpdateServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.updateServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerAddM.png" alt="" /> <span>{lang}wcf.acp.updateServer.add{/lang}</span></a></li></ul>\r
-               </nav>\r
-       </div>\r
-{/if}\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<script type="text/javascript">
+       //<![CDATA[
+       $(function() {
+               new WCF.Action.Delete('wcf\\data\\package\\update\\server\\PackageUpdateServerAction', $('.updateServerRow'));
+               new WCF.Action.Toggle('wcf\\data\\package\\update\\server\\PackageUpdateServerAction', $('.updateServerRow'));
+       });
+       //]]>
+</script>
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/updateServerL.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.updateServer.view{/lang}</h1>
+       </hgroup>
+</header>
+
+{if $deletedPackageUpdateServerID}
+       <p class="success">{lang}wcf.acp.updateServer.delete.success{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+       <nav class="largeButtons">
+               <ul><li><a href="index.php?form=UpdateServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.updateServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerAddM.png" alt="" /> <span>{lang}wcf.acp.updateServer.add{/lang}</span></a></li></ul>
+       </nav>
+</div>
+
+{if !$updateServers|count}
+       <div class="border content">
+               <div class="container-1">
+                       <p>{lang}wcf.acp.updateServer.view.noneAvailable{/lang}</p>
+               </div>
+       </div>
+{else}
+       <div class="border titleBarPanel">
+               <div class="containerHead"><h3>{lang}wcf.acp.updateServer.list.available{/lang}</h3></div>
+       </div>
+       <div class="border borderMarginRemove">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th class="columnPackageUpdateServerID{if $sortField == 'packageUpdateServerID'} active{/if}" colspan="2"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=packageUpdateServerID&amp;sortOrder={if $sortField == 'packageUpdateServerID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.packageUpdateServerID{/lang}{if $sortField == 'packageUpdateServerID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th class="columnServer{if $sortField == 'server'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=server&amp;sortOrder={if $sortField == 'server' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.server{/lang}{if $sortField == 'server'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th class="columnPackages{if $sortField == 'packages'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=packages&amp;sortOrder={if $sortField == 'packages' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.packages{/lang}{if $sortField == 'packages'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th class="columnStatus{if $sortField == 'status'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=status&amp;sortOrder={if $sortField == 'status' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.status{/lang}{if $sortField == 'status'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th class="columnErrorText{if $sortField == 'errorMessage'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=errorMessage&amp;sortOrder={if $sortField == 'errorMessage' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.errorMessage{/lang}{if $sortField == 'errorMessage'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th class="columnTimestamp{if $sortField == 'lastUpdateTime'} active{/if}"><div><a href="index.php?page=UpdateServerList&amp;pageNo={@$pageNo}&amp;sortField=lastUpdateTime&amp;sortOrder={if $sortField == 'lastUpdateTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.lastUpdateTime{/lang}{if $sortField == 'lastUpdateTime'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       
+                                       {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}
+                               </tr>
+                       </thead>
+                       <tbody>
+                               {foreach from=$updateServers item=updateServer}
+                                       <tr class="updateServerRow {cycle values="container-1,container-2"}">
+                                               <td class="columnIcon">
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/{if !$updateServer->disabled}enabled{else}disabled{/if}S.png" alt="" class="toggleButton" title="{lang}wcf.acp.updateServer.{if !$updateServer->disabled}disable{else}enable{/if}{/lang}" data-objectID="{@$updateServer->packageUpdateServerID}" data-disableMessage="{lang}wcf.acp.updateServer.disable{/lang}" data-enableMessage="{lang}wcf.acp.updateServer.enable{/lang}" />
+                                                       <a href="index.php?form=UpdateServerEdit&amp;packageUpdateServerID={@$updateServer->packageUpdateServerID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.updateServer.edit{/lang}" /></a>
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.updateServer.delete{/lang}" class="deleteButton" data-objectID="{@$updateServer->packageUpdateServerID}" data-confirmMessage="{lang}wcf.acp.updateServer.delete.sure{/lang}" />
+                                                       
+                                                       {if $additionalButtons[$updateServer->packageUpdateServerID]|isset}{@$additionalButtons[$updateServer->packageUpdateServerID]}{/if}
+                                               </td>
+                                               <td class="columnID">{@$updateServer->packageUpdateServerID}</td>
+                                               <td class="columnText">
+                                                       <a href="index.php?form=UpdateServerEdit&amp;packageUpdateServerID={@$updateServer->packageUpdateServerID}{@SID_ARG_2ND}">
+                                                               {@$updateServer->serverURL}
+                                                       </a>
+                                               </td>
+                                               <td class="columnText smallFont">
+                                                       {#$updateServer->packages}
+                                               </td>
+                                               <td class="columnText smallFont" style="color: {if $updateServer->status == 'online'}green{else}red{/if}">
+                                                       {@$updateServer->status}
+                                               </td>
+                                               <td class="columnText smallFont">
+                                                       <div title="{@$updateServer->errorMessage}">
+                                                               {@$updateServer->errorMessage|truncate:"30"}
+                                                       </div>
+                                               </td>
+                                               <td class="columnDate smallFont">
+                                                       {if $updateServer->lastUpdateTime}{@$updateServer->lastUpdateTime|time}{/if}
+                                               </td>
+                                               
+                                               {if $additionalColumns[$updateServer->packageUpdateServerID]|isset}{@$additionalColumns[$updateServer->packageUpdateServerID]}{/if}
+                                       </tr>
+                               {/foreach}
+                       </tbody>
+               </table>
+       </div>
+       <div class="contentHeader">
+               <nav class="largeButtons">
+                       <ul><li><a href="index.php?form=UpdateServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.updateServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerAddM.png" alt="" /> <span>{lang}wcf.acp.updateServer.add{/lang}</span></a></li></ul>
+               </nav>
+       </div>
+{/if}
+
+{include file='footer'}
index 646f7fa8aa2f7e628367c69593d89b9db3a1c81b..3a10881e484b852ad4ab11064db7bbef9bf088cf 100644 (file)
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>\r
-{if $userID|isset}\r
-       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>\r
-       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/InlineListEdit.class.js"></script>\r
-       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/UserListEdit.class.js"></script>\r
-{/if}\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       var tabMenu = new TabMenu();\r
-       {if $optionTree|count}onloadEvents.push(function() { tabMenu.showSubTabMenu('{@$options[0][object]->categoryName}') });{/if}\r
-       \r
-       {if $userID|isset}\r
-               var userData = new Hash();\r
-               userData.set({@$userID}, {\r
-                       'isMarked': {@$user->isMarked()}\r
-               });\r
-               \r
-               var url = '{@$url|encodeJS}';\r
-               \r
-               // language\r
-               var language = new Object();\r
-               language['wcf.global.button.mark']              = '{lang}wcf.global.button.mark{/lang}';\r
-               language['wcf.global.button.unmark']            = '{lang}wcf.global.button.unmark{/lang}';\r
-               language['wcf.global.button.delete']            = '{lang}wcf.global.button.delete{/lang}';\r
-               language['wcf.acp.user.button.sendMail']        = '{lang}wcf.acp.user.button.sendMail{/lang}';\r
-               language['wcf.acp.user.button.exportMail']      = '{lang}wcf.acp.user.button.exportMail{/lang}';\r
-               language['wcf.acp.user.button.assignGroup']     = '{lang}wcf.acp.user.button.assignGroup{/lang}';\r
-               language['wcf.acp.user.deleteMarked.sure']      = '{lang}wcf.acp.user.deleteMarked.sure{/lang}';\r
-               language['wcf.acp.user.delete.sure']            = '{lang}wcf.acp.user.delete.sure{/lang}';\r
-               language['wcf.acp.user.markedUsers']            = '{lang}wcf.acp.user.markedUsers{/lang}';\r
-               \r
-               // additional options\r
-               var additionalOptions = new Array();\r
-               var additionalUserOptions = new Array();\r
-               {if $additionalUserOptions|isset}{@$additionalUserOptions}{/if}\r
-               {if $additionalMarkedOptions|isset}{@$additionalMarkedOptions}{/if}\r
-               \r
-               // permissions\r
-               var permissions = new Object();\r
-               permissions['canEditUser'] = {if $__wcf->session->getPermission('admin.user.canEditUser')}1{else}0{/if};\r
-               permissions['canDeleteUser'] = {if $__wcf->session->getPermission('admin.user.canDeleteUser')}1{else}0{/if};\r
-               permissions['canMailUser'] = {if $__wcf->session->getPermission('admin.user.canMailUser')}1{else}0{/if};\r
-               permissions['canEditMailAddress'] = {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}1{else}0{/if};\r
-               permissions['canEditPassword'] = {if $__wcf->session->getPermission('admin.user.canEditPassword')}1{else}0{/if};\r
-               \r
-               onloadEvents.push(function() { userListEdit = new UserListEdit(userData, {@$markedUsers}, additionalUserOptions, additionalOptions); });\r
-       {/if}\r
-       //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
-       <img {if $userID|isset}id="userEdit{@$userID}" {/if}src="{@RELATIVE_WCF_DIR}icon/user{@$action|ucfirst}L.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.user.{@$action}{/lang}</h1>\r
-       </hgroup>\r
-</header>\r
-\r
-{if $errorField}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $success|isset}\r
-       <p class="success">{lang}wcf.acp.user.{@$action}.success{/lang}</p>     \r
-{/if}\r
-\r
-{if $userID|isset && $__wcf->user->userID == $userID}\r
-       <p class="warning">{lang}wcf.acp.user.edit.warning.selfEdit{/lang}</p>  \r
-{/if}\r
-\r
-<div class="contentHeader">\r
-       <nav class="largeButtons">\r
-               <ul>\r
-                       <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>\r
-                       <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>\r
-                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-               </ul>\r
-       </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=User{@$action|ucfirst}">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <div class="formElement{if $errorType.username|isset} formError{/if}">\r
-                               <div class="formFieldLabel">\r
-                                       <label for="username">{lang}wcf.user.username{/lang}</label>\r
-                               </div>\r
-                               <div class="formField">\r
-                                       <input type="text" class="inputText" id="username" name="username" value="{$username}" />\r
-                                       {if $errorType.username|isset}\r
-                                               <p class="innerError">\r
-                                                       {if $errorType.username == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                       {if $errorType.username == 'notValid'}{lang}wcf.user.error.username.notValid{/lang}{/if}\r
-                                                       {if $errorType.username == 'notUnique'}{lang}wcf.user.error.username.notUnique{/lang}{/if}\r
-                                               </p>\r
-                                       {/if}\r
-                               </div>\r
-                       </div>\r
-                       \r
-                       {if $availableGroups|count}\r
-                               <div class="formGroup">\r
-                                       <div class="formGroupLabel">\r
-                                               <label>{lang}wcf.acp.user.groups{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formGroupField">\r
-                                               <fieldset>\r
-                                                       <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
-                                                       \r
-                                                       <div class="formField">\r
-                                                               {htmlCheckboxes options=$availableGroups name=groupIDs selected=$groupIDs}\r
-                                                       </div>\r
-                                               </fieldset>\r
-                                       </div>\r
-                               </div>\r
-                       {/if}\r
-                       \r
-                       {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditMailAddress')}\r
-                               <fieldset>\r
-                                       <legend>{lang}wcf.user.email{/lang}</legend>\r
-                                       <div class="formElement{if $errorType.email|isset} formError{/if}">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="email">{lang}wcf.user.email{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField"> \r
-                                                       <input type="text" class="inputText" id="email" name="email" value="{$email}" />\r
-                                                       {if $errorType.email|isset}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType.email == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                                       {if $errorType.email == 'notValid'}{lang}wcf.user.error.email.notValid{/lang}{/if}\r
-                                                                       {if $errorType.email == 'notUnique'}{lang}wcf.user.error.email.notUnique{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                       </div>\r
-                                       \r
-                                       <div class="formElement{if $errorType.confirmEmail|isset} formError{/if}">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="confirmEmail">{lang}wcf.user.confirmEmail{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField">\r
-                                                       <input type="text" class="inputText" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" />\r
-                                                       {if $errorType.confirmEmail|isset}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType.confirmEmail == 'notEqual'}{lang}wcf.user.error.confirmEmail.notEqual{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                       </div>\r
-                               </fieldset>\r
-                       {/if}\r
-                       \r
-                       {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditPassword')}\r
-                               <fieldset>\r
-                                       <legend>{lang}wcf.user.password{/lang}</legend>\r
-                                       <div class="formElement{if $errorType.password|isset} formError{/if}">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="password">{lang}wcf.user.password{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField">\r
-                                                       <input type="password" class="inputText" id="password" name="password" value="{$password}" />\r
-                                                       {if $errorType.password|isset}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType.password == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                       </div>\r
-                                       \r
-                                       <div class="formElement{if $errorType.confirmPassword|isset} formError{/if}">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="confirmPassword">{lang}wcf.user.confirmPassword{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField">\r
-                                                       <input type="password" class="inputText" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" />\r
-                                                       {if $errorType.confirmPassword|isset}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType.confirmPassword == 'notEqual'}{lang}wcf.user.error.confirmPassword.notEqual{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                       </div>\r
-                               </fieldset>\r
-                       {/if}\r
-               \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-                       \r
-                       {if $optionTree|count || $additionalTabs|isset}\r
-                               <nav>\r
-                                       <div class="tabMenu">\r
-                                               <ul>\r
-                                                       {foreach from=$optionTree item=categoryLevel1}\r
-                                                               <li id="{@$categoryLevel1[object]->categoryName}"><a onclick="tabMenu.showSubTabMenu('{@$categoryLevel1[object]->categoryName}');"><span>{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</span></a></li>\r
-                                                       {/foreach}\r
-                                                       \r
-                                                       {if $additionalTabs|isset}{@$additionalTabs}{/if}\r
-                                               </ul>\r
-                                       </div>\r
-                               <nav>\r
-                               <div class="subTabMenu">\r
-                                       <div class="containerHead"><div> </div></div>\r
-                               </div>\r
-                               \r
-                               {foreach from=$optionTree item=categoryLevel1}\r
-                                       <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}-content">\r
-                                               <div class="container-1">\r
-                                                       <h3 class="subHeading">{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</h3>\r
-                                                       \r
-                                                       {foreach from=$categoryLevel1[categories] item=categoryLevel2}\r
-                                                               <fieldset>\r
-                                                                       <legend>{lang}wcf.user.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</legend>\r
-                                                                       \r
-                                                                       {if $categoryLevel2[object]->categoryName == 'settings.general' && $availableLanguages|count > 1}\r
-                                                                               <div class="formElement">\r
-                                                                                       <div class="formFieldLabel">\r
-                                                                                               <label for="languageID">{lang}wcf.user.language{/lang}</label>\r
-                                                                                       </div>\r
-                                                                                       <div class="formField">\r
-                                                                                               {htmlOptions options=$availableLanguages selected=$languageID name=languageID id=languageID disableEncoding=true}\r
-                                                                                       </div>\r
-                                                                               </div>\r
-                                                                                       \r
-                                                                               {if $availableContentLanguages|count > 1}\r
-                                                                                       <div class="formGroup">\r
-                                                                                               <div class="formGroupLabel">\r
-                                                                                                       {lang}wcf.user.visibleLanguages{/lang}\r
-                                                                                               </div>\r
-                                                                                               <div class="formGroupField">\r
-                                                                                                       <fieldset>\r
-                                                                                                               <legend>{lang}wcf.user.visibleLanguages{/lang}</legend>\r
-                                                                                                               <div class="formField">\r
-                                                                                                                       <ul class="formOptions">\r
-                                                                                                                       {foreach from=$availableContentLanguages key=availableLanguageID item=availableLanguage}\r
-                                                                                                                               <li><label><input type="checkbox" name="visibleLanguages[]" value="{@$availableLanguageID}"{if $availableLanguageID|in_array:$visibleLanguages} checked="checked"{/if} /> {@$availableLanguage}</label></li>\r
-                                                                                                                       {/foreach}\r
-                                                                                                                       </ul>\r
-                                                                                                               </div>\r
-                                                                                                       </fieldset>\r
-                                                                                               </div>\r
-                                                                                       </div>\r
-                                                                               {/if}\r
-                                                                       {/if}\r
-                                                                       \r
-                                                                       {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.user.option.'}\r
-                                                               </fieldset>\r
-                                                       {/foreach}\r
-                                               </div>\r
-                                       </div>\r
-                               {/foreach}\r
-                       {/if}\r
-                       \r
-                       {if $additionalTabContents|isset}{@$additionalTabContents}{/if}\r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="action" value="{@$action}" />\r
-               {if $userID|isset}<input type="hidden" name="userID" value="{@$userID}" />{/if}\r
-       </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>
+{if $userID|isset}
+       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>
+       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/InlineListEdit.class.js"></script>
+       <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/UserListEdit.class.js"></script>
+{/if}
+<script type="text/javascript">
+       //<![CDATA[
+       var tabMenu = new TabMenu();
+       {if $optionTree|count}onloadEvents.push(function() { tabMenu.showSubTabMenu('{@$options[0][object]->categoryName}') });{/if}
+       
+       {if $userID|isset}
+               var userData = new Hash();
+               userData.set({@$userID}, {
+                       'isMarked': {@$user->isMarked()}
+               });
+               
+               var url = '{@$url|encodeJS}';
+               
+               // language
+               var language = new Object();
+               language['wcf.global.button.mark']              = '{lang}wcf.global.button.mark{/lang}';
+               language['wcf.global.button.unmark']            = '{lang}wcf.global.button.unmark{/lang}';
+               language['wcf.global.button.delete']            = '{lang}wcf.global.button.delete{/lang}';
+               language['wcf.acp.user.button.sendMail']        = '{lang}wcf.acp.user.button.sendMail{/lang}';
+               language['wcf.acp.user.button.exportMail']      = '{lang}wcf.acp.user.button.exportMail{/lang}';
+               language['wcf.acp.user.button.assignGroup']     = '{lang}wcf.acp.user.button.assignGroup{/lang}';
+               language['wcf.acp.user.deleteMarked.sure']      = '{lang}wcf.acp.user.deleteMarked.sure{/lang}';
+               language['wcf.acp.user.delete.sure']            = '{lang}wcf.acp.user.delete.sure{/lang}';
+               language['wcf.acp.user.markedUsers']            = '{lang}wcf.acp.user.markedUsers{/lang}';
+               
+               // additional options
+               var additionalOptions = new Array();
+               var additionalUserOptions = new Array();
+               {if $additionalUserOptions|isset}{@$additionalUserOptions}{/if}
+               {if $additionalMarkedOptions|isset}{@$additionalMarkedOptions}{/if}
+               
+               // permissions
+               var permissions = new Object();
+               permissions['canEditUser'] = {if $__wcf->session->getPermission('admin.user.canEditUser')}1{else}0{/if};
+               permissions['canDeleteUser'] = {if $__wcf->session->getPermission('admin.user.canDeleteUser')}1{else}0{/if};
+               permissions['canMailUser'] = {if $__wcf->session->getPermission('admin.user.canMailUser')}1{else}0{/if};
+               permissions['canEditMailAddress'] = {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}1{else}0{/if};
+               permissions['canEditPassword'] = {if $__wcf->session->getPermission('admin.user.canEditPassword')}1{else}0{/if};
+               
+               onloadEvents.push(function() { userListEdit = new UserListEdit(userData, {@$markedUsers}, additionalUserOptions, additionalOptions); });
+       {/if}
+       //]]>
+</script>
+
+<header class="mainHeading">
+       <img {if $userID|isset}id="userEdit{@$userID}" {/if}src="{@RELATIVE_WCF_DIR}icon/user{@$action|ucfirst}L.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.user.{@$action}{/lang}</h1>
+       </hgroup>
+</header>
+
+{if $errorField}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $success|isset}
+       <p class="success">{lang}wcf.acp.user.{@$action}.success{/lang}</p>     
+{/if}
+
+{if $userID|isset && $__wcf->user->userID == $userID}
+       <p class="warning">{lang}wcf.acp.user.edit.warning.selfEdit{/lang}</p>  
+{/if}
+
+<div class="contentHeader">
+       <nav class="largeButtons">
+               <ul>
+                       <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>
+                       <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>
+                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+               </ul>
+       </nav>
+</div>
+
+<form method="post" action="index.php?form=User{@$action|ucfirst}">
+       <div class="border content">
+               <div class="container-1">
+                       <div class="formElement{if $errorType.username|isset} formError{/if}">
+                               <div class="formFieldLabel">
+                                       <label for="username">{lang}wcf.user.username{/lang}</label>
+                               </div>
+                               <div class="formField">
+                                       <input type="text" class="inputText" id="username" name="username" value="{$username}" />
+                                       {if $errorType.username|isset}
+                                               <p class="innerError">
+                                                       {if $errorType.username == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                       {if $errorType.username == 'notValid'}{lang}wcf.user.error.username.notValid{/lang}{/if}
+                                                       {if $errorType.username == 'notUnique'}{lang}wcf.user.error.username.notUnique{/lang}{/if}
+                                               </p>
+                                       {/if}
+                               </div>
+                       </div>
+                       
+                       {if $availableGroups|count}
+                               <div class="formGroup">
+                                       <div class="formGroupLabel">
+                                               <label>{lang}wcf.acp.user.groups{/lang}</label>
+                                       </div>
+                                       <div class="formGroupField">
+                                               <fieldset>
+                                                       <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+                                                       
+                                                       <div class="formField">
+                                                               {htmlCheckboxes options=$availableGroups name=groupIDs selected=$groupIDs}
+                                                       </div>
+                                               </fieldset>
+                                       </div>
+                               </div>
+                       {/if}
+                       
+                       {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditMailAddress')}
+                               <fieldset>
+                                       <legend>{lang}wcf.user.email{/lang}</legend>
+                                       <div class="formElement{if $errorType.email|isset} formError{/if}">
+                                               <div class="formFieldLabel">
+                                                       <label for="email">{lang}wcf.user.email{/lang}</label>
+                                               </div>
+                                               <div class="formField"> 
+                                                       <input type="text" class="inputText" id="email" name="email" value="{$email}" />
+                                                       {if $errorType.email|isset}
+                                                               <p class="innerError">
+                                                                       {if $errorType.email == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                                       {if $errorType.email == 'notValid'}{lang}wcf.user.error.email.notValid{/lang}{/if}
+                                                                       {if $errorType.email == 'notUnique'}{lang}wcf.user.error.email.notUnique{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                       </div>
+                                       
+                                       <div class="formElement{if $errorType.confirmEmail|isset} formError{/if}">
+                                               <div class="formFieldLabel">
+                                                       <label for="confirmEmail">{lang}wcf.user.confirmEmail{/lang}</label>
+                                               </div>
+                                               <div class="formField">
+                                                       <input type="text" class="inputText" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" />
+                                                       {if $errorType.confirmEmail|isset}
+                                                               <p class="innerError">
+                                                                       {if $errorType.confirmEmail == 'notEqual'}{lang}wcf.user.error.confirmEmail.notEqual{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                       </div>
+                               </fieldset>
+                       {/if}
+                       
+                       {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditPassword')}
+                               <fieldset>
+                                       <legend>{lang}wcf.user.password{/lang}</legend>
+                                       <div class="formElement{if $errorType.password|isset} formError{/if}">
+                                               <div class="formFieldLabel">
+                                                       <label for="password">{lang}wcf.user.password{/lang}</label>
+                                               </div>
+                                               <div class="formField">
+                                                       <input type="password" class="inputText" id="password" name="password" value="{$password}" />
+                                                       {if $errorType.password|isset}
+                                                               <p class="innerError">
+                                                                       {if $errorType.password == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                       </div>
+                                       
+                                       <div class="formElement{if $errorType.confirmPassword|isset} formError{/if}">
+                                               <div class="formFieldLabel">
+                                                       <label for="confirmPassword">{lang}wcf.user.confirmPassword{/lang}</label>
+                                               </div>
+                                               <div class="formField">
+                                                       <input type="password" class="inputText" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" />
+                                                       {if $errorType.confirmPassword|isset}
+                                                               <p class="innerError">
+                                                                       {if $errorType.confirmPassword == 'notEqual'}{lang}wcf.user.error.confirmPassword.notEqual{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                       </div>
+                               </fieldset>
+                       {/if}
+               
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+                       
+                       {if $optionTree|count || $additionalTabs|isset}
+                               <nav>
+                                       <div class="tabMenu">
+                                               <ul>
+                                                       {foreach from=$optionTree item=categoryLevel1}
+                                                               <li id="{@$categoryLevel1[object]->categoryName}"><a onclick="tabMenu.showSubTabMenu('{@$categoryLevel1[object]->categoryName}');"><span>{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</span></a></li>
+                                                       {/foreach}
+                                                       
+                                                       {if $additionalTabs|isset}{@$additionalTabs}{/if}
+                                               </ul>
+                                       </div>
+                               <nav>
+                               <div class="subTabMenu">
+                                       <div class="containerHead"><div> </div></div>
+                               </div>
+                               
+                               {foreach from=$optionTree item=categoryLevel1}
+                                       <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}-content">
+                                               <div class="container-1">
+                                                       <h3 class="subHeading">{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</h3>
+                                                       
+                                                       {foreach from=$categoryLevel1[categories] item=categoryLevel2}
+                                                               <fieldset>
+                                                                       <legend>{lang}wcf.user.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</legend>
+                                                                       
+                                                                       {if $categoryLevel2[object]->categoryName == 'settings.general' && $availableLanguages|count > 1}
+                                                                               <div class="formElement">
+                                                                                       <div class="formFieldLabel">
+                                                                                               <label for="languageID">{lang}wcf.user.language{/lang}</label>
+                                                                                       </div>
+                                                                                       <div class="formField">
+                                                                                               {htmlOptions options=$availableLanguages selected=$languageID name=languageID id=languageID disableEncoding=true}
+                                                                                       </div>
+                                                                               </div>
+                                                                                       
+                                                                               {if $availableContentLanguages|count > 1}
+                                                                                       <div class="formGroup">
+                                                                                               <div class="formGroupLabel">
+                                                                                                       {lang}wcf.user.visibleLanguages{/lang}
+                                                                                               </div>
+                                                                                               <div class="formGroupField">
+                                                                                                       <fieldset>
+                                                                                                               <legend>{lang}wcf.user.visibleLanguages{/lang}</legend>
+                                                                                                               <div class="formField">
+                                                                                                                       <ul class="formOptions">
+                                                                                                                       {foreach from=$availableContentLanguages key=availableLanguageID item=availableLanguage}
+                                                                                                                               <li><label><input type="checkbox" name="visibleLanguages[]" value="{@$availableLanguageID}"{if $availableLanguageID|in_array:$visibleLanguages} checked="checked"{/if} /> {@$availableLanguage}</label></li>
+                                                                                                                       {/foreach}
+                                                                                                                       </ul>
+                                                                                                               </div>
+                                                                                                       </fieldset>
+                                                                                               </div>
+                                                                                       </div>
+                                                                               {/if}
+                                                                       {/if}
+                                                                       
+                                                                       {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.user.option.'}
+                                                               </fieldset>
+                                                       {/foreach}
+                                               </div>
+                                       </div>
+                               {/foreach}
+                       {/if}
+                       
+                       {if $additionalTabContents|isset}{@$additionalTabContents}{/if}
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="action" value="{@$action}" />
+               {if $userID|isset}<input type="hidden" name="userID" value="{@$userID}" />{/if}
+       </div>
+</form>
+
+{include file='footer'}
index 403e91e5eeec23ab9977bc51b48cbfbea32757da..cd262bd655e26f8de814bd4f7df5e081c4171bf5 100644 (file)
@@ -1,51 +1,51 @@
-{include file='header'}\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/usersL.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.user.assignToGroup{/lang}</h2>\r
-       </div>\r
-</div>\r
-\r
-{if $errorField}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=UserAssignToGroup">\r
-\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.user.assignToGroup.markedUsers{/lang}</legend>\r
-                               \r
-                               <div>\r
-                                       {implode from=$users item=$user}<a href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}\r
-                               </div>\r
-                       </fieldset>     \r
-                       \r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
-                               \r
-                               <div>\r
-                                       <div class="formField{if $errorField == 'groupIDs'} formError{/if}">\r
-                                               {htmlCheckboxes options=$groups name=groupIDs selected=$groupIDs}\r
-                                               {if $errorField == 'groupIDs'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                               </div>\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="userIDs" value="{@$userIDs}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/usersL.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.user.assignToGroup{/lang}</h2>
+       </div>
+</div>
+
+{if $errorField}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=UserAssignToGroup">
+
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.user.assignToGroup.markedUsers{/lang}</legend>
+                               
+                               <div>
+                                       {implode from=$users item=$user}<a href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}
+                               </div>
+                       </fieldset>     
+                       
+                       <fieldset>
+                               <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+                               
+                               <div>
+                                       <div class="formField{if $errorField == 'groupIDs'} formError{/if}">
+                                               {htmlCheckboxes options=$groups name=groupIDs selected=$groupIDs}
+                                               {if $errorField == 'groupIDs'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                               </div>
+                       </fieldset>
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="userIDs" value="{@$userIDs}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index ed7c2e206d15b3c8e1ed318d1b1031de926576c8..e34b5385b1f6cfe4f47742b51b52c3048cade586 100644 (file)
@@ -1,90 +1,90 @@
-{include file='header'}\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       function setFileType(newType) {\r
-               switch (newType) {\r
-                       case 'csv':\r
-                               showOptions('separatorDiv', 'textSeparatorDiv');\r
-                               break;\r
-                       case 'xml':\r
-                               hideOptions('separatorDiv', 'textSeparatorDiv');\r
-                               break;\r
-               }\r
-       }\r
-       onloadEvents.push(function() { setFileType('{@$fileType}'); });\r
-       //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/usersL.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.user.exportEmailAddress{/lang}</h2>\r
-       </div>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=UserEmailAddressExport">\r
-\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.user.exportEmailAddress.markedUsers{/lang}</legend>\r
-                               \r
-                               <div>\r
-                                       {implode from=$users item=$user}<a href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}\r
-                               </div>\r
-                       </fieldset>     \r
-                       \r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.user.exportEmailAddress.format{/lang}</legend>\r
-                               \r
-                               <div>\r
-                                       <div class="formGroup">\r
-                                               <div class="formGroupLabel">\r
-                                                       <label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formGroupField">\r
-                                                       <fieldset>\r
-                                                               <legend>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</legend>\r
-                                                               \r
-                                                               <div class="formField">\r
-                                                                       <ul class="formOptionsLong">\r
-                                                                               <li><label><input onclick="if (IS_SAFARI) setFileType('csv')" onfocus="setFileType('csv')" type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label></li>\r
-                                                                               <li><label><input onclick="if (IS_SAFARI) setFileType('xml')" onfocus="setFileType('xml')" type="radio" name="fileType" value="xml" {if $fileType == 'xml'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label></li>\r
-                                                                       </ul>\r
-                                                               </div>\r
-                                                       </fieldset>\r
-                                               </div>\r
-                                       </div>\r
-                               \r
-                                       <div class="formElement" id="separatorDiv">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="separator">{lang}wcf.acp.user.exportEmailAddress.separator{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField">\r
-                                                       <textarea id="separator" name="separator" rows="2" cols="40">{$separator}</textarea>\r
-                                               </div>\r
-                                       </div>\r
-                                       \r
-                                       <div class="formElement" id="textSeparatorDiv">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="textSeparator">{lang}wcf.acp.user.exportEmailAddress.textSeparator{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField">\r
-                                                       <input type="text" class="inputText" id="textSeparator" name="textSeparator" value="{$textSeparator}" />\r
-                                               </div>\r
-                                       </div>\r
-                               </div>\r
-                       </fieldset>\r
-       \r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="userIDs" value="{@$userIDs}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+<script type="text/javascript">
+       //<![CDATA[
+       function setFileType(newType) {
+               switch (newType) {
+                       case 'csv':
+                               showOptions('separatorDiv', 'textSeparatorDiv');
+                               break;
+                       case 'xml':
+                               hideOptions('separatorDiv', 'textSeparatorDiv');
+                               break;
+               }
+       }
+       onloadEvents.push(function() { setFileType('{@$fileType}'); });
+       //]]>
+</script>
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/usersL.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.user.exportEmailAddress{/lang}</h2>
+       </div>
+</div>
+
+<form method="post" action="index.php?form=UserEmailAddressExport">
+
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.user.exportEmailAddress.markedUsers{/lang}</legend>
+                               
+                               <div>
+                                       {implode from=$users item=$user}<a href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}
+                               </div>
+                       </fieldset>     
+                       
+                       <fieldset>
+                               <legend>{lang}wcf.acp.user.exportEmailAddress.format{/lang}</legend>
+                               
+                               <div>
+                                       <div class="formGroup">
+                                               <div class="formGroupLabel">
+                                                       <label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label>
+                                               </div>
+                                               <div class="formGroupField">
+                                                       <fieldset>
+                                                               <legend>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</legend>
+                                                               
+                                                               <div class="formField">
+                                                                       <ul class="formOptionsLong">
+                                                                               <li><label><input onclick="if (IS_SAFARI) setFileType('csv')" onfocus="setFileType('csv')" type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label></li>
+                                                                               <li><label><input onclick="if (IS_SAFARI) setFileType('xml')" onfocus="setFileType('xml')" type="radio" name="fileType" value="xml" {if $fileType == 'xml'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label></li>
+                                                                       </ul>
+                                                               </div>
+                                                       </fieldset>
+                                               </div>
+                                       </div>
+                               
+                                       <div class="formElement" id="separatorDiv">
+                                               <div class="formFieldLabel">
+                                                       <label for="separator">{lang}wcf.acp.user.exportEmailAddress.separator{/lang}</label>
+                                               </div>
+                                               <div class="formField">
+                                                       <textarea id="separator" name="separator" rows="2" cols="40">{$separator}</textarea>
+                                               </div>
+                                       </div>
+                                       
+                                       <div class="formElement" id="textSeparatorDiv">
+                                               <div class="formFieldLabel">
+                                                       <label for="textSeparator">{lang}wcf.acp.user.exportEmailAddress.textSeparator{/lang}</label>
+                                               </div>
+                                               <div class="formField">
+                                                       <input type="text" class="inputText" id="textSeparator" name="textSeparator" value="{$textSeparator}" />
+                                               </div>
+                                       </div>
+                               </div>
+                       </fieldset>
+       
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="userIDs" value="{@$userIDs}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index 1da9bae441e9c0a0a857a812883cd567e2449082..7725e615101a66e2663b03fedd3f3638fcef4658 100644 (file)
@@ -1,21 +1,21 @@
-{include file='header' templateName='userException'}\r
-\r
-<p class="error" id="errorMessage">\r
-       {@$message}\r
-</p>\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       if (document.referrer) {\r
-               onloadEvents.push(function() { document.getElementById('errorMessage').innerHTML += "<br /><a href=\"" + document.referrer + "{@SID_ARG_2ND_NOT_ENCODED}\">{lang}wcf.global.error.backward{/lang}</a>"; });\r
-       }\r
-       //]]>\r
-</script>\r
-\r
-<!-- \r
-{$name} thrown in {$file} ({@$line})\r
-Stracktrace:\r
-{$stacktrace}\r
--->\r
-\r
+{include file='header' templateName='userException'}
+
+<p class="error" id="errorMessage">
+       {@$message}
+</p>
+
+<script type="text/javascript">
+       //<![CDATA[
+       if (document.referrer) {
+               onloadEvents.push(function() { document.getElementById('errorMessage').innerHTML += "<br /><a href=\"" + document.referrer + "{@SID_ARG_2ND_NOT_ENCODED}\">{lang}wcf.global.error.backward{/lang}</a>"; });
+       }
+       //]]>
+</script>
+
+<!-- 
+{$name} thrown in {$file} ({@$line})
+Stracktrace:
+{$stacktrace}
+-->
+
 {include file='footer'}
\ No newline at end of file
index 625a2aaac14a7f5c7cbd88771a9e5fbf143f8776..80fa26939ff2735bad0590359415fecb22085027 100644 (file)
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       var tabMenu = new TabMenu();\r
-       onloadEvents.push(function() { tabMenu.showSubTabMenu("{$activeTabMenuItem}", "{$activeSubTabMenuItem}"); });\r
-       //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/userGroup{@$action|ucfirst}L.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.group.{@$action}{/lang}</h2>\r
-       </div>\r
-</div>\r
-\r
-{if $errorField}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $success|isset}\r
-       <p class="success">{lang}wcf.acp.group.{@$action}.success{/lang}</p>    \r
-{/if}\r
-\r
-{if $warningSelfEdit|isset}\r
-       <p class="warning">{lang}wcf.acp.group.edit.warning.selfIsMember{/lang}</p>     \r
-{/if}\r
-\r
-<div class="contentHeader">\r
-       <div class="largeButtons">\r
-               <ul>\r
-                       <li><a href="index.php?page=UserGroupList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.group.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupM.png" alt="" /> <span>{lang}wcf.acp.menu.link.group.view{/lang}</span></a></li>\r
-                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-               </ul>\r
-       </div>\r
-</div>\r
-<form method="post" action="index.php?form=UserGroup{@$action|ucfirst}">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.group.data{/lang}</legend>\r
-                               \r
-                               <div class="formElement{if $errorType.groupName|isset} formError{/if}" id="groupNameDiv">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="groupName">{lang}wcf.acp.group.groupName{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="groupName" name="groupName" value="{$groupName}" />\r
-                                               {if $errorType.groupName|isset}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType.groupName == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </div>\r
-                                       <div class="formFieldDesc hidden" id="groupNameHelpMessage">\r
-                                               <p>{lang}wcf.acp.group.groupName.description{/lang}</p>\r
-                                       </div>\r
-                               </div>\r
-                               <script type="text/javascript">//<![CDATA[\r
-                                       inlineHelp.register('groupName');\r
-                               //]]></script>\r
-                               \r
-                               {if $additionalFields|isset}{@$additionalFields}{/if}\r
-                       </fieldset>\r
-               \r
-                       {if $additionalFieldSets|isset}{@$additionalFieldSets}{/if}\r
-               \r
-                       <div class="tabMenu">\r
-                               <ul>\r
-                                       {foreach from=$optionTree item=categoryLevel1}\r
-                                               <li id="{@$categoryLevel1[object]->categoryName}"><a onclick="tabMenu.showSubTabMenu('{@$categoryLevel1[object]->categoryName}');"><span>{lang}wcf.acp.group.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</span></a></li>\r
-                                       {/foreach}\r
-                               </ul>\r
-                       </div>\r
-                       <div class="subTabMenu">\r
-                               <div class="containerHead">\r
-                                       {foreach from=$optionTree item=categoryLevel1}\r
-                                               <ul class="hidden" id="{@$categoryLevel1[object]->categoryName}-categories">\r
-                                                       {foreach from=$categoryLevel1[categories] item=categoryLevel2}\r
-                                                               <li id="{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}"><a onclick="tabMenu.showTabMenuContent('{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}');"><span>{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</span></a></li>\r
-                                                       {/foreach}\r
-                                               </ul>\r
-                                       {/foreach}\r
-                               </div>\r
-                       </div>\r
-                       \r
-                       {foreach from=$optionTree item=categoryLevel1}\r
-                               {foreach from=$categoryLevel1[categories] item=categoryLevel2}\r
-                                       <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}-content">\r
-                                               <div class="container-1">\r
-                                                       <h3 class="subHeadline">{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</h3>\r
-                                                       <p class="description">{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}.description{/lang}</p>\r
-                                                       \r
-                                                       {if $categoryLevel2[options]|count}\r
-                                                               {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.acp.group.option.'}\r
-                                                       {/if}\r
-                                                       \r
-                                                       {if $categoryLevel2[categories]|count}\r
-                                                               {foreach from=$categoryLevel2[categories] item=categoryLevel3}\r
-                                                                       <fieldset>\r
-                                                                               <legend>{lang}wcf.acp.group.option.category.{@$categoryLevel3[object]->categoryName}{/lang}</legend>\r
-                                                                               <p class="description">{lang}wcf.acp.group.option.category.{@$categoryLevel3[object]->categoryName}.description{/lang}</p>\r
-                                                                       \r
-                                                                               <div>\r
-                                                                                       {include file='optionFieldList' options=$categoryLevel3[options] langPrefix='wcf.acp.group.option.'}\r
-                                                                               </div>\r
-                                                                       </fieldset>\r
-                                                               {/foreach}\r
-                                                       {/if}\r
-                                               </div>\r
-                                       </div>\r
-                               {/foreach}\r
-                       {/foreach}\r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="action" value="{@$action}" />\r
-               {if $groupID|isset}<input type="hidden" name="groupID" value="{@$groupID}" />{/if}\r
-               \r
-               <input type="hidden" id="activeTabMenuItem" name="activeTabMenuItem" value="{$activeTabMenuItem}" />\r
-               <input type="hidden" id="activeSubTabMenuItem" name="activeSubTabMenuItem" value="{$activeSubTabMenuItem}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>
+<script type="text/javascript">
+       //<![CDATA[
+       var tabMenu = new TabMenu();
+       onloadEvents.push(function() { tabMenu.showSubTabMenu("{$activeTabMenuItem}", "{$activeSubTabMenuItem}"); });
+       //]]>
+</script>
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/userGroup{@$action|ucfirst}L.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.group.{@$action}{/lang}</h2>
+       </div>
+</div>
+
+{if $errorField}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $success|isset}
+       <p class="success">{lang}wcf.acp.group.{@$action}.success{/lang}</p>    
+{/if}
+
+{if $warningSelfEdit|isset}
+       <p class="warning">{lang}wcf.acp.group.edit.warning.selfIsMember{/lang}</p>     
+{/if}
+
+<div class="contentHeader">
+       <div class="largeButtons">
+               <ul>
+                       <li><a href="index.php?page=UserGroupList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.group.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupM.png" alt="" /> <span>{lang}wcf.acp.menu.link.group.view{/lang}</span></a></li>
+                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+               </ul>
+       </div>
+</div>
+<form method="post" action="index.php?form=UserGroup{@$action|ucfirst}">
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.group.data{/lang}</legend>
+                               
+                               <div class="formElement{if $errorType.groupName|isset} formError{/if}" id="groupNameDiv">
+                                       <div class="formFieldLabel">
+                                               <label for="groupName">{lang}wcf.acp.group.groupName{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="groupName" name="groupName" value="{$groupName}" />
+                                               {if $errorType.groupName|isset}
+                                                       <p class="innerError">
+                                                               {if $errorType.groupName == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </div>
+                                       <div class="formFieldDesc hidden" id="groupNameHelpMessage">
+                                               <p>{lang}wcf.acp.group.groupName.description{/lang}</p>
+                                       </div>
+                               </div>
+                               <script type="text/javascript">//<![CDATA[
+                                       inlineHelp.register('groupName');
+                               //]]></script>
+                               
+                               {if $additionalFields|isset}{@$additionalFields}{/if}
+                       </fieldset>
+               
+                       {if $additionalFieldSets|isset}{@$additionalFieldSets}{/if}
+               
+                       <div class="tabMenu">
+                               <ul>
+                                       {foreach from=$optionTree item=categoryLevel1}
+                                               <li id="{@$categoryLevel1[object]->categoryName}"><a onclick="tabMenu.showSubTabMenu('{@$categoryLevel1[object]->categoryName}');"><span>{lang}wcf.acp.group.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</span></a></li>
+                                       {/foreach}
+                               </ul>
+                       </div>
+                       <div class="subTabMenu">
+                               <div class="containerHead">
+                                       {foreach from=$optionTree item=categoryLevel1}
+                                               <ul class="hidden" id="{@$categoryLevel1[object]->categoryName}-categories">
+                                                       {foreach from=$categoryLevel1[categories] item=categoryLevel2}
+                                                               <li id="{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}"><a onclick="tabMenu.showTabMenuContent('{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}');"><span>{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</span></a></li>
+                                                       {/foreach}
+                                               </ul>
+                                       {/foreach}
+                               </div>
+                       </div>
+                       
+                       {foreach from=$optionTree item=categoryLevel1}
+                               {foreach from=$categoryLevel1[categories] item=categoryLevel2}
+                                       <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}-content">
+                                               <div class="container-1">
+                                                       <h3 class="subHeadline">{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</h3>
+                                                       <p class="description">{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}.description{/lang}</p>
+                                                       
+                                                       {if $categoryLevel2[options]|count}
+                                                               {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.acp.group.option.'}
+                                                       {/if}
+                                                       
+                                                       {if $categoryLevel2[categories]|count}
+                                                               {foreach from=$categoryLevel2[categories] item=categoryLevel3}
+                                                                       <fieldset>
+                                                                               <legend>{lang}wcf.acp.group.option.category.{@$categoryLevel3[object]->categoryName}{/lang}</legend>
+                                                                               <p class="description">{lang}wcf.acp.group.option.category.{@$categoryLevel3[object]->categoryName}.description{/lang}</p>
+                                                                       
+                                                                               <div>
+                                                                                       {include file='optionFieldList' options=$categoryLevel3[options] langPrefix='wcf.acp.group.option.'}
+                                                                               </div>
+                                                                       </fieldset>
+                                                               {/foreach}
+                                                       {/if}
+                                               </div>
+                                       </div>
+                               {/foreach}
+                       {/foreach}
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="action" value="{@$action}" />
+               {if $groupID|isset}<input type="hidden" name="groupID" value="{@$groupID}" />{/if}
+               
+               <input type="hidden" id="activeTabMenuItem" name="activeTabMenuItem" value="{$activeTabMenuItem}" />
+               <input type="hidden" id="activeSubTabMenuItem" name="activeSubTabMenuItem" value="{$activeSubTabMenuItem}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index f878807c891769ed5521da692b2557d109822993..4b5e0f6397d01e346c3da688ef47f18632493f8f 100644 (file)
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/RemoveObjectAction.class.js"></script>\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       var removeGroup = new RemoveObjectAction();\r
-       removeGroup.setOptions({\r
-               actionClass: 'UserGroup',\r
-               containerPrefix: 'groupContainer',\r
-               iconPrefix: 'groupDeleteIcon',\r
-               langDeleteSure: '{lang}wcf.acp.group.delete.sure{/lang}',\r
-               url: 'index.php?action=RemoveObject'\r
-       });\r
-       //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/userGroupL.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.group.list{/lang}</h2>\r
-       </div>\r
-</div>\r
-\r
-{if $deletedGroups}\r
-       <p class="success">{lang}wcf.acp.group.delete.success{/lang}</p>\r
-{/if}\r
-\r
-<div class="contentHeader">\r
-       {pages print=true assign=pagesLinks link="index.php?page=UserGroupList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}\r
-       <div class="largeButtons">\r
-               <ul>\r
-                       <li><a href="index.php?form=UserGroupAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.group.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupAddM.png" alt="" /> <span>{lang}wcf.acp.group.add{/lang}</span></a></li>\r
-                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}                       \r
-               </ul>\r
-       </div>\r
-</div>\r
-\r
-{if $groups|count}\r
-       <div class="border titleBarPanel">\r
-               <div class="containerHead"><h3>{lang}wcf.acp.group.list.data{/lang}</h3></div>\r
-       </div>\r
-       <div class="border borderMarginRemove">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th class="columnGroupID{if $sortField == 'groupID'} active{/if}" colspan="2"><div><a href="index.php?page=UserGroupList&amp;pageNo={@$pageNo}&amp;sortField=groupID&amp;sortOrder={if $sortField == 'groupID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.groupID{/lang}{if $sortField == 'groupID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th class="columnGroupName{if $sortField == 'groupName'} active{/if}"><div><a href="index.php?page=UserGroupList&amp;pageNo={@$pageNo}&amp;sortField=groupName&amp;sortOrder={if $sortField == 'groupName' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.groupName{/lang}{if $sortField == 'groupName'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th class="columnMembers{if $sortField == 'members'} active{/if}"><div><a href="index.php?page=UserGroupList&amp;pageNo={@$pageNo}&amp;sortField=members&amp;sortOrder={if $sortField == 'members' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.members{/lang}{if $sortField == 'members'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       \r
-                                       {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                               {foreach from=$groups item=group}\r
-                                       <tr class="{cycle values="container-1,container-2"}" id="groupContainer{@$group->groupID}">\r
-                                               <td class="columnIcon">\r
-                                                       {if $group->isEditable()}\r
-                                                               <a href="index.php?form=UserGroupEdit&amp;groupID={@$group->groupID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.group.edit{/lang}" /></a>\r
-                                                       {else}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/editDisabledS.png" alt="" title="{lang}wcf.acp.group.edit{/lang}" />\r
-                                                       {/if}\r
-                                                       {if $group->isDeletable()}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.group.delete{/lang}" id="groupDeleteIcon{@$group->groupID}" />\r
-                                                               <script type="text/javascript">\r
-                                                                       //<![CDATA[\r
-                                                                       removeGroup.registerObject({@$group->groupID}, {\r
-                                                                               objectID: {@$group->groupID}\r
-                                                                       });\r
-                                                                       //]]>\r
-                                                               </script>\r
-                                                       {else}\r
-                                                               <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.group.delete{/lang}" />\r
-                                                       {/if}\r
-                                                       \r
-                                                       {if $additionalButtons[$group->groupID]|isset}{@$additionalButtons[$group->groupID]}{/if}\r
-                                               </td>\r
-                                               <td class="columnGroupID columnID">{@$group->groupID}</td>\r
-                                               <td class="columnGroupName columnText">{if $group->isEditable()}<a title="{lang}wcf.acp.group.edit{/lang}" href="index.php?form=UserGroupEdit&amp;groupID={@$group->groupID}{@SID_ARG_2ND}">{$group->groupName}</a>{else}{$group->groupName}{/if}</td>\r
-                                               <td class="columnMembers columnNumbers"><a title="{lang}wcf.acp.group.showMembers{/lang}" href="index.php?form=UserSearch&amp;groupID={@$group->groupID}{@SID_ARG_2ND}">{#$group->members}</a></td>\r
-                                               \r
-                                               {if $additionalColumns[$group->groupID]|isset}{@$additionalColumns[$group->groupID]}{/if}\r
-                                       </tr>\r
-                               {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-{/if}\r
-\r
-<div class="contentFooter">\r
-       {@$pagesLinks}\r
-       <div class="largeButtons">\r
-               <ul>\r
-                       <li><a href="index.php?form=UserGroupAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.group.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupAddM.png" alt="" /> <span>{lang}wcf.acp.group.add{/lang}</span></a></li>\r
-                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-               </ul>\r
-       </div>\r
-</div>\r
-\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/RemoveObjectAction.class.js"></script>
+
+<script type="text/javascript">
+       //<![CDATA[
+       var removeGroup = new RemoveObjectAction();
+       removeGroup.setOptions({
+               actionClass: 'UserGroup',
+               containerPrefix: 'groupContainer',
+               iconPrefix: 'groupDeleteIcon',
+               langDeleteSure: '{lang}wcf.acp.group.delete.sure{/lang}',
+               url: 'index.php?action=RemoveObject'
+       });
+       //]]>
+</script>
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/userGroupL.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.group.list{/lang}</h2>
+       </div>
+</div>
+
+{if $deletedGroups}
+       <p class="success">{lang}wcf.acp.group.delete.success{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+       {pages print=true assign=pagesLinks link="index.php?page=UserGroupList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}
+       <div class="largeButtons">
+               <ul>
+                       <li><a href="index.php?form=UserGroupAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.group.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupAddM.png" alt="" /> <span>{lang}wcf.acp.group.add{/lang}</span></a></li>
+                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}                       
+               </ul>
+       </div>
+</div>
+
+{if $groups|count}
+       <div class="border titleBarPanel">
+               <div class="containerHead"><h3>{lang}wcf.acp.group.list.data{/lang}</h3></div>
+       </div>
+       <div class="border borderMarginRemove">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th class="columnGroupID{if $sortField == 'groupID'} active{/if}" colspan="2"><div><a href="index.php?page=UserGroupList&amp;pageNo={@$pageNo}&amp;sortField=groupID&amp;sortOrder={if $sortField == 'groupID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.groupID{/lang}{if $sortField == 'groupID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th class="columnGroupName{if $sortField == 'groupName'} active{/if}"><div><a href="index.php?page=UserGroupList&amp;pageNo={@$pageNo}&amp;sortField=groupName&amp;sortOrder={if $sortField == 'groupName' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.groupName{/lang}{if $sortField == 'groupName'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th class="columnMembers{if $sortField == 'members'} active{/if}"><div><a href="index.php?page=UserGroupList&amp;pageNo={@$pageNo}&amp;sortField=members&amp;sortOrder={if $sortField == 'members' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.members{/lang}{if $sortField == 'members'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       
+                                       {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}
+                               </tr>
+                       </thead>
+                       <tbody>
+                               {foreach from=$groups item=group}
+                                       <tr class="{cycle values="container-1,container-2"}" id="groupContainer{@$group->groupID}">
+                                               <td class="columnIcon">
+                                                       {if $group->isEditable()}
+                                                               <a href="index.php?form=UserGroupEdit&amp;groupID={@$group->groupID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.group.edit{/lang}" /></a>
+                                                       {else}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/editDisabledS.png" alt="" title="{lang}wcf.acp.group.edit{/lang}" />
+                                                       {/if}
+                                                       {if $group->isDeletable()}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.group.delete{/lang}" id="groupDeleteIcon{@$group->groupID}" />
+                                                               <script type="text/javascript">
+                                                                       //<![CDATA[
+                                                                       removeGroup.registerObject({@$group->groupID}, {
+                                                                               objectID: {@$group->groupID}
+                                                                       });
+                                                                       //]]>
+                                                               </script>
+                                                       {else}
+                                                               <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.group.delete{/lang}" />
+                                                       {/if}
+                                                       
+                                                       {if $additionalButtons[$group->groupID]|isset}{@$additionalButtons[$group->groupID]}{/if}
+                                               </td>
+                                               <td class="columnGroupID columnID">{@$group->groupID}</td>
+                                               <td class="columnGroupName columnText">{if $group->isEditable()}<a title="{lang}wcf.acp.group.edit{/lang}" href="index.php?form=UserGroupEdit&amp;groupID={@$group->groupID}{@SID_ARG_2ND}">{$group->groupName}</a>{else}{$group->groupName}{/if}</td>
+                                               <td class="columnMembers columnNumbers"><a title="{lang}wcf.acp.group.showMembers{/lang}" href="index.php?form=UserSearch&amp;groupID={@$group->groupID}{@SID_ARG_2ND}">{#$group->members}</a></td>
+                                               
+                                               {if $additionalColumns[$group->groupID]|isset}{@$additionalColumns[$group->groupID]}{/if}
+                                       </tr>
+                               {/foreach}
+                       </tbody>
+               </table>
+       </div>
+{/if}
+
+<div class="contentFooter">
+       {@$pagesLinks}
+       <div class="largeButtons">
+               <ul>
+                       <li><a href="index.php?form=UserGroupAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.group.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupAddM.png" alt="" /> <span>{lang}wcf.acp.group.add{/lang}</span></a></li>
+                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+               </ul>
+       </div>
+</div>
+
 {include file='footer'}
\ No newline at end of file
index 1f5d95b9026671076643665398ae45cb501a95da..3f33547d05bc187d4a152895866e0372b91810ee 100644 (file)
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/InlineListEdit.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/UserListEdit.class.js"></script>\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       // data array\r
-       var userData = new Hash();\r
-       var url = '{@$url|encodeJS}';\r
-       \r
-       // language\r
-       var language = new Object();\r
-       language['wcf.global.button.mark']              = '{lang}wcf.global.button.mark{/lang}';\r
-       language['wcf.global.button.unmark']            = '{lang}wcf.global.button.unmark{/lang}';\r
-       language['wcf.global.button.delete']            = '{lang}wcf.global.button.delete{/lang}';\r
-       language['wcf.acp.user.button.sendMail']        = '{lang}wcf.acp.user.button.sendMail{/lang}';\r
-       language['wcf.acp.user.button.exportMail']      = '{lang}wcf.acp.user.button.exportMail{/lang}';\r
-       language['wcf.acp.user.button.assignGroup']     = '{lang}wcf.acp.user.button.assignGroup{/lang}';\r
-       language['wcf.acp.user.deleteMarked.sure']      = '{lang}wcf.acp.user.deleteMarked.sure{/lang}';\r
-       language['wcf.acp.user.delete.sure']            = '{lang}wcf.acp.user.delete.sure{/lang}';\r
-       language['wcf.acp.user.markedUsers']            = '{lang}wcf.acp.user.markedUsers{/lang}';\r
-       \r
-       // additional options\r
-       var additionalOptions = new Array();\r
-       var additionalUserOptions = new Array();\r
-       {if $additionalMarkedOptions|isset}{@$additionalMarkedOptions}{/if}\r
-       \r
-       // permissions\r
-       var permissions = new Object();\r
-       permissions['canEditUser'] = {if $__wcf->session->getPermission('admin.user.canEditUser')}1{else}0{/if};\r
-       permissions['canDeleteUser'] = {if $__wcf->session->getPermission('admin.user.canDeleteUser')}1{else}0{/if};\r
-       permissions['canMailUser'] = {if $__wcf->session->getPermission('admin.user.canMailUser')}1{else}0{/if};\r
-       permissions['canEditMailAddress'] = {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}1{else}0{/if};\r
-       permissions['canEditPassword'] = {if $__wcf->session->getPermission('admin.user.canEditPassword')}1{else}0{/if};\r
-       \r
-       onloadEvents.push(function() { userListEdit = new UserListEdit(userData, {@$markedUsers}, additionalUserOptions, additionalOptions); });\r
-       //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/{if $searchID}userSearch{else}users{/if}L.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.user.{if $searchID}search{else}list{/if}{/lang}</h1>\r
-               <h2>{if $searchID}{lang}wcf.acp.user.search.matches{/lang}{else}{lang}wcf.acp.user.list.count{/lang}{/if}</h2>\r
-       </hgroup>\r
-</header>\r
-\r
-{assign var=encodedURL value=$url|rawurlencode}\r
-{assign var=encodedAction value=$action|rawurlencode}\r
-<div class="contentHeader">\r
-       {pages print=true assign=pagesLinks link="index.php?page=UserList&pageNo=%d&searchID=$searchID&action=$encodedAction&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}\r
-       \r
-       <nav class="largeButtons">\r
-               <ul>\r
-                       {if $__wcf->session->getPermission('admin.user.canAddUser')}\r
-                               <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>\r
-                       {/if}\r
-                       <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>\r
-                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-               </ul>\r
-       </nav>\r
-</div>\r
-\r
-<div class="subTabMenu">\r
-       <div class="containerHead">\r
-               <ul>\r
-                       <li{if $action == ''} class="activeSubTabMenu"{/if}><a href="index.php?page=UserList{@SID_ARG_2ND}"><span>{lang}wcf.acp.user.list.all{/lang}</span></a></li>\r
-                       {if $additionalUserListOptions|isset}{@$additionalUserListOptions}{/if}\r
-               </ul>\r
-       </div>\r
-</div>\r
-{if $users|count}\r
-       <div class="border">\r
-               <table class="tableList">\r
-                       <thead>\r
-                               <tr class="tableHead">\r
-                                       <th class="columnMark"><div><label class="emptyHead"><input name="userMarkAll" type="checkbox" /></label></div></th>\r
-                                       <th class="columnUserID{if $sortField == 'userID'} active{/if}" colspan="2"><div><a href="index.php?page=UserList&amp;searchID={@$searchID}&amp;action={@$encodedAction}&amp;pageNo={@$pageNo}&amp;sortField=userID&amp;sortOrder={if $sortField == 'userID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.user.userID{/lang}{if $sortField == 'userID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       <th class="columnUsername{if $sortField == 'username'} active{/if}"><div><a href="index.php?page=UserList&amp;searchID={@$searchID}&amp;action={@$encodedAction}&amp;pageNo={@$pageNo}&amp;sortField=username&amp;sortOrder={if $sortField == 'username' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.user.username{/lang}{if $sortField == 'username'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       \r
-                                       {foreach from=$columnHeads key=column item=columnLanguageVariable}\r
-                                               <th class="column{$column|ucfirst}{if $sortField == $column} active{/if}"><div><a href="index.php?page=UserList&amp;searchID={@$searchID}&amp;action={@$encodedAction}&amp;pageNo={@$pageNo}&amp;sortField={$column}&amp;sortOrder={if $sortField == $column && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}{$columnLanguageVariable}{/lang}{if $sortField == $column} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
-                                       {/foreach}\r
-                                       \r
-                                       {if $additionalColumnHeads|isset}{@$additionalColumnHeads}{/if}\r
-                               </tr>\r
-                       </thead>\r
-                       <tbody>\r
-                       {foreach from=$users item=user}\r
-                               <tr class="{cycle values="container-1,container-2" advance=false}" id="userRow{@$user->userID}">\r
-                                       <td class="columnMark"><input name="userMark" id="userMark{@$user->userID}" type="checkbox" value="{@$user->userID}" /></td>\r
-                                       <td class="columnIcon">\r
-                                               <script type="text/javascript">\r
-                                                       //<![CDATA[\r
-                                                       userData.set({@$user->userID}, {\r
-                                                               'isMarked': {@$user->isMarked},\r
-                                                               'className': '{cycle values="container-1,container-2"}'\r
-                                                       });\r
-                                                       //]]>\r
-                                               </script>\r
-                                               \r
-                                               {if $user->editable}\r
-                                                       <a href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.user.edit{/lang}" /></a>\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/editDisabledS.png" alt="" title="{lang}wcf.acp.user.edit{/lang}" />\r
-                                               {/if}\r
-                                               {if $user->deletable}\r
-                                                       <a onclick="return confirm('{lang}wcf.acp.user.delete.sure{/lang}')" href="index.php?action=UserDelete&amp;userID={@$user->userID}&amp;url={@$encodedURL}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.user.delete{/lang}" /></a>\r
-                                               {else}\r
-                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.user.delete{/lang}" />\r
-                                               {/if}\r
-                                               \r
-                                               {if $additionalButtons[$user->userID]|isset}{@$additionalButtons[$user->userID]}{/if}\r
-                                       </td>\r
-                                       <td class="columnUserID columnID">{@$user->userID}</td>\r
-                                       <td class="columnUsername columnText">{if $user->editable}<a title="{lang}wcf.acp.user.edit{/lang}" href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}">{$user->username}</a>{else}{$user->username}{/if}</td>\r
-                                       \r
-                                       {foreach from=$columnHeads key=column item=columnLanguageVariable}\r
-                                               <td class="column{$column|ucfirst}">{if $columnValues[$user->userID][$column]|isset}{@$columnValues[$user->userID][$column]}{/if}</td>\r
-                                       {/foreach}\r
-                                       \r
-                                       {if $additionalColumns[$user->userID]|isset}{@$additionalColumns[$user->userID]}{/if}\r
-                               </tr>\r
-                       {/foreach}\r
-                       </tbody>\r
-               </table>\r
-       </div>\r
-       \r
-       <div class="contentFooter">\r
-               {@$pagesLinks} <div id="userEditMarked" class="optionButtons"></div>\r
-               \r
-               <nav class="largeButtons">\r
-                       <ul>\r
-                               {if $__wcf->session->getPermission('admin.user.canAddUser')}\r
-                                       <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>\r
-                               {/if}\r
-                               <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>\r
-                               {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-                       </ul>\r
-               </nav>\r
-       </div>\r
-{else}\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <p class="info">{lang}wcf.acp.user.search.error.noMatches{/lang}</p>\r
-               </div>\r
-       </div>\r
-{/if}\r
-\r
-{include file='footer'}\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/InlineListEdit.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/UserListEdit.class.js"></script>
+<script type="text/javascript">
+       //<![CDATA[
+       // data array
+       var userData = new Hash();
+       var url = '{@$url|encodeJS}';
+       
+       // language
+       var language = new Object();
+       language['wcf.global.button.mark']              = '{lang}wcf.global.button.mark{/lang}';
+       language['wcf.global.button.unmark']            = '{lang}wcf.global.button.unmark{/lang}';
+       language['wcf.global.button.delete']            = '{lang}wcf.global.button.delete{/lang}';
+       language['wcf.acp.user.button.sendMail']        = '{lang}wcf.acp.user.button.sendMail{/lang}';
+       language['wcf.acp.user.button.exportMail']      = '{lang}wcf.acp.user.button.exportMail{/lang}';
+       language['wcf.acp.user.button.assignGroup']     = '{lang}wcf.acp.user.button.assignGroup{/lang}';
+       language['wcf.acp.user.deleteMarked.sure']      = '{lang}wcf.acp.user.deleteMarked.sure{/lang}';
+       language['wcf.acp.user.delete.sure']            = '{lang}wcf.acp.user.delete.sure{/lang}';
+       language['wcf.acp.user.markedUsers']            = '{lang}wcf.acp.user.markedUsers{/lang}';
+       
+       // additional options
+       var additionalOptions = new Array();
+       var additionalUserOptions = new Array();
+       {if $additionalMarkedOptions|isset}{@$additionalMarkedOptions}{/if}
+       
+       // permissions
+       var permissions = new Object();
+       permissions['canEditUser'] = {if $__wcf->session->getPermission('admin.user.canEditUser')}1{else}0{/if};
+       permissions['canDeleteUser'] = {if $__wcf->session->getPermission('admin.user.canDeleteUser')}1{else}0{/if};
+       permissions['canMailUser'] = {if $__wcf->session->getPermission('admin.user.canMailUser')}1{else}0{/if};
+       permissions['canEditMailAddress'] = {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}1{else}0{/if};
+       permissions['canEditPassword'] = {if $__wcf->session->getPermission('admin.user.canEditPassword')}1{else}0{/if};
+       
+       onloadEvents.push(function() { userListEdit = new UserListEdit(userData, {@$markedUsers}, additionalUserOptions, additionalOptions); });
+       //]]>
+</script>
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/{if $searchID}userSearch{else}users{/if}L.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.user.{if $searchID}search{else}list{/if}{/lang}</h1>
+               <h2>{if $searchID}{lang}wcf.acp.user.search.matches{/lang}{else}{lang}wcf.acp.user.list.count{/lang}{/if}</h2>
+       </hgroup>
+</header>
+
+{assign var=encodedURL value=$url|rawurlencode}
+{assign var=encodedAction value=$action|rawurlencode}
+<div class="contentHeader">
+       {pages print=true assign=pagesLinks link="index.php?page=UserList&pageNo=%d&searchID=$searchID&action=$encodedAction&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}
+       
+       <nav class="largeButtons">
+               <ul>
+                       {if $__wcf->session->getPermission('admin.user.canAddUser')}
+                               <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>
+                       {/if}
+                       <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>
+                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+               </ul>
+       </nav>
+</div>
+
+<div class="subTabMenu">
+       <div class="containerHead">
+               <ul>
+                       <li{if $action == ''} class="activeSubTabMenu"{/if}><a href="index.php?page=UserList{@SID_ARG_2ND}"><span>{lang}wcf.acp.user.list.all{/lang}</span></a></li>
+                       {if $additionalUserListOptions|isset}{@$additionalUserListOptions}{/if}
+               </ul>
+       </div>
+</div>
+{if $users|count}
+       <div class="border">
+               <table class="tableList">
+                       <thead>
+                               <tr class="tableHead">
+                                       <th class="columnMark"><div><label class="emptyHead"><input name="userMarkAll" type="checkbox" /></label></div></th>
+                                       <th class="columnUserID{if $sortField == 'userID'} active{/if}" colspan="2"><div><a href="index.php?page=UserList&amp;searchID={@$searchID}&amp;action={@$encodedAction}&amp;pageNo={@$pageNo}&amp;sortField=userID&amp;sortOrder={if $sortField == 'userID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.user.userID{/lang}{if $sortField == 'userID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       <th class="columnUsername{if $sortField == 'username'} active{/if}"><div><a href="index.php?page=UserList&amp;searchID={@$searchID}&amp;action={@$encodedAction}&amp;pageNo={@$pageNo}&amp;sortField=username&amp;sortOrder={if $sortField == 'username' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.user.username{/lang}{if $sortField == 'username'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       
+                                       {foreach from=$columnHeads key=column item=columnLanguageVariable}
+                                               <th class="column{$column|ucfirst}{if $sortField == $column} active{/if}"><div><a href="index.php?page=UserList&amp;searchID={@$searchID}&amp;action={@$encodedAction}&amp;pageNo={@$pageNo}&amp;sortField={$column}&amp;sortOrder={if $sortField == $column && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}{$columnLanguageVariable}{/lang}{if $sortField == $column} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+                                       {/foreach}
+                                       
+                                       {if $additionalColumnHeads|isset}{@$additionalColumnHeads}{/if}
+                               </tr>
+                       </thead>
+                       <tbody>
+                       {foreach from=$users item=user}
+                               <tr class="{cycle values="container-1,container-2" advance=false}" id="userRow{@$user->userID}">
+                                       <td class="columnMark"><input name="userMark" id="userMark{@$user->userID}" type="checkbox" value="{@$user->userID}" /></td>
+                                       <td class="columnIcon">
+                                               <script type="text/javascript">
+                                                       //<![CDATA[
+                                                       userData.set({@$user->userID}, {
+                                                               'isMarked': {@$user->isMarked},
+                                                               'className': '{cycle values="container-1,container-2"}'
+                                                       });
+                                                       //]]>
+                                               </script>
+                                               
+                                               {if $user->editable}
+                                                       <a href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.user.edit{/lang}" /></a>
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/editDisabledS.png" alt="" title="{lang}wcf.acp.user.edit{/lang}" />
+                                               {/if}
+                                               {if $user->deletable}
+                                                       <a onclick="return confirm('{lang}wcf.acp.user.delete.sure{/lang}')" href="index.php?action=UserDelete&amp;userID={@$user->userID}&amp;url={@$encodedURL}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.user.delete{/lang}" /></a>
+                                               {else}
+                                                       <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.user.delete{/lang}" />
+                                               {/if}
+                                               
+                                               {if $additionalButtons[$user->userID]|isset}{@$additionalButtons[$user->userID]}{/if}
+                                       </td>
+                                       <td class="columnUserID columnID">{@$user->userID}</td>
+                                       <td class="columnUsername columnText">{if $user->editable}<a title="{lang}wcf.acp.user.edit{/lang}" href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}">{$user->username}</a>{else}{$user->username}{/if}</td>
+                                       
+                                       {foreach from=$columnHeads key=column item=columnLanguageVariable}
+                                               <td class="column{$column|ucfirst}">{if $columnValues[$user->userID][$column]|isset}{@$columnValues[$user->userID][$column]}{/if}</td>
+                                       {/foreach}
+                                       
+                                       {if $additionalColumns[$user->userID]|isset}{@$additionalColumns[$user->userID]}{/if}
+                               </tr>
+                       {/foreach}
+                       </tbody>
+               </table>
+       </div>
+       
+       <div class="contentFooter">
+               {@$pagesLinks} <div id="userEditMarked" class="optionButtons"></div>
+               
+               <nav class="largeButtons">
+                       <ul>
+                               {if $__wcf->session->getPermission('admin.user.canAddUser')}
+                                       <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>
+                               {/if}
+                               <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>
+                               {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+                       </ul>
+               </nav>
+       </div>
+{else}
+       <div class="border content">
+               <div class="container-1">
+                       <p class="info">{lang}wcf.acp.user.search.error.noMatches{/lang}</p>
+               </div>
+       </div>
+{/if}
+
+{include file='footer'}
index ebbd9e317a54f8342a049406f36dc6fee6278cc2..207a74f0d4b3320acf32f2c5b6b8be45b0e465d4 100644 (file)
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/emailL.png" alt="" />\r
-       <hgroup>\r
-               <h1>\r
-                       {if $action == 'all'}\r
-                               {lang}wcf.acp.user.sendMail.all{/lang}\r
-                       {elseif $action == 'group'}\r
-                               {lang}wcf.acp.user.sendMail.group{/lang}\r
-                       {else}\r
-                               {lang}wcf.acp.user.sendMail{/lang}\r
-                       {/if}\r
-               </h1>\r
-       </hgroup>\r
-</header>\r
-\r
-{if $errorField}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<div class="contentHeader">\r
-       <nav class="largeButtons">\r
-               <ul>\r
-                       <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>\r
-                       <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>\r
-                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
-               </ul>\r
-       </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=UserMail">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       {if $action == ''}\r
-                               <fieldset>\r
-                                       <legend>{lang}wcf.acp.user.sendMail.markedUsers{/lang}</legend>\r
-                                       \r
-                                       <div>\r
-                                               {implode from=$users item=$user}<a href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}\r
-                                       </div>\r
-                               </fieldset>     \r
-                       {/if}\r
-                       {if $action == 'group'}\r
-                               <fieldset>\r
-                                       <legend>{lang}wcf.acp.user.sendMail.groups{/lang}</legend>\r
-                                       \r
-                                       <div class="formGroup{if $errorField == 'groupIDs'} formError{/if}">\r
-                                               <div class="formGroupLabel">\r
-                                                       <label>{lang}wcf.acp.user.groups{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formGroupField">\r
-                                                       <fieldset>\r
-                                                               <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
-                                                               \r
-                                                               <div class="formField">\r
-                                                                       {htmlCheckboxes options=$groups name=groupIDs selected=$groupIDs}\r
-                                                               </div>\r
-                                                       </fieldset>\r
-                                                       {if $errorField == 'groupIDs'}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                       </div>\r
-                               </fieldset>     \r
-                       {/if}\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.user.sendMail.mail{/lang}</legend>\r
-                               \r
-                               <div>\r
-                                       <div class="formElement{if $errorField == 'subject'} formError{/if}" id="subjectDiv">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="subject">{lang}wcf.acp.user.sendMail.subject{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField">\r
-                                                       <input type="text" class="inputText" id="subject" name="subject" value="{$subject}" />\r
-                                                       {if $errorField == 'subject'}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                               <div class="formFieldDesc hidden" id="subjectHelpMessage">\r
-                                                       <p>{lang}wcf.acp.user.sendMail.subject.description{/lang}</p>\r
-                                               </div>\r
-                                       </div>\r
-                                       <script type="text/javascript">//<![CDATA[\r
-                                               inlineHelp.register('subject');\r
-                                       //]]></script>\r
-                                       \r
-                                       <div class="formElement{if $errorField == 'from'} formError{/if}" id="fromDiv">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="from">{lang}wcf.acp.user.sendMail.from{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField">\r
-                                                       <input type="text" class="inputText" id="from" name="from" value="{$from}" />\r
-                                                       {if $errorField == 'from'}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                               <div class="formFieldDesc hidden" id="fromHelpMessage">\r
-                                                       <p>{lang}wcf.acp.user.sendMail.from.description{/lang}</p>\r
-                                               </div>\r
-                                       </div>\r
-                                       <script type="text/javascript">//<![CDATA[\r
-                                               inlineHelp.register('from');\r
-                                       //]]></script>\r
-                               \r
-                                       <div class="formElement{if $errorField == 'text'} formError{/if}" id="textDiv">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="text">{lang}wcf.acp.user.sendMail.text{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField">\r
-                                                       <textarea id="text" name="text" rows="15" cols="40">{$text}</textarea>\r
-                                                       {if $errorField == 'text'}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                               <div class="formFieldDesc hidden" id="textHelpMessage">\r
-                                                       <p>{lang}wcf.acp.user.sendMail.text.description{/lang}</p>\r
-                                               </div>\r
-                                       </div>\r
-                                       <script type="text/javascript">//<![CDATA[\r
-                                               inlineHelp.register('text');\r
-                                       //]]></script>\r
-                                       \r
-                                       <div class="formElement">\r
-                                               <div class="formField">\r
-                                                       <label><input type="checkbox" name="enableHTML" id="enableHTML" value="1" {if $enableHTML == 1}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail.enableHTML{/lang}</label>\r
-                                               </div>\r
-                                       </div>\r
-                               </div>\r
-                               \r
-                               {if $additionalFields|isset}{@$additionalFields}{/if}\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="hidden" name="action" value="{@$action}" />\r
-               {@SID_INPUT_TAG}\r
-               <input type="hidden" name="userIDs" value="{@$userIDs}" />\r
-       </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/emailL.png" alt="" />
+       <hgroup>
+               <h1>
+                       {if $action == 'all'}
+                               {lang}wcf.acp.user.sendMail.all{/lang}
+                       {elseif $action == 'group'}
+                               {lang}wcf.acp.user.sendMail.group{/lang}
+                       {else}
+                               {lang}wcf.acp.user.sendMail{/lang}
+                       {/if}
+               </h1>
+       </hgroup>
+</header>
+
+{if $errorField}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+       <nav class="largeButtons">
+               <ul>
+                       <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>
+                       <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>
+                       {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+               </ul>
+       </nav>
+</div>
+
+<form method="post" action="index.php?form=UserMail">
+       <div class="border content">
+               <div class="container-1">
+                       {if $action == ''}
+                               <fieldset>
+                                       <legend>{lang}wcf.acp.user.sendMail.markedUsers{/lang}</legend>
+                                       
+                                       <div>
+                                               {implode from=$users item=$user}<a href="index.php?form=UserEdit&amp;userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}
+                                       </div>
+                               </fieldset>     
+                       {/if}
+                       {if $action == 'group'}
+                               <fieldset>
+                                       <legend>{lang}wcf.acp.user.sendMail.groups{/lang}</legend>
+                                       
+                                       <div class="formGroup{if $errorField == 'groupIDs'} formError{/if}">
+                                               <div class="formGroupLabel">
+                                                       <label>{lang}wcf.acp.user.groups{/lang}</label>
+                                               </div>
+                                               <div class="formGroupField">
+                                                       <fieldset>
+                                                               <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+                                                               
+                                                               <div class="formField">
+                                                                       {htmlCheckboxes options=$groups name=groupIDs selected=$groupIDs}
+                                                               </div>
+                                                       </fieldset>
+                                                       {if $errorField == 'groupIDs'}
+                                                               <p class="innerError">
+                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                       </div>
+                               </fieldset>     
+                       {/if}
+                       <fieldset>
+                               <legend>{lang}wcf.acp.user.sendMail.mail{/lang}</legend>
+                               
+                               <div>
+                                       <div class="formElement{if $errorField == 'subject'} formError{/if}" id="subjectDiv">
+                                               <div class="formFieldLabel">
+                                                       <label for="subject">{lang}wcf.acp.user.sendMail.subject{/lang}</label>
+                                               </div>
+                                               <div class="formField">
+                                                       <input type="text" class="inputText" id="subject" name="subject" value="{$subject}" />
+                                                       {if $errorField == 'subject'}
+                                                               <p class="innerError">
+                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                               <div class="formFieldDesc hidden" id="subjectHelpMessage">
+                                                       <p>{lang}wcf.acp.user.sendMail.subject.description{/lang}</p>
+                                               </div>
+                                       </div>
+                                       <script type="text/javascript">//<![CDATA[
+                                               inlineHelp.register('subject');
+                                       //]]></script>
+                                       
+                                       <div class="formElement{if $errorField == 'from'} formError{/if}" id="fromDiv">
+                                               <div class="formFieldLabel">
+                                                       <label for="from">{lang}wcf.acp.user.sendMail.from{/lang}</label>
+                                               </div>
+                                               <div class="formField">
+                                                       <input type="text" class="inputText" id="from" name="from" value="{$from}" />
+                                                       {if $errorField == 'from'}
+                                                               <p class="innerError">
+                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                               <div class="formFieldDesc hidden" id="fromHelpMessage">
+                                                       <p>{lang}wcf.acp.user.sendMail.from.description{/lang}</p>
+                                               </div>
+                                       </div>
+                                       <script type="text/javascript">//<![CDATA[
+                                               inlineHelp.register('from');
+                                       //]]></script>
+                               
+                                       <div class="formElement{if $errorField == 'text'} formError{/if}" id="textDiv">
+                                               <div class="formFieldLabel">
+                                                       <label for="text">{lang}wcf.acp.user.sendMail.text{/lang}</label>
+                                               </div>
+                                               <div class="formField">
+                                                       <textarea id="text" name="text" rows="15" cols="40">{$text}</textarea>
+                                                       {if $errorField == 'text'}
+                                                               <p class="innerError">
+                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                               <div class="formFieldDesc hidden" id="textHelpMessage">
+                                                       <p>{lang}wcf.acp.user.sendMail.text.description{/lang}</p>
+                                               </div>
+                                       </div>
+                                       <script type="text/javascript">//<![CDATA[
+                                               inlineHelp.register('text');
+                                       //]]></script>
+                                       
+                                       <div class="formElement">
+                                               <div class="formField">
+                                                       <label><input type="checkbox" name="enableHTML" id="enableHTML" value="1" {if $enableHTML == 1}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail.enableHTML{/lang}</label>
+                                               </div>
+                                       </div>
+                               </div>
+                               
+                               {if $additionalFields|isset}{@$additionalFields}{/if}
+                       </fieldset>
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="hidden" name="action" value="{@$action}" />
+               {@SID_INPUT_TAG}
+               <input type="hidden" name="userIDs" value="{@$userIDs}" />
+       </div>
+</form>
+
+{include file='footer'}
index f50c11a063935995f9c4f57dc359f4fb450780d6..2f6d30708d26583ae17f4d9e4240d3e745c6e84a 100644 (file)
-{include file='header'}\r
-\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/Suggestion.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       var tabMenu = new TabMenu();\r
-       onloadEvents.push(function() {\r
-               //tabMenu.showSubTabMenu('profile');\r
-               tabMenu.showSubTabMenu('resultOptions');\r
-               $('username').focus();\r
-       });\r
-       //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/userSearchL.png" alt="" />\r
-       <hgroup>\r
-               <h1>{lang}wcf.acp.user.search{/lang}</h1>\r
-       </hgroup>\r
-</header>\r
-\r
-{if $errorField == 'search'}\r
-<p class="error">{lang}wcf.acp.user.search.error.noMatches{/lang}</p>\r
-{/if}\r
-\r
-{*if $deletedUsers}\r
-       <p class="success">{lang}wcf.acp.user.delete.success{/lang}</p> \r
-{elseif $deletedUsers === 0}\r
-       <p class="error">{lang}wcf.acp.user.delete.error{/lang}</p>     \r
-{/if*}\r
-\r
-<div class="contentHeader">\r
-       <nav class="largeButtons">\r
-               <ul>\r
-                       {if $__wcf->session->getPermission('admin.user.canAddUser')}\r
-                               <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>\r
-                       {/if}\r
-                       <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a>\r
-                       </li>\r
-               </ul>\r
-       </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=UserSearch">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.user.search.conditions.general{/lang}</legend>\r
-                               <div class="formElement">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="username">{lang}wcf.user.username{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="username" name="username" value="{$username}" />\r
-                                               <script type="text/javascript">\r
-                                                       //<![CDATA[\r
-                                                       var suggestion = new Suggestion('username');\r
-                                                       suggestion.enableMultiple(false);\r
-                                                       //]]>\r
-                                               </script>\r
-                                       </div>\r
-                               </div>\r
-                               \r
-                               <div class="formElement">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="userID">{lang}wcf.user.userID{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField"> \r
-                                               <input type="text" class="inputText" id="userID" name="userID" value="{$userID}" />\r
-                                       </div>\r
-                               </div>\r
-                               \r
-                               {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}\r
-                                       <div class="formElement">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="email">{lang}wcf.user.email{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField"> \r
-                                                       <input type="text" class="inputText" id="email" name="email" value="{$email}" />\r
-                                               </div>\r
-                                       </div>\r
-                               {/if}\r
-                               \r
-                               {if $availableGroups|count}\r
-                                       <div class="formGroup">\r
-                                               <div class="formGroupLabel">\r
-                                                       <label>{lang}wcf.acp.user.groups{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formGroupField">\r
-                                                       <fieldset>\r
-                                                               <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
-                                                               \r
-                                                               <div class="formField">\r
-                                                                       {htmlCheckboxes options=$availableGroups name='groupIDs' selected=$groupIDs}\r
-                                                                       \r
-                                                                       <label style="margin-top: 10px"><input type="checkbox" name="invertGroupIDs" value="1" {if $invertGroupIDs == 1}checked="checked" {/if}/> {lang}wcf.acp.user.groups.invertSearch{/lang}</label>\r
-                                                               </div>\r
-                                                       </fieldset>\r
-                                               </div>\r
-                                       </div>\r
-                               {/if}\r
-                               \r
-                               {if $availableLanguages|count > 1}\r
-                                       <div class="formGroup">\r
-                                               <div class="formGroupLabel">\r
-                                                       <label>{lang}wcf.user.language{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formGroupField">\r
-                                                       <fieldset>\r
-                                                               <legend>{lang}wcf.acp.user.language{/lang}</legend>\r
-                                                               \r
-                                                               <div class="formField">\r
-                                                                       {htmlCheckboxes options=$availableLanguages name='languageIDs' selected=$languageIDs disableEncoding=true}\r
-                                                               </div>\r
-                                                       </fieldset>\r
-                                               </div>\r
-                                       </div>\r
-                               {/if}\r
-                       </fieldset>\r
-                       \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-                       \r
-                       <nav>\r
-                               <div class="tabMenu">\r
-                                       <ul>\r
-                                               {if $optionTree|count}<li id="profile"><a onclick="tabMenu.showSubTabMenu('profile');"><span>{lang}wcf.acp.user.search.conditions.profile{/lang}</span></a></li>{/if}\r
-                                               {if $additionalTabs|isset}{@$additionalTabs}{/if}\r
-                                               <li id="resultOptions"><a onclick="tabMenu.showSubTabMenu('resultOptions');"><span>{lang}wcf.acp.user.search.display{/lang}</span></a></li>\r
-                                       </ul>\r
-                               </div>\r
-                       </nav>\r
-                       <div class="subTabMenu">\r
-                               <div class="containerHead"><div> </div></div>\r
-                       </div>\r
-                       \r
-                       {if $optionTree|count}\r
-                               <div class="border tabMenuContent hidden" id="profile-content">\r
-                                       <div class="container-1">\r
-                                               <h3 class="subHeading">{lang}wcf.acp.user.search.conditions.profile{/lang}</h3>\r
-                                               {include file='optionFieldList' langPrefix='wcf.user.option.' options=$optionTree}\r
-                                       </div>\r
-                               </div>\r
-                       {/if}\r
-                       \r
-                       {if $additionalTabContents|isset}{@$additionalTabContents}{/if}\r
-                       \r
-                       <div class="border tabMenuContent hidden" id="resultOptions-content">\r
-                               <div class="container-1">\r
-                                       <h3 class="subHeading">{lang}wcf.acp.user.search.display{/lang}</h3>\r
-                                       \r
-                                       <fieldset>\r
-                                               <legend>{lang}wcf.acp.user.search.display.general{/lang}</legend>\r
-                                               \r
-                                               <div class="formElement">\r
-                                                       <div class="formFieldLabel">\r
-                                                               <label for="sortField">{lang}wcf.acp.user.search.display.sort{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formField">\r
-                                                               <select name="sortField" id="sortField">\r
-                                                                       <option value="userID"{if $sortField == 'userID'} selected="selected"{/if}>{lang}wcf.user.userID{/lang}</option>\r
-                                                                       <option value="username"{if $sortField == 'username'} selected="selected"{/if}>{lang}wcf.user.username{/lang}</option>\r
-                                                                       <option value="email"{if $sortField == 'email'} selected="selected"{/if}>{lang}wcf.user.email{/lang}</option>\r
-                                                                       <option value="registrationDate"{if $sortField == 'registrationDate'} selected="selected"{/if}>{lang}wcf.user.registrationDate{/lang}</option>\r
-                                                                       \r
-                                                                       {if $additionalSortFields|isset}{@$additionalSortFields}{/if}\r
-                                                               </select>\r
-                                                               <select name="sortOrder" id="sortOrder">\r
-                                                                       <option value="ASC"{if $sortOrder == 'ASC'} selected="selected"{/if}>{lang}wcf.global.sortOrder.ascending{/lang}</option>\r
-                                                                       <option value="DESC"{if $sortOrder == 'DESC'} selected="selected"{/if}>{lang}wcf.global.sortOrder.descending{/lang}</option>\r
-                                                               </select>\r
-                                                       </div>\r
-                                               </div>\r
-                                               \r
-                                               <div class="formElement">\r
-                                                       <div class="formFieldLabel">\r
-                                                               <label for="itemsPerPage">{lang}wcf.acp.user.search.display.itemsPerPage{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formField">\r
-                                                               <input type="text" class="inputText" id="itemsPerPage" name="itemsPerPage" value="{@$itemsPerPage}" />\r
-                                                       </div>\r
-                                               </div>\r
-                                       </fieldset>\r
-                                       \r
-                                       <fieldset>\r
-                                               <legend>{lang}wcf.acp.user.search.display.columns{/lang}</legend>\r
-                                               \r
-                                               {if $optionTree|count}\r
-                                                       <div class="formGroup">\r
-                                                               <div class="formGroupLabel">\r
-                                                                       <label>{lang}wcf.acp.user.search.display.columns.profile{/lang}</label>\r
-                                                               </div>\r
-                                                               <div class="formGroupField">\r
-                                                                       <fieldset>\r
-                                                                               <legend>{lang}wcf.acp.user.search.display.columns.profile{/lang}</legend>\r
-                                                                               \r
-                                                                               <div class="formField">\r
-                                                                                       {foreach from=$optionTree item=option}\r
-                                                                                               <label><input type="checkbox" name="columns[]" value="{$option->optionName}" {if $option->optionName|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.option.{$option->optionName}{/lang}</label>\r
-                                                                                       {/foreach}\r
-                                                                               </div>\r
-                                                                       </fieldset>\r
-                                                               </div>\r
-                                                       </div>\r
-                                               {/if}\r
-                                               \r
-                                               <div class="formGroup">\r
-                                                       <div class="formGroupLabel">\r
-                                                               <label>{lang}wcf.acp.user.search.display.columns.other{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formGroupField">\r
-                                                               <fieldset>\r
-                                                                       <legend>{lang}wcf.acp.user.search.display.columns.other{/lang}</legend>\r
-                                                                       \r
-                                                                       <div class="formField">\r
-                                                                               <label><input type="checkbox" name="columns[]" value="email" {if "email"|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.email{/lang}</label>\r
-                                                                               <label><input type="checkbox" name="columns[]" value="registrationDate" {if "registrationDate"|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.registrationDate{/lang}</label>\r
-                                                                               \r
-                                                                               {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
-                                                                       </div>\r
-                                                               </fieldset>\r
-                                                       </div>\r
-                                               </div>\r
-                                               \r
-                                               \r
-                                       </fieldset>\r
-                               </div>\r
-                       </div>\r
-                       \r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-       </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/Suggestion.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>
+<script type="text/javascript">
+       //<![CDATA[
+       var tabMenu = new TabMenu();
+       onloadEvents.push(function() {
+               //tabMenu.showSubTabMenu('profile');
+               tabMenu.showSubTabMenu('resultOptions');
+               $('username').focus();
+       });
+       //]]>
+</script>
+
+<header class="mainHeading">
+       <img src="{@RELATIVE_WCF_DIR}icon/userSearchL.png" alt="" />
+       <hgroup>
+               <h1>{lang}wcf.acp.user.search{/lang}</h1>
+       </hgroup>
+</header>
+
+{if $errorField == 'search'}
+<p class="error">{lang}wcf.acp.user.search.error.noMatches{/lang}</p>
+{/if}
+
+{*if $deletedUsers}
+       <p class="success">{lang}wcf.acp.user.delete.success{/lang}</p> 
+{elseif $deletedUsers === 0}
+       <p class="error">{lang}wcf.acp.user.delete.error{/lang}</p>     
+{/if*}
+
+<div class="contentHeader">
+       <nav class="largeButtons">
+               <ul>
+                       {if $__wcf->session->getPermission('admin.user.canAddUser')}
+                               <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>
+                       {/if}
+                       <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a>
+                       </li>
+               </ul>
+       </nav>
+</div>
+
+<form method="post" action="index.php?form=UserSearch">
+       <div class="border content">
+               <div class="container-1">
+                       <fieldset>
+                               <legend>{lang}wcf.acp.user.search.conditions.general{/lang}</legend>
+                               <div class="formElement">
+                                       <div class="formFieldLabel">
+                                               <label for="username">{lang}wcf.user.username{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="username" name="username" value="{$username}" />
+                                               <script type="text/javascript">
+                                                       //<![CDATA[
+                                                       var suggestion = new Suggestion('username');
+                                                       suggestion.enableMultiple(false);
+                                                       //]]>
+                                               </script>
+                                       </div>
+                               </div>
+                               
+                               <div class="formElement">
+                                       <div class="formFieldLabel">
+                                               <label for="userID">{lang}wcf.user.userID{/lang}</label>
+                                       </div>
+                                       <div class="formField"> 
+                                               <input type="text" class="inputText" id="userID" name="userID" value="{$userID}" />
+                                       </div>
+                               </div>
+                               
+                               {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}
+                                       <div class="formElement">
+                                               <div class="formFieldLabel">
+                                                       <label for="email">{lang}wcf.user.email{/lang}</label>
+                                               </div>
+                                               <div class="formField"> 
+                                                       <input type="text" class="inputText" id="email" name="email" value="{$email}" />
+                                               </div>
+                                       </div>
+                               {/if}
+                               
+                               {if $availableGroups|count}
+                                       <div class="formGroup">
+                                               <div class="formGroupLabel">
+                                                       <label>{lang}wcf.acp.user.groups{/lang}</label>
+                                               </div>
+                                               <div class="formGroupField">
+                                                       <fieldset>
+                                                               <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+                                                               
+                                                               <div class="formField">
+                                                                       {htmlCheckboxes options=$availableGroups name='groupIDs' selected=$groupIDs}
+                                                                       
+                                                                       <label style="margin-top: 10px"><input type="checkbox" name="invertGroupIDs" value="1" {if $invertGroupIDs == 1}checked="checked" {/if}/> {lang}wcf.acp.user.groups.invertSearch{/lang}</label>
+                                                               </div>
+                                                       </fieldset>
+                                               </div>
+                                       </div>
+                               {/if}
+                               
+                               {if $availableLanguages|count > 1}
+                                       <div class="formGroup">
+                                               <div class="formGroupLabel">
+                                                       <label>{lang}wcf.user.language{/lang}</label>
+                                               </div>
+                                               <div class="formGroupField">
+                                                       <fieldset>
+                                                               <legend>{lang}wcf.acp.user.language{/lang}</legend>
+                                                               
+                                                               <div class="formField">
+                                                                       {htmlCheckboxes options=$availableLanguages name='languageIDs' selected=$languageIDs disableEncoding=true}
+                                                               </div>
+                                                       </fieldset>
+                                               </div>
+                                       </div>
+                               {/if}
+                       </fieldset>
+                       
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+                       
+                       <nav>
+                               <div class="tabMenu">
+                                       <ul>
+                                               {if $optionTree|count}<li id="profile"><a onclick="tabMenu.showSubTabMenu('profile');"><span>{lang}wcf.acp.user.search.conditions.profile{/lang}</span></a></li>{/if}
+                                               {if $additionalTabs|isset}{@$additionalTabs}{/if}
+                                               <li id="resultOptions"><a onclick="tabMenu.showSubTabMenu('resultOptions');"><span>{lang}wcf.acp.user.search.display{/lang}</span></a></li>
+                                       </ul>
+                               </div>
+                       </nav>
+                       <div class="subTabMenu">
+                               <div class="containerHead"><div> </div></div>
+                       </div>
+                       
+                       {if $optionTree|count}
+                               <div class="border tabMenuContent hidden" id="profile-content">
+                                       <div class="container-1">
+                                               <h3 class="subHeading">{lang}wcf.acp.user.search.conditions.profile{/lang}</h3>
+                                               {include file='optionFieldList' langPrefix='wcf.user.option.' options=$optionTree}
+                                       </div>
+                               </div>
+                       {/if}
+                       
+                       {if $additionalTabContents|isset}{@$additionalTabContents}{/if}
+                       
+                       <div class="border tabMenuContent hidden" id="resultOptions-content">
+                               <div class="container-1">
+                                       <h3 class="subHeading">{lang}wcf.acp.user.search.display{/lang}</h3>
+                                       
+                                       <fieldset>
+                                               <legend>{lang}wcf.acp.user.search.display.general{/lang}</legend>
+                                               
+                                               <div class="formElement">
+                                                       <div class="formFieldLabel">
+                                                               <label for="sortField">{lang}wcf.acp.user.search.display.sort{/lang}</label>
+                                                       </div>
+                                                       <div class="formField">
+                                                               <select name="sortField" id="sortField">
+                                                                       <option value="userID"{if $sortField == 'userID'} selected="selected"{/if}>{lang}wcf.user.userID{/lang}</option>
+                                                                       <option value="username"{if $sortField == 'username'} selected="selected"{/if}>{lang}wcf.user.username{/lang}</option>
+                                                                       <option value="email"{if $sortField == 'email'} selected="selected"{/if}>{lang}wcf.user.email{/lang}</option>
+                                                                       <option value="registrationDate"{if $sortField == 'registrationDate'} selected="selected"{/if}>{lang}wcf.user.registrationDate{/lang}</option>
+                                                                       
+                                                                       {if $additionalSortFields|isset}{@$additionalSortFields}{/if}
+                                                               </select>
+                                                               <select name="sortOrder" id="sortOrder">
+                                                                       <option value="ASC"{if $sortOrder == 'ASC'} selected="selected"{/if}>{lang}wcf.global.sortOrder.ascending{/lang}</option>
+                                                                       <option value="DESC"{if $sortOrder == 'DESC'} selected="selected"{/if}>{lang}wcf.global.sortOrder.descending{/lang}</option>
+                                                               </select>
+                                                       </div>
+                                               </div>
+                                               
+                                               <div class="formElement">
+                                                       <div class="formFieldLabel">
+                                                               <label for="itemsPerPage">{lang}wcf.acp.user.search.display.itemsPerPage{/lang}</label>
+                                                       </div>
+                                                       <div class="formField">
+                                                               <input type="text" class="inputText" id="itemsPerPage" name="itemsPerPage" value="{@$itemsPerPage}" />
+                                                       </div>
+                                               </div>
+                                       </fieldset>
+                                       
+                                       <fieldset>
+                                               <legend>{lang}wcf.acp.user.search.display.columns{/lang}</legend>
+                                               
+                                               {if $optionTree|count}
+                                                       <div class="formGroup">
+                                                               <div class="formGroupLabel">
+                                                                       <label>{lang}wcf.acp.user.search.display.columns.profile{/lang}</label>
+                                                               </div>
+                                                               <div class="formGroupField">
+                                                                       <fieldset>
+                                                                               <legend>{lang}wcf.acp.user.search.display.columns.profile{/lang}</legend>
+                                                                               
+                                                                               <div class="formField">
+                                                                                       {foreach from=$optionTree item=option}
+                                                                                               <label><input type="checkbox" name="columns[]" value="{$option->optionName}" {if $option->optionName|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.option.{$option->optionName}{/lang}</label>
+                                                                                       {/foreach}
+                                                                               </div>
+                                                                       </fieldset>
+                                                               </div>
+                                                       </div>
+                                               {/if}
+                                               
+                                               <div class="formGroup">
+                                                       <div class="formGroupLabel">
+                                                               <label>{lang}wcf.acp.user.search.display.columns.other{/lang}</label>
+                                                       </div>
+                                                       <div class="formGroupField">
+                                                               <fieldset>
+                                                                       <legend>{lang}wcf.acp.user.search.display.columns.other{/lang}</legend>
+                                                                       
+                                                                       <div class="formField">
+                                                                               <label><input type="checkbox" name="columns[]" value="email" {if "email"|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.email{/lang}</label>
+                                                                               <label><input type="checkbox" name="columns[]" value="registrationDate" {if "registrationDate"|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.registrationDate{/lang}</label>
+                                                                               
+                                                                               {if $additionalColumns|isset}{@$additionalColumns}{/if}
+                                                                       </div>
+                                                               </fieldset>
+                                                       </div>
+                                               </div>
+                                               
+                                               
+                                       </fieldset>
+                               </div>
+                       </div>
+                       
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               {@SID_INPUT_TAG}
+       </div>
+</form>
+
+{include file='footer'}
index d72d8e556e5d35a020d47fc7b01180bdde783045..042180cd6e6d40c673107a8fbf43d7654ac16603 100644 (file)
@@ -1,9 +1,9 @@
-{include file='header'}\r
-\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/Suggestion.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
+{include file='header'}
+
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/Suggestion.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>
+<script type="text/javascript">
+       //<![CDATA[
        // disable
        function disableAll() {
                {foreach from=$availableActions item=availableAction}
@@ -45,7 +45,7 @@
                disableAll();
        }
        
-       var tabMenu = new TabMenu();\r
+       var tabMenu = new TabMenu();
        onloadEvents.push(function() {
                tabMenu.showSubTabMenu('profile')
                {if $action != ''}enable{@$action|ucfirst}();{else}disableAll();{/if}
                                break;
                }
        }
-       onloadEvents.push(function() { setFileType('{@$fileType}'); });\r
-       //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
-       <img src="{@RELATIVE_WCF_DIR}icon/usersMassProcessingL.png" alt="" />\r
-       <div class="headlineContainer">\r
-               <h2>{lang}wcf.acp.user.massProcessing{/lang}</h2>\r
-       </div>\r
-</div>\r
-\r
-{if $errorField}\r
-       <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $affectedUsers|isset}\r
-       <p class="success">{lang}wcf.acp.user.massProcessing.success{/lang}</p> \r
-{/if}\r
-\r
-<p class="warning">{lang}wcf.acp.user.massProcessing.warning{/lang}</p>\r
-\r
-<form method="post" action="index.php?form=UsersMassProcessing">\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <h3 class="subHeadline">{lang}wcf.acp.user.massProcessing.conditions{/lang}</h3>\r
-                       \r
-                       <fieldset>\r
-                               <legend>{lang}wcf.acp.user.search.conditions.general{/lang}</legend>\r
-                               \r
-                               <div class="formElement">\r
-                                       <div class="formFieldLabel">\r
-                                               <label for="username">{lang}wcf.user.username{/lang}</label>\r
-                                       </div>\r
-                                       <div class="formField">\r
-                                               <input type="text" class="inputText" id="username" name="username" value="{$username}" />\r
-                                               <script type="text/javascript">\r
-                                                       //<![CDATA[\r
-                                                       suggestion.enableMultiple(false);\r
-                                                       suggestion.init('username');\r
-                                                       //]]>\r
-                                               </script>\r
-                                       </div>\r
-                               </div>\r
-                               \r
-                               {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}\r
-                                       <div class="formElement">\r
-                                               <div class="formFieldLabel">\r
-                                                       <label for="email">{lang}wcf.user.email{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formField"> \r
-                                                       <input type="text" class="inputText" id="email" name="email" value="{$email}" />\r
-                                               </div>\r
-                                       </div>\r
-                               {/if}\r
-                               \r
-                               {if $availableGroups|count}\r
-                                       <div class="formGroup">\r
-                                               <div class="formGroupLabel">\r
-                                                       <label>{lang}wcf.acp.user.groups{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formGroupField">\r
-                                                       <fieldset>\r
-                                                               <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
-                                                               \r
-                                                               <div class="formField">\r
-                                                                       {htmlCheckboxes options=$availableGroups name='groupIDArray' selected=$groupIDArray}\r
-                                                                       \r
-                                                                       <label style="margin-top: 10px"><input type="checkbox" name="invertGroupIDs" value="1" {if $invertGroupIDs == 1}checked="checked" {/if}/> {lang}wcf.acp.user.groups.invertSearch{/lang}</label>\r
-                                                               </div>\r
-                                                       </fieldset>\r
-                                               </div>\r
-                                       </div>\r
-                               {/if}\r
-                               \r
-                               {if $availableLanguages|count > 1}\r
-                                       <div class="formGroup">\r
-                                               <div class="formGroupLabel">\r
-                                                       <label>{lang}wcf.user.language{/lang}</label>\r
-                                               </div>\r
-                                               <div class="formGroupField">\r
-                                                       <fieldset>\r
-                                                               <legend>{lang}wcf.acp.user.language{/lang}</legend>\r
-                                                               \r
-                                                               <div class="formField">\r
-                                                                       {htmlCheckboxes options=$availableLanguages name='languageIDArray' selected=$languageIDArray disableEncoding=true}\r
-                                                               </div>\r
-                                                       </fieldset>\r
-                                               </div>\r
-                                       </div>\r
-                               {/if}\r
-                       </fieldset>\r
-               \r
-                       {if $additionalFields|isset}{@$additionalFields}{/if}\r
-                       \r
-                       <div class="tabMenu">\r
-                               <ul>\r
-                                       {if $options|count}<li id="profile"><a onclick="tabMenu.showSubTabMenu('profile');"><span>{lang}wcf.acp.user.search.conditions.profile{/lang}</span></a></li>{/if}\r
-                                       {if $additionalTabs|isset}{@$additionalTabs}{/if}\r
-                               </ul>\r
-                       </div>\r
-                       <div class="subTabMenu">\r
-                               <div class="containerHead"><div> </div></div>\r
-                       </div>\r
-                       \r
-                       {if $options|count}\r
-                               <div class="border tabMenuContent hidden" id="profile-content">\r
-                                       <div class="container-1">\r
-                                               <h3 class="subHeadline">{lang}wcf.acp.user.search.conditions.profile{/lang}</h3>\r
-                                               {include file='optionFieldList' langPrefix='wcf.user.option.'}\r
-                                       </div>\r
-                               </div>\r
-                       {/if}\r
-                       \r
+       onloadEvents.push(function() { setFileType('{@$fileType}'); });
+       //]]>
+</script>
+
+<div class="mainHeadline">
+       <img src="{@RELATIVE_WCF_DIR}icon/usersMassProcessingL.png" alt="" />
+       <div class="headlineContainer">
+               <h2>{lang}wcf.acp.user.massProcessing{/lang}</h2>
+       </div>
+</div>
+
+{if $errorField}
+       <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $affectedUsers|isset}
+       <p class="success">{lang}wcf.acp.user.massProcessing.success{/lang}</p> 
+{/if}
+
+<p class="warning">{lang}wcf.acp.user.massProcessing.warning{/lang}</p>
+
+<form method="post" action="index.php?form=UsersMassProcessing">
+       <div class="border content">
+               <div class="container-1">
+                       <h3 class="subHeadline">{lang}wcf.acp.user.massProcessing.conditions{/lang}</h3>
+                       
+                       <fieldset>
+                               <legend>{lang}wcf.acp.user.search.conditions.general{/lang}</legend>
+                               
+                               <div class="formElement">
+                                       <div class="formFieldLabel">
+                                               <label for="username">{lang}wcf.user.username{/lang}</label>
+                                       </div>
+                                       <div class="formField">
+                                               <input type="text" class="inputText" id="username" name="username" value="{$username}" />
+                                               <script type="text/javascript">
+                                                       //<![CDATA[
+                                                       suggestion.enableMultiple(false);
+                                                       suggestion.init('username');
+                                                       //]]>
+                                               </script>
+                                       </div>
+                               </div>
+                               
+                               {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}
+                                       <div class="formElement">
+                                               <div class="formFieldLabel">
+                                                       <label for="email">{lang}wcf.user.email{/lang}</label>
+                                               </div>
+                                               <div class="formField"> 
+                                                       <input type="text" class="inputText" id="email" name="email" value="{$email}" />
+                                               </div>
+                                       </div>
+                               {/if}
+                               
+                               {if $availableGroups|count}
+                                       <div class="formGroup">
+                                               <div class="formGroupLabel">
+                                                       <label>{lang}wcf.acp.user.groups{/lang}</label>
+                                               </div>
+                                               <div class="formGroupField">
+                                                       <fieldset>
+                                                               <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+                                                               
+                                                               <div class="formField">
+                                                                       {htmlCheckboxes options=$availableGroups name='groupIDArray' selected=$groupIDArray}
+                                                                       
+                                                                       <label style="margin-top: 10px"><input type="checkbox" name="invertGroupIDs" value="1" {if $invertGroupIDs == 1}checked="checked" {/if}/> {lang}wcf.acp.user.groups.invertSearch{/lang}</label>
+                                                               </div>
+                                                       </fieldset>
+                                               </div>
+                                       </div>
+                               {/if}
+                               
+                               {if $availableLanguages|count > 1}
+                                       <div class="formGroup">
+                                               <div class="formGroupLabel">
+                                                       <label>{lang}wcf.user.language{/lang}</label>
+                                               </div>
+                                               <div class="formGroupField">
+                                                       <fieldset>
+                                                               <legend>{lang}wcf.acp.user.language{/lang}</legend>
+                                                               
+                                                               <div class="formField">
+                                                                       {htmlCheckboxes options=$availableLanguages name='languageIDArray' selected=$languageIDArray disableEncoding=true}
+                                                               </div>
+                                                       </fieldset>
+                                               </div>
+                                       </div>
+                               {/if}
+                       </fieldset>
+               
+                       {if $additionalFields|isset}{@$additionalFields}{/if}
+                       
+                       <div class="tabMenu">
+                               <ul>
+                                       {if $options|count}<li id="profile"><a onclick="tabMenu.showSubTabMenu('profile');"><span>{lang}wcf.acp.user.search.conditions.profile{/lang}</span></a></li>{/if}
+                                       {if $additionalTabs|isset}{@$additionalTabs}{/if}
+                               </ul>
+                       </div>
+                       <div class="subTabMenu">
+                               <div class="containerHead"><div> </div></div>
+                       </div>
+                       
+                       {if $options|count}
+                               <div class="border tabMenuContent hidden" id="profile-content">
+                                       <div class="container-1">
+                                               <h3 class="subHeadline">{lang}wcf.acp.user.search.conditions.profile{/lang}</h3>
+                                               {include file='optionFieldList' langPrefix='wcf.user.option.'}
+                                       </div>
+                               </div>
+                       {/if}
+                       
                        {if $additionalTabContents|isset}{@$additionalTabContents}{/if}
                </div>
-       </div>\r
-       <div class="border content">\r
-               <div class="container-1">\r
-                       <h3 class="subHeadline">{lang}wcf.acp.user.massProcessing.action{/lang}</h3>\r
-                               \r
-                       <div class="formGroup{if $errorField == 'action'} formError{/if}">\r
-                               <div class="formGroupLabel">\r
-                                       <label>{lang}wcf.acp.user.massProcessing.action{/lang}</label>\r
-                               </div>\r
-                               <div class="formGroupField">\r
-                                       <fieldset>\r
-                                               <legend>{lang}wcf.acp.user.massProcessing.action{/lang}</legend>\r
-                                               <div class="formField">\r
-                                                       <ul class="formOptionsLong">\r
-                                                               {if $__wcf->session->getPermission('admin.user.canMailUser')}\r
-                                                                       <li><label><input onclick="if (IS_SAFARI) enableSendMail()" onfocus="enableSendMail()" type="radio" name="action" value="sendMail" {if $action == 'sendMail'}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail{/lang}</label></li>\r
-                                                                       <li><label><input onclick="if (IS_SAFARI) enableExportMailAddress()" onfocus="enableExportMailAddress()" type="radio" name="action" value="exportMailAddress" {if $action == 'exportMailAddress'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress{/lang}</label></li>\r
-                                                               {/if}\r
-                                                               {if $__wcf->session->getPermission('admin.user.canEditUser')}\r
-                                                                       <li><label><input onclick="if (IS_SAFARI) enableAssignToGroup()" onfocus="enableAssignToGroup()" type="radio" name="action" value="assignToGroup" {if $action == 'assignToGroup'}checked="checked" {/if}/> {lang}wcf.acp.user.assignToGroup{/lang}</label></li>\r
-                                                               {/if}\r
-                                                               {if $__wcf->session->getPermission('admin.user.canDeleteUser')}\r
-                                                                       <li><label><input onclick="if (IS_SAFARI) enableDelete()" onfocus="enableDelete()" type="radio" name="action" value="delete" {if $action == 'delete'}checked="checked" {/if}/> {lang}wcf.acp.user.delete{/lang}</label></li>\r
-                                                               {/if}\r
-                                                               {if $additionalActions|isset}{@$additionalActions}{/if}\r
-                                                       </ul>\r
-                                               </div>\r
-                                               {if $errorField == 'action'}\r
-                                                       <p class="innerError">\r
-                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                       </p>\r
-                                               {/if}\r
-                                       </fieldset>\r
-                               </div>\r
-                       </div>\r
-                       \r
-                       <div id="sendMailDiv">\r
-                               <fieldset>\r
-                                       <legend>{lang}wcf.acp.user.sendMail.mail{/lang}</legend>\r
-                                       \r
-                                       <div>\r
-                                               <div class="formElement{if $errorField == 'subject'} formError{/if}" id="subjectDiv">\r
-                                                       <div class="formFieldLabel">\r
-                                                               <label for="subject">{lang}wcf.acp.user.sendMail.subject{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formField">\r
-                                                               <input type="text" class="inputText" id="subject" name="subject" value="{$subject}" />\r
-                                                               {if $errorField == 'subject'}\r
-                                                                       <p class="innerError">\r
-                                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                                       </p>\r
-                                                               {/if}\r
-                                                       </div>\r
-                                                       <div class="formFieldDesc hidden" id="subjectHelpMessage">\r
-                                                               <p>{lang}wcf.acp.user.sendMail.subject.description{/lang}</p>\r
-                                                       </div>\r
-                                               </div>\r
-                                               <script type="text/javascript">//<![CDATA[\r
-                                                       inlineHelp.register('subject');\r
-                                               //]]></script>\r
-                                               \r
-                                               <div class="formElement{if $errorField == 'from'} formError{/if}" id="fromDiv">\r
-                                                       <div class="formFieldLabel">\r
-                                                               <label for="from">{lang}wcf.acp.user.sendMail.from{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formField">\r
-                                                               <input type="text" class="inputText" id="from" name="from" value="{$from}" />\r
-                                                               {if $errorField == 'from'}\r
-                                                                       <p class="innerError">\r
-                                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                                       </p>\r
-                                                               {/if}\r
-                                                       </div>\r
-                                                       <div class="formFieldDesc hidden" id="fromHelpMessage">\r
-                                                               {lang}wcf.acp.user.sendMail.from.description{/lang}\r
-                                                       </div>\r
-                                               </div>\r
-                                               <script type="text/javascript">//<![CDATA[\r
-                                                       inlineHelp.register('from');\r
-                                               //]]></script>\r
-                                       \r
-                                               <div class="formElement{if $errorField == 'text'} formError{/if}" id="textDiv">\r
-                                                       <div class="formFieldLabel">\r
-                                                               <label for="text">{lang}wcf.acp.user.sendMail.text{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formField">\r
-                                                               <textarea id="text" name="text" rows="15" cols="40">{$text}</textarea>\r
-                                                               {if $errorField == 'text'}\r
-                                                                       <p class="innerError">\r
-                                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                                       </p>\r
-                                                               {/if}\r
-                                                       </div>\r
-                                                       <div class="formFieldDesc hidden" id="textHelpMessage">\r
-                                                               <p>{lang}wcf.acp.user.sendMail.text.description{/lang}</p>\r
-                                                       </div>\r
-                                               </div>\r
-                                               <script type="text/javascript">//<![CDATA[\r
-                                                       inlineHelp.register('text');\r
-                                               //]]></script>\r
-                                               \r
-                                               <div class="formElement">\r
-                                                       <div class="formField">\r
-                                                               <label><input type="checkbox" name="enableHTML" id="enableHTML" value="1" {if $enableHTML == 1}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail.enableHTML{/lang}</label>\r
-                                                       </div>\r
-                                               </div>\r
-                                       </div>\r
-                               </fieldset>\r
-                       </div>\r
-                       \r
-                       <div id="exportMailAddressDiv">\r
-                               <fieldset>\r
-                                       <legend>{lang}wcf.acp.user.exportEmailAddress.format{/lang}</legend>\r
-                                       \r
-                                       <div>\r
-                                               <div class="formGroup">\r
-                                                       <div class="formGroupLabel">\r
-                                                               <label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formGroupField">\r
-                                                               <fieldset>\r
-                                                                       <legend>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</legend>\r
-                                                                       \r
-                                                                       <div class="formField">\r
-                                                                               <ul class="formOptionsLong">\r
-                                                                                       <li><label><input onclick="if (IS_SAFARI) setFileType('csv')" onfocus="setFileType('csv')" type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label></li>\r
-                                                                                       <li><label><input onclick="if (IS_SAFARI) setFileType('xml')" onfocus="setFileType('xml')" type="radio" name="fileType" value="xml" {if $fileType == 'xml'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label></li>\r
-                                                                               </ul>\r
-                                                                       </div>\r
-                                                               </fieldset>\r
-                                                       </div>\r
-                                               </div>\r
-                                       \r
-                                               <div class="formElement" id="separatorDiv">\r
-                                                       <div class="formFieldLabel">\r
-                                                               <label for="separator">{lang}wcf.acp.user.exportEmailAddress.separator{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formField">\r
-                                                               <textarea id="separator" name="separator" rows="2" cols="40">{$separator}</textarea>\r
-                                                       </div>\r
-                                               </div>\r
-                                               \r
-                                               <div class="formElement" id="textSeparatorDiv">\r
-                                                       <div class="formFieldLabel">\r
-                                                               <label for="textSeparator">{lang}wcf.acp.user.exportEmailAddress.textSeparator{/lang}</label>\r
-                                                       </div>\r
-                                                       <div class="formField">\r
-                                                               <input type="text" class="inputText" id="textSeparator" name="textSeparator" value="{$textSeparator}" />\r
-                                                       </div>\r
-                                               </div>\r
-                                       </div>\r
-                               </fieldset>\r
-                       </div>\r
-                       \r
-                       <div id="assignToGroupDiv">\r
-                               <fieldset>\r
-                                       <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
-                                       \r
-                                       <div>\r
-                                               <div class="formField{if $errorField == 'assignToGroupIDArray'} formError{/if}">\r
-                                                       {htmlCheckboxes options=$availableGroups name=assignToGroupIDArray selected=$assignToGroupIDArray}\r
-                                                       {if $errorField == 'assignToGroupIDArray'}\r
-                                                               <p class="innerError">\r
-                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
-                                                               </p>\r
-                                                       {/if}\r
-                                               </div>\r
-                                       </div>\r
-                               </fieldset>\r
-                       </div>\r
+       </div>
+       <div class="border content">
+               <div class="container-1">
+                       <h3 class="subHeadline">{lang}wcf.acp.user.massProcessing.action{/lang}</h3>
+                               
+                       <div class="formGroup{if $errorField == 'action'} formError{/if}">
+                               <div class="formGroupLabel">
+                                       <label>{lang}wcf.acp.user.massProcessing.action{/lang}</label>
+                               </div>
+                               <div class="formGroupField">
+                                       <fieldset>
+                                               <legend>{lang}wcf.acp.user.massProcessing.action{/lang}</legend>
+                                               <div class="formField">
+                                                       <ul class="formOptionsLong">
+                                                               {if $__wcf->session->getPermission('admin.user.canMailUser')}
+                                                                       <li><label><input onclick="if (IS_SAFARI) enableSendMail()" onfocus="enableSendMail()" type="radio" name="action" value="sendMail" {if $action == 'sendMail'}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail{/lang}</label></li>
+                                                                       <li><label><input onclick="if (IS_SAFARI) enableExportMailAddress()" onfocus="enableExportMailAddress()" type="radio" name="action" value="exportMailAddress" {if $action == 'exportMailAddress'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress{/lang}</label></li>
+                                                               {/if}
+                                                               {if $__wcf->session->getPermission('admin.user.canEditUser')}
+                                                                       <li><label><input onclick="if (IS_SAFARI) enableAssignToGroup()" onfocus="enableAssignToGroup()" type="radio" name="action" value="assignToGroup" {if $action == 'assignToGroup'}checked="checked" {/if}/> {lang}wcf.acp.user.assignToGroup{/lang}</label></li>
+                                                               {/if}
+                                                               {if $__wcf->session->getPermission('admin.user.canDeleteUser')}
+                                                                       <li><label><input onclick="if (IS_SAFARI) enableDelete()" onfocus="enableDelete()" type="radio" name="action" value="delete" {if $action == 'delete'}checked="checked" {/if}/> {lang}wcf.acp.user.delete{/lang}</label></li>
+                                                               {/if}
+                                                               {if $additionalActions|isset}{@$additionalActions}{/if}
+                                                       </ul>
+                                               </div>
+                                               {if $errorField == 'action'}
+                                                       <p class="innerError">
+                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                       </p>
+                                               {/if}
+                                       </fieldset>
+                               </div>
+                       </div>
+                       
+                       <div id="sendMailDiv">
+                               <fieldset>
+                                       <legend>{lang}wcf.acp.user.sendMail.mail{/lang}</legend>
+                                       
+                                       <div>
+                                               <div class="formElement{if $errorField == 'subject'} formError{/if}" id="subjectDiv">
+                                                       <div class="formFieldLabel">
+                                                               <label for="subject">{lang}wcf.acp.user.sendMail.subject{/lang}</label>
+                                                       </div>
+                                                       <div class="formField">
+                                                               <input type="text" class="inputText" id="subject" name="subject" value="{$subject}" />
+                                                               {if $errorField == 'subject'}
+                                                                       <p class="innerError">
+                                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                                       </p>
+                                                               {/if}
+                                                       </div>
+                                                       <div class="formFieldDesc hidden" id="subjectHelpMessage">
+                                                               <p>{lang}wcf.acp.user.sendMail.subject.description{/lang}</p>
+                                                       </div>
+                                               </div>
+                                               <script type="text/javascript">//<![CDATA[
+                                                       inlineHelp.register('subject');
+                                               //]]></script>
+                                               
+                                               <div class="formElement{if $errorField == 'from'} formError{/if}" id="fromDiv">
+                                                       <div class="formFieldLabel">
+                                                               <label for="from">{lang}wcf.acp.user.sendMail.from{/lang}</label>
+                                                       </div>
+                                                       <div class="formField">
+                                                               <input type="text" class="inputText" id="from" name="from" value="{$from}" />
+                                                               {if $errorField == 'from'}
+                                                                       <p class="innerError">
+                                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                                       </p>
+                                                               {/if}
+                                                       </div>
+                                                       <div class="formFieldDesc hidden" id="fromHelpMessage">
+                                                               {lang}wcf.acp.user.sendMail.from.description{/lang}
+                                                       </div>
+                                               </div>
+                                               <script type="text/javascript">//<![CDATA[
+                                                       inlineHelp.register('from');
+                                               //]]></script>
+                                       
+                                               <div class="formElement{if $errorField == 'text'} formError{/if}" id="textDiv">
+                                                       <div class="formFieldLabel">
+                                                               <label for="text">{lang}wcf.acp.user.sendMail.text{/lang}</label>
+                                                       </div>
+                                                       <div class="formField">
+                                                               <textarea id="text" name="text" rows="15" cols="40">{$text}</textarea>
+                                                               {if $errorField == 'text'}
+                                                                       <p class="innerError">
+                                                                               {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                                       </p>
+                                                               {/if}
+                                                       </div>
+                                                       <div class="formFieldDesc hidden" id="textHelpMessage">
+                                                               <p>{lang}wcf.acp.user.sendMail.text.description{/lang}</p>
+                                                       </div>
+                                               </div>
+                                               <script type="text/javascript">//<![CDATA[
+                                                       inlineHelp.register('text');
+                                               //]]></script>
+                                               
+                                               <div class="formElement">
+                                                       <div class="formField">
+                                                               <label><input type="checkbox" name="enableHTML" id="enableHTML" value="1" {if $enableHTML == 1}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail.enableHTML{/lang}</label>
+                                                       </div>
+                                               </div>
+                                       </div>
+                               </fieldset>
+                       </div>
                        
-                       {if $additionalActionSettings|isset}{@$additionalActionSettings}{/if}\r
-               </div>\r
-       </div>\r
-       \r
-       <div class="formSubmit">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
-               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-       </div>\r
-</form>\r
-\r
+                       <div id="exportMailAddressDiv">
+                               <fieldset>
+                                       <legend>{lang}wcf.acp.user.exportEmailAddress.format{/lang}</legend>
+                                       
+                                       <div>
+                                               <div class="formGroup">
+                                                       <div class="formGroupLabel">
+                                                               <label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label>
+                                                       </div>
+                                                       <div class="formGroupField">
+                                                               <fieldset>
+                                                                       <legend>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</legend>
+                                                                       
+                                                                       <div class="formField">
+                                                                               <ul class="formOptionsLong">
+                                                                                       <li><label><input onclick="if (IS_SAFARI) setFileType('csv')" onfocus="setFileType('csv')" type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label></li>
+                                                                                       <li><label><input onclick="if (IS_SAFARI) setFileType('xml')" onfocus="setFileType('xml')" type="radio" name="fileType" value="xml" {if $fileType == 'xml'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label></li>
+                                                                               </ul>
+                                                                       </div>
+                                                               </fieldset>
+                                                       </div>
+                                               </div>
+                                       
+                                               <div class="formElement" id="separatorDiv">
+                                                       <div class="formFieldLabel">
+                                                               <label for="separator">{lang}wcf.acp.user.exportEmailAddress.separator{/lang}</label>
+                                                       </div>
+                                                       <div class="formField">
+                                                               <textarea id="separator" name="separator" rows="2" cols="40">{$separator}</textarea>
+                                                       </div>
+                                               </div>
+                                               
+                                               <div class="formElement" id="textSeparatorDiv">
+                                                       <div class="formFieldLabel">
+                                                               <label for="textSeparator">{lang}wcf.acp.user.exportEmailAddress.textSeparator{/lang}</label>
+                                                       </div>
+                                                       <div class="formField">
+                                                               <input type="text" class="inputText" id="textSeparator" name="textSeparator" value="{$textSeparator}" />
+                                                       </div>
+                                               </div>
+                                       </div>
+                               </fieldset>
+                       </div>
+                       
+                       <div id="assignToGroupDiv">
+                               <fieldset>
+                                       <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+                                       
+                                       <div>
+                                               <div class="formField{if $errorField == 'assignToGroupIDArray'} formError{/if}">
+                                                       {htmlCheckboxes options=$availableGroups name=assignToGroupIDArray selected=$assignToGroupIDArray}
+                                                       {if $errorField == 'assignToGroupIDArray'}
+                                                               <p class="innerError">
+                                                                       {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+                                                               </p>
+                                                       {/if}
+                                               </div>
+                                       </div>
+                               </fieldset>
+                       </div>
+                       
+                       {if $additionalActionSettings|isset}{@$additionalActionSettings}{/if}
+               </div>
+       </div>
+       
+       <div class="formSubmit">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+               <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+               {@SID_INPUT_TAG}
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index bcd2aa67f558746107405ee8ba079650c2a7f1dd..e6047f87fb41b99794082cdd1494a1f4d998fbca 100644 (file)
@@ -1,70 +1,70 @@
-{if !$progress|isset}{assign var="progress" value=0}{/if}\r
-{assign var="actionTitle" value=$pageTitle}\r
-{capture assign="pageTitle"}{lang}wcf.acp.worker.progressBar{/lang} - {@$pageTitle}{/capture}\r
-{include file='setupHeader'}\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       function showWindow(show) {\r
-               if (show) {\r
-                       document.getElementById('iframe').style.visibility = 'visible';\r
-                       window.focus();\r
-               } else {\r
-                       xHeight('iframe', 0);\r
-                       document.getElementById('iframe').style.visibility = 'hidden';\r
-               }\r
-       }\r
-       \r
-       function setCurrentStep(title) {\r
-               document.getElementById('currentStep').innerHTML = title;\r
-       }\r
-       \r
-       function setProgress(progress) {\r
-               document.getElementById('progressBar').style.width = Math.round(300 * progress / 100) + 'px';\r
-               {literal}\r
-               document.getElementById('progressText').innerHTML = document.getElementById('progressText').innerHTML.replace(/\d{1,3}%/, progress + '%');\r
-               document.title = document.title.replace(/\d{1,3}%/, progress + '%');\r
-               {/literal}\r
-       }\r
-       \r
-       onloadEvents.push(function() {\r
-               document.getElementById('workerIcon').onclick = function(event) {\r
-                       if (!event) event = window.event;\r
-                       \r
-                       if (event.altKey) {\r
-                               showWindow(true);\r
-                               if (!xHeight('iframe')) {\r
-                                       xHeight('iframe', 300);\r
-                               }\r
-                       }\r
-               }\r
-       });\r
-       //]]>\r
-</script>\r
-\r
-<img id="workerIcon" class="icon" src="{@RELATIVE_WCF_DIR}icon/workerXL.png" alt="" />\r
-\r
-<h1><b>{lang}wcf.global.pageTitle{/lang}</b><br />{@$actionTitle}</h1>\r
-\r
-<div class="progress">\r
-       <div id="progressBar" class="progressBar" style="width: {@300*$progress/100|round:0}px"></div>\r
-       <div id="progressText" class="progressText">{lang}wcf.acp.worker.progressBar{/lang}</div>\r
-</div>\r
-\r
-<hr />\r
-\r
-<h2>{lang}wcf.acp.worker.title{/lang}</h2>\r
-\r
-<p>{lang}wcf.acp.worker.description{/lang}</p>\r
-\r
-<fieldset>\r
-       <legend>{lang}wcf.acp.worker.currentStep{/lang}</legend>\r
-       \r
-       <div class="inner">\r
-               <div><span id="currentStep"></span></div>\r
-               \r
-               <iframe id="iframe" frameborder="0" src="{$url}"></iframe>\r
-       </div>\r
-</fieldset>\r
-\r
+{if !$progress|isset}{assign var="progress" value=0}{/if}
+{assign var="actionTitle" value=$pageTitle}
+{capture assign="pageTitle"}{lang}wcf.acp.worker.progressBar{/lang} - {@$pageTitle}{/capture}
+{include file='setupHeader'}
+
+<script type="text/javascript">
+       //<![CDATA[
+       function showWindow(show) {
+               if (show) {
+                       document.getElementById('iframe').style.visibility = 'visible';
+                       window.focus();
+               } else {
+                       xHeight('iframe', 0);
+                       document.getElementById('iframe').style.visibility = 'hidden';
+               }
+       }
+       
+       function setCurrentStep(title) {
+               document.getElementById('currentStep').innerHTML = title;
+       }
+       
+       function setProgress(progress) {
+               document.getElementById('progressBar').style.width = Math.round(300 * progress / 100) + 'px';
+               {literal}
+               document.getElementById('progressText').innerHTML = document.getElementById('progressText').innerHTML.replace(/\d{1,3}%/, progress + '%');
+               document.title = document.title.replace(/\d{1,3}%/, progress + '%');
+               {/literal}
+       }
+       
+       onloadEvents.push(function() {
+               document.getElementById('workerIcon').onclick = function(event) {
+                       if (!event) event = window.event;
+                       
+                       if (event.altKey) {
+                               showWindow(true);
+                               if (!xHeight('iframe')) {
+                                       xHeight('iframe', 300);
+                               }
+                       }
+               }
+       });
+       //]]>
+</script>
+
+<img id="workerIcon" class="icon" src="{@RELATIVE_WCF_DIR}icon/workerXL.png" alt="" />
+
+<h1><b>{lang}wcf.global.pageTitle{/lang}</b><br />{@$actionTitle}</h1>
+
+<div class="progress">
+       <div id="progressBar" class="progressBar" style="width: {@300*$progress/100|round:0}px"></div>
+       <div id="progressText" class="progressText">{lang}wcf.acp.worker.progressBar{/lang}</div>
+</div>
+
+<hr />
+
+<h2>{lang}wcf.acp.worker.title{/lang}</h2>
+
+<p>{lang}wcf.acp.worker.description{/lang}</p>
+
+<fieldset>
+       <legend>{lang}wcf.acp.worker.currentStep{/lang}</legend>
+       
+       <div class="inner">
+               <div><span id="currentStep"></span></div>
+               
+               <iframe id="iframe" frameborder="0" src="{$url}"></iframe>
+       </div>
+</fieldset>
+
 {include file='setupFooter'}
\ No newline at end of file
index f2e46bb67f51cdced98d0eae225cd12f99a44de9..c7b2949a3fca4712c5c83464b1f24bccd99401ae 100644 (file)
@@ -1,14 +1,14 @@
-{include file='setupWindowHeader'}\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       window.onload = function() {\r
-       changeHeight(); \r
-};\r
-       parent.showWindow(true);\r
-       //]]>\r
-</script>\r
-\r
-{$e->show()}\r
-\r
+{include file='setupWindowHeader'}
+
+<script type="text/javascript">
+       //<![CDATA[
+       window.onload = function() {
+       changeHeight(); 
+};
+       parent.showWindow(true);
+       //]]>
+</script>
+
+{$e->show()}
+
 {include file='setupWindowFooter'}
\ No newline at end of file
index f5e86f00a5f7a7f9e7465d578eec9d15890e68cf..8d5146419c7b3e3fa49d7ed163b4327edc0b77dd 100644 (file)
@@ -1,23 +1,23 @@
-{include file='setupWindowHeader'}\r
-\r
-<div class="nextButton">\r
-       <input type="button" value="{lang}wcf.global.button.next{/lang}" onclick="parent.location.href='{if $url|isset}{$url}{else}index.php{@SID_ARG_1ST}{/if}'; parent.stopAnimating();" />\r
-</div>\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       window.onload = function() {\r
-       changeHeight(); \r
-};\r
-       parent.setProgress(100);\r
-       parent.showWindow(true);\r
-       parent.setCurrentStep('{@$stepTitle}');\r
-       //]]>\r
-</script>\r
-\r
-{if $message|isset}\r
-       {@$message}\r
-{/if}\r
-\r
-{include file='setupWindowFooter'}\r
-\r
+{include file='setupWindowHeader'}
+
+<div class="nextButton">
+       <input type="button" value="{lang}wcf.global.button.next{/lang}" onclick="parent.location.href='{if $url|isset}{$url}{else}index.php{@SID_ARG_1ST}{/if}'; parent.stopAnimating();" />
+</div>
+
+<script type="text/javascript">
+       //<![CDATA[
+       window.onload = function() {
+       changeHeight(); 
+};
+       parent.setProgress(100);
+       parent.showWindow(true);
+       parent.setCurrentStep('{@$stepTitle}');
+       //]]>
+</script>
+
+{if $message|isset}
+       {@$message}
+{/if}
+
+{include file='setupWindowFooter'}
+
index 98eff2a149f56db57d42f0f8e60fb6a0779579a5..ac4a1143352a232c92589d99ab10355c0195d6fe 100644 (file)
@@ -1,21 +1,21 @@
-{include file='setupWindowHeader'}\r
-\r
-<h2>Step: {@$stepTitle}</h2>\r
-\r
-<form method="post" action="{$url}">\r
-       <input type="submit" value="Go" onclick="parent.stopAnimating()" />\r
-</form>\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       {if $progress|isset}parent.setProgress({@$progress});{/if}\r
-       parent.showWindow(false);\r
-       parent.setCurrentStep('{@$stepTitle}');\r
-       \r
-       window.onload = function() {\r
-               document.forms[0].submit();\r
-       }\r
-       //]]>\r
-</script>\r
-\r
+{include file='setupWindowHeader'}
+
+<h2>Step: {@$stepTitle}</h2>
+
+<form method="post" action="{$url}">
+       <input type="submit" value="Go" onclick="parent.stopAnimating()" />
+</form>
+
+<script type="text/javascript">
+       //<![CDATA[
+       {if $progress|isset}parent.setProgress({@$progress});{/if}
+       parent.showWindow(false);
+       parent.setCurrentStep('{@$stepTitle}');
+       
+       window.onload = function() {
+               document.forms[0].submit();
+       }
+       //]]>
+</script>
+
 {include file='setupWindowFooter'}
\ No newline at end of file
index b46f39faa2ed32b0ea56a955174707532c1e89da..e2be8b72a69e31e6f08aee0fcf20a8d3017c9c7d 100644 (file)
@@ -1,14 +1,14 @@
-<?php\r
-/**\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @category   Community Framework\r
- */\r
-// define the wcf-root-dir\r
-define('WCF_DIR', dirname(__FILE__).'/');\r
-\r
-// initiate wcf core\r
-require_once(WCF_DIR.'lib/system/WCF.class.php');\r
+<?php
+/**
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @category   Community Framework
+ */
+// define the wcf-root-dir
+define('WCF_DIR', dirname(__FILE__).'/');
+
+// initiate wcf core
+require_once(WCF_DIR.'lib/system/WCF.class.php');
 new wcf\system\WCF();
index 67cd59841a1b7deab8a05a56c5b115cf58e85bd9..964a5772f3c39d77f692f4ce8843878498497595 100644 (file)
-/*!\r
- * jQuery UI 1.8.11\r
- *\r
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\r
- * Dual licensed under the MIT or GPL Version 2 licenses.\r
- * http://jquery.org/license\r
- *\r
- * http://docs.jquery.com/UI\r
- */\r
-(function(b,d){function e(g){return!b(g).parents().andSelf().filter(function(){return b.curCSS(this,"visibility")==="hidden"||b.expr.filters.hidden(this)}).length}b.ui=b.ui||{};if(!b.ui.version){b.extend(b.ui,{version:"1.8.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,\r
-NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});b.fn.extend({_focus:b.fn.focus,focus:function(g,f){return typeof g==="number"?this.each(function(){var a=this;setTimeout(function(){b(a).focus();f&&f.call(a)},g)}):this._focus.apply(this,arguments)},scrollParent:function(){var g;g=b.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(b.curCSS(this,\r
-"position",1))&&/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!g.length?b(document):g},zIndex:function(g){if(g!==d)return this.css("zIndex",g);if(this.length){g=b(this[0]);for(var f;g.length&&g[0]!==document;){f=g.css("position");\r
-if(f==="absolute"||f==="relative"||f==="fixed"){f=parseInt(g.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}g=g.parent()}}return 0},disableSelection:function(){return this.bind((b.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(g){g.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});b.each(["Width","Height"],function(g,f){function a(j,n,p,l){b.each(c,function(){n-=parseFloat(b.curCSS(j,"padding"+this,true))||0;if(p)n-=parseFloat(b.curCSS(j,\r
-"border"+this+"Width",true))||0;if(l)n-=parseFloat(b.curCSS(j,"margin"+this,true))||0});return n}var c=f==="Width"?["Left","Right"]:["Top","Bottom"],h=f.toLowerCase(),i={innerWidth:b.fn.innerWidth,innerHeight:b.fn.innerHeight,outerWidth:b.fn.outerWidth,outerHeight:b.fn.outerHeight};b.fn["inner"+f]=function(j){if(j===d)return i["inner"+f].call(this);return this.each(function(){b(this).css(h,a(this,j)+"px")})};b.fn["outer"+f]=function(j,n){if(typeof j!=="number")return i["outer"+f].call(this,j);return this.each(function(){b(this).css(h,\r
-a(this,j,true,n)+"px")})}});b.extend(b.expr[":"],{data:function(g,f,a){return!!b.data(g,a[3])},focusable:function(g){var f=g.nodeName.toLowerCase(),a=b.attr(g,"tabindex");if("area"===f){f=g.parentNode;a=f.name;if(!g.href||!a||f.nodeName.toLowerCase()!=="map")return false;g=b("img[usemap=#"+a+"]")[0];return!!g&&e(g)}return(/input|select|textarea|button|object/.test(f)?!g.disabled:"a"==f?g.href||!isNaN(a):!isNaN(a))&&e(g)},tabbable:function(g){var f=b.attr(g,"tabindex");return(isNaN(f)||f>=0)&&b(g).is(":focusable")}});\r
-b(function(){var g=document.body,f=g.appendChild(f=document.createElement("div"));b.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});b.support.minHeight=f.offsetHeight===100;b.support.selectstart="onselectstart"in f;g.removeChild(f).style.display="none"});b.extend(b.ui,{plugin:{add:function(g,f,a){g=b.ui[g].prototype;for(var c in a){g.plugins[c]=g.plugins[c]||[];g.plugins[c].push([f,a[c]])}},call:function(g,f,a){if((f=g.plugins[f])&&g.element[0].parentNode)for(var c=0;c<f.length;c++)g.options[f[c][0]]&&\r
-f[c][1].apply(g.element,a)}},contains:function(g,f){return document.compareDocumentPosition?g.compareDocumentPosition(f)&16:g!==f&&g.contains(f)},hasScroll:function(g,f){if(b(g).css("overflow")==="hidden")return false;f=f&&f==="left"?"scrollLeft":"scrollTop";var a=false;if(g[f]>0)return true;g[f]=1;a=g[f]>0;g[f]=0;return a},isOverAxis:function(g,f,a){return g>f&&g<f+a},isOver:function(g,f,a,c,h,i){return b.ui.isOverAxis(g,a,h)&&b.ui.isOverAxis(f,c,i)}})}})(jQuery);\r
-(function(b,d){if(b.cleanData){var e=b.cleanData;b.cleanData=function(f){for(var a=0,c;(c=f[a])!=null;a++)b(c).triggerHandler("remove");e(f)}}else{var g=b.fn.remove;b.fn.remove=function(f,a){return this.each(function(){if(!a)if(!f||b.filter(f,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return g.call(b(this),f,a)})}}b.widget=function(f,a,c){var h=f.split(".")[0],i;f=f.split(".")[1];i=h+"-"+f;if(!c){c=a;a=b.Widget}b.expr[":"][i]=function(j){return!!b.data(j,\r
-f)};b[h]=b[h]||{};b[h][f]=function(j,n){arguments.length&&this._createWidget(j,n)};a=new a;a.options=b.extend(true,{},a.options);b[h][f].prototype=b.extend(true,a,{namespace:h,widgetName:f,widgetEventPrefix:b[h][f].prototype.widgetEventPrefix||f,widgetBaseClass:i},c);b.widget.bridge(f,b[h][f])};b.widget.bridge=function(f,a){b.fn[f]=function(c){var h=typeof c==="string",i=Array.prototype.slice.call(arguments,1),j=this;c=!h&&i.length?b.extend.apply(null,[true,c].concat(i)):c;if(h&&c.charAt(0)==="_")return j;\r
-h?this.each(function(){var n=b.data(this,f),p=n&&b.isFunction(n[c])?n[c].apply(n,i):n;if(p!==n&&p!==d){j=p;return false}}):this.each(function(){var n=b.data(this,f);n?n.option(c||{})._init():b.data(this,f,new a(c,this))});return j}};b.Widget=function(f,a){arguments.length&&this._createWidget(f,a)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,a){b.data(a,this.widgetName,this);this.element=b(a);this.options=b.extend(true,{},this.options,\r
-this._getCreateOptions(),f);var c=this;this.element.bind("remove."+this.widgetName,function(){c.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},\r
-widget:function(){return this.element},option:function(f,a){var c=f;if(arguments.length===0)return b.extend({},this.options);if(typeof f==="string"){if(a===d)return this.options[f];c={};c[f]=a}this._setOptions(c);return this},_setOptions:function(f){var a=this;b.each(f,function(c,h){a._setOption(c,h)});return this},_setOption:function(f,a){this.options[f]=a;if(f==="disabled")this.widget()[a?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",a);return this},\r
-enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(f,a,c){var h=this.options[f];a=b.Event(a);a.type=(f===this.widgetEventPrefix?f:this.widgetEventPrefix+f).toLowerCase();c=c||{};if(a.originalEvent){f=b.event.props.length;for(var i;f;){i=b.event.props[--f];a[i]=a.originalEvent[i]}}this.element.trigger(a,c);return!(b.isFunction(h)&&h.call(this.element[0],a,c)===false||a.isDefaultPrevented())}}})(jQuery);\r
-(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(d){d.originalEvent=\r
-d.originalEvent||{};if(!d.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(d);this._mouseDownEvent=d;var e=this,g=d.which==1,f=typeof this.options.cancel=="string"?b(d.target).parents().add(d.target).filter(this.options.cancel).length:false;if(!g||f||!this._mouseCapture(d))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=\r
-this._mouseStart(d)!==false;if(!this._mouseStarted){d.preventDefault();return true}}true===b.data(d.target,this.widgetName+".preventClickEvent")&&b.removeData(d.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(a){return e._mouseMove(a)};this._mouseUpDelegate=function(a){return e._mouseUp(a)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);d.preventDefault();return d.originalEvent.mouseHandled=\r
-true}},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button)return this._mouseUp(d);if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,d)!==false)?this._mouseDrag(d):this._mouseUp(d);return!this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);\r
-if(this._mouseStarted){this._mouseStarted=false;d.target==this._mouseDownEvent.target&&b.data(d.target,this.widgetName+".preventClickEvent",true);this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);\r
-(function(b){b.widget("ui.draggable",b.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==\r
-"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(d){var e=\r
-this.options;if(this.helper||e.disabled||b(d.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(d);if(!this.handle)return false;return true},_mouseStart:function(d){var e=this.options;this.helper=this._createHelper(d);this._cacheHelperProportions();if(b.ui.ddmanager)b.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-\r
-this.margins.top,left:this.offset.left-this.margins.left};b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt);e.containment&&this._setContainment();if(this._trigger("start",d)===false){this._clear();return false}this._cacheHelperProportions();\r
-b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,d);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(d,true);return true},_mouseDrag:function(d,e){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!e){e=this._uiHash();if(this._trigger("drag",d,e)===false){this._mouseUp({});return false}this.position=e.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||\r
-this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";b.ui.ddmanager&&b.ui.ddmanager.drag(this,d);return false},_mouseStop:function(d){var e=false;if(b.ui.ddmanager&&!this.options.dropBehaviour)e=b.ui.ddmanager.drop(this,d);if(this.dropped){e=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!e||this.options.revert=="valid"&&e||this.options.revert===true||b.isFunction(this.options.revert)&&\r
-this.options.revert.call(this.element,e)){var g=this;b(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){g._trigger("stop",d)!==false&&g._clear()})}else this._trigger("stop",d)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(d){var e=!this.options.handle||!b(this.options.handle,this.element).length?true:false;b(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==\r
-d.target)e=true});return e},_createHelper:function(d){var e=this.options;d=b.isFunction(e.helper)?b(e.helper.apply(this.element[0],[d])):e.helper=="clone"?this.element.clone():this.element;d.parents("body").length||d.appendTo(e.appendTo=="parent"?this.element[0].parentNode:e.appendTo);d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(b.isArray(d))d={left:+d[0],top:+d[1]||\r
-0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],\r
-this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.element.position();return{top:d.top-\r
-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),\r
-height:this.helper.outerHeight()}},_setContainment:function(){var d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[(d.containment=="document"?0:b(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(d.containment=="document"?0:b(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(d.containment=="document"?0:b(window).scrollLeft())+b(d.containment=="document"?\r
-document:window).width()-this.helperProportions.width-this.margins.left,(d.containment=="document"?0:b(window).scrollTop())+(b(d.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)&&d.containment.constructor!=Array){var e=b(d.containment)[0];if(e){d=b(d.containment).offset();var g=b(e).css("overflow")!="hidden";this.containment=[d.left+(parseInt(b(e).css("borderLeftWidth"),\r
-10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0),d.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0),d.left+(g?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,d.top+(g?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),\r
-10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom]}}else if(d.containment.constructor==Array)this.containment=d.containment},_convertPositionTo:function(d,e){if(!e)e=this.position;d=d=="absolute"?1:-1;var g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);return{top:e.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&\r
-b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop())*d),left:e.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:g.scrollLeft())*d)}},_generatePosition:function(d){var e=this.options,g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],\r
-this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName),a=d.pageX,c=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-this.offset.click.left<this.containment[0])a=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])c=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])a=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])c=\r
-this.containment[3]+this.offset.click.top}if(e.grid){c=this.originalPageY+Math.round((c-this.originalPageY)/e.grid[1])*e.grid[1];c=this.containment?!(c-this.offset.click.top<this.containment[1]||c-this.offset.click.top>this.containment[3])?c:!(c-this.offset.click.top<this.containment[1])?c-e.grid[1]:c+e.grid[1]:c;a=this.originalPageX+Math.round((a-this.originalPageX)/e.grid[0])*e.grid[0];a=this.containment?!(a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2])?\r
-a:!(a-this.offset.click.left<this.containment[0])?a-e.grid[0]:a+e.grid[0]:a}}return{top:c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():\r
-f?0:g.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(d,e,g){g=g||this._uiHash();b.ui.plugin.call(this,d,[e,g]);if(d=="drag")this.positionAbs=this._convertPositionTo("absolute");return b.Widget.prototype._trigger.call(this,d,e,g)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,\r
-offset:this.positionAbs}}});b.extend(b.ui.draggable,{version:"1.8.11"});b.ui.plugin.add("draggable","connectToSortable",{start:function(d,e){var g=b(this).data("draggable"),f=g.options,a=b.extend({},e,{item:g.element});g.sortables=[];b(f.connectToSortable).each(function(){var c=b.data(this,"sortable");if(c&&!c.options.disabled){g.sortables.push({instance:c,shouldRevert:c.options.revert});c.refreshPositions();c._trigger("activate",d,a)}})},stop:function(d,e){var g=b(this).data("draggable"),f=b.extend({},\r
-e,{item:g.element});b.each(g.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;g.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(d);this.instance.options.helper=this.instance.options._helper;g.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",d,f)}})},drag:function(d,e){var g=\r
-b(this).data("draggable"),f=this;b.each(g.sortables,function(){this.instance.positionAbs=g.positionAbs;this.instance.helperProportions=g.helperProportions;this.instance.offset.click=g.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=b(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return e.helper[0]};\r
-d.target=this.instance.currentItem[0];this.instance._mouseCapture(d,true);this.instance._mouseStart(d,true,true);this.instance.offset.click.top=g.offset.click.top;this.instance.offset.click.left=g.offset.click.left;this.instance.offset.parent.left-=g.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=g.offset.parent.top-this.instance.offset.parent.top;g._trigger("toSortable",d);g.dropped=this.instance.element;g.currentItem=g.element;this.instance.fromOutside=g}this.instance.currentItem&&\r
-this.instance._mouseDrag(d)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",d,this.instance._uiHash(this.instance));this.instance._mouseStop(d,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();g._trigger("fromSortable",d);g.dropped=false}})}});b.ui.plugin.add("draggable","cursor",\r
-{start:function(){var d=b("body"),e=b(this).data("draggable").options;if(d.css("cursor"))e._cursor=d.css("cursor");d.css("cursor",e.cursor)},stop:function(){var d=b(this).data("draggable").options;d._cursor&&b("body").css("cursor",d._cursor)}});b.ui.plugin.add("draggable","iframeFix",{start:function(){var d=b(this).data("draggable").options;b(d.iframeFix===true?"iframe":d.iframeFix).each(function(){b('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+\r
-"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(b(this).offset()).appendTo("body")})},stop:function(){b("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});b.ui.plugin.add("draggable","opacity",{start:function(d,e){d=b(e.helper);e=b(this).data("draggable").options;if(d.css("opacity"))e._opacity=d.css("opacity");d.css("opacity",e.opacity)},stop:function(d,e){d=b(this).data("draggable").options;d._opacity&&b(e.helper).css("opacity",\r
-d._opacity)}});b.ui.plugin.add("draggable","scroll",{start:function(){var d=b(this).data("draggable");if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML")d.overflowOffset=d.scrollParent.offset()},drag:function(d){var e=b(this).data("draggable"),g=e.options,f=false;if(e.scrollParent[0]!=document&&e.scrollParent[0].tagName!="HTML"){if(!g.axis||g.axis!="x")if(e.overflowOffset.top+e.scrollParent[0].offsetHeight-d.pageY<g.scrollSensitivity)e.scrollParent[0].scrollTop=f=e.scrollParent[0].scrollTop+\r
-g.scrollSpeed;else if(d.pageY-e.overflowOffset.top<g.scrollSensitivity)e.scrollParent[0].scrollTop=f=e.scrollParent[0].scrollTop-g.scrollSpeed;if(!g.axis||g.axis!="y")if(e.overflowOffset.left+e.scrollParent[0].offsetWidth-d.pageX<g.scrollSensitivity)e.scrollParent[0].scrollLeft=f=e.scrollParent[0].scrollLeft+g.scrollSpeed;else if(d.pageX-e.overflowOffset.left<g.scrollSensitivity)e.scrollParent[0].scrollLeft=f=e.scrollParent[0].scrollLeft-g.scrollSpeed}else{if(!g.axis||g.axis!="x")if(d.pageY-b(document).scrollTop()<\r
-g.scrollSensitivity)f=b(document).scrollTop(b(document).scrollTop()-g.scrollSpeed);else if(b(window).height()-(d.pageY-b(document).scrollTop())<g.scrollSensitivity)f=b(document).scrollTop(b(document).scrollTop()+g.scrollSpeed);if(!g.axis||g.axis!="y")if(d.pageX-b(document).scrollLeft()<g.scrollSensitivity)f=b(document).scrollLeft(b(document).scrollLeft()-g.scrollSpeed);else if(b(window).width()-(d.pageX-b(document).scrollLeft())<g.scrollSensitivity)f=b(document).scrollLeft(b(document).scrollLeft()+\r
-g.scrollSpeed)}f!==false&&b.ui.ddmanager&&!g.dropBehaviour&&b.ui.ddmanager.prepareOffsets(e,d)}});b.ui.plugin.add("draggable","snap",{start:function(){var d=b(this).data("draggable"),e=d.options;d.snapElements=[];b(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var g=b(this),f=g.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})})},drag:function(d,e){for(var g=b(this).data("draggable"),\r
-f=g.options,a=f.snapTolerance,c=e.offset.left,h=c+g.helperProportions.width,i=e.offset.top,j=i+g.helperProportions.height,n=g.snapElements.length-1;n>=0;n--){var p=g.snapElements[n].left,l=p+g.snapElements[n].width,k=g.snapElements[n].top,m=k+g.snapElements[n].height;if(p-a<c&&c<l+a&&k-a<i&&i<m+a||p-a<c&&c<l+a&&k-a<j&&j<m+a||p-a<h&&h<l+a&&k-a<i&&i<m+a||p-a<h&&h<l+a&&k-a<j&&j<m+a){if(f.snapMode!="inner"){var o=Math.abs(k-j)<=a,q=Math.abs(m-i)<=a,s=Math.abs(p-h)<=a,r=Math.abs(l-c)<=a;if(o)e.position.top=\r
-g._convertPositionTo("relative",{top:k-g.helperProportions.height,left:0}).top-g.margins.top;if(q)e.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top;if(s)e.position.left=g._convertPositionTo("relative",{top:0,left:p-g.helperProportions.width}).left-g.margins.left;if(r)e.position.left=g._convertPositionTo("relative",{top:0,left:l}).left-g.margins.left}var u=o||q||s||r;if(f.snapMode!="outer"){o=Math.abs(k-i)<=a;q=Math.abs(m-j)<=a;s=Math.abs(p-c)<=a;r=Math.abs(l-h)<=a;if(o)e.position.top=\r
-g._convertPositionTo("relative",{top:k,left:0}).top-g.margins.top;if(q)e.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top;if(s)e.position.left=g._convertPositionTo("relative",{top:0,left:p}).left-g.margins.left;if(r)e.position.left=g._convertPositionTo("relative",{top:0,left:l-g.helperProportions.width}).left-g.margins.left}if(!g.snapElements[n].snapping&&(o||q||s||r||u))g.options.snap.snap&&g.options.snap.snap.call(g.element,d,b.extend(g._uiHash(),\r
-{snapItem:g.snapElements[n].item}));g.snapElements[n].snapping=o||q||s||r||u}else{g.snapElements[n].snapping&&g.options.snap.release&&g.options.snap.release.call(g.element,d,b.extend(g._uiHash(),{snapItem:g.snapElements[n].item}));g.snapElements[n].snapping=false}}}});b.ui.plugin.add("draggable","stack",{start:function(){var d=b(this).data("draggable").options;d=b.makeArray(b(d.stack)).sort(function(g,f){return(parseInt(b(g).css("zIndex"),10)||0)-(parseInt(b(f).css("zIndex"),10)||0)});if(d.length){var e=\r
-parseInt(d[0].style.zIndex)||0;b(d).each(function(g){this.style.zIndex=e+g});this[0].style.zIndex=e+d.length}}});b.ui.plugin.add("draggable","zIndex",{start:function(d,e){d=b(e.helper);e=b(this).data("draggable").options;if(d.css("zIndex"))e._zIndex=d.css("zIndex");d.css("zIndex",e.zIndex)},stop:function(d,e){d=b(this).data("draggable").options;d._zIndex&&b(e.helper).css("zIndex",d._zIndex)}})})(jQuery);\r
-(function(b){b.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var d=this.options,e=d.accept;this.isover=0;this.isout=1;this.accept=b.isFunction(e)?e:function(g){return g.is(e)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};b.ui.ddmanager.droppables[d.scope]=b.ui.ddmanager.droppables[d.scope]||[];b.ui.ddmanager.droppables[d.scope].push(this);\r
-d.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var d=b.ui.ddmanager.droppables[this.options.scope],e=0;e<d.length;e++)d[e]==this&&d.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(d,e){if(d=="accept")this.accept=b.isFunction(e)?e:function(g){return g.is(e)};b.Widget.prototype._setOption.apply(this,arguments)},_activate:function(d){var e=b.ui.ddmanager.current;this.options.activeClass&&\r
-this.element.addClass(this.options.activeClass);e&&this._trigger("activate",d,this.ui(e))},_deactivate:function(d){var e=b.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);e&&this._trigger("deactivate",d,this.ui(e))},_over:function(d){var e=b.ui.ddmanager.current;if(!(!e||(e.currentItem||e.element)[0]==this.element[0]))if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);\r
-this._trigger("over",d,this.ui(e))}},_out:function(d){var e=b.ui.ddmanager.current;if(!(!e||(e.currentItem||e.element)[0]==this.element[0]))if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",d,this.ui(e))}},_drop:function(d,e){var g=e||b.ui.ddmanager.current;if(!g||(g.currentItem||g.element)[0]==this.element[0])return false;var f=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var a=\r
-b.data(this,"droppable");if(a.options.greedy&&!a.options.disabled&&a.options.scope==g.options.scope&&a.accept.call(a.element[0],g.currentItem||g.element)&&b.ui.intersect(g,b.extend(a,{offset:a.element.offset()}),a.options.tolerance)){f=true;return false}});if(f)return false;if(this.accept.call(this.element[0],g.currentItem||g.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",\r
-d,this.ui(g));return this.element}return false},ui:function(d){return{draggable:d.currentItem||d.element,helper:d.helper,position:d.position,offset:d.positionAbs}}});b.extend(b.ui.droppable,{version:"1.8.11"});b.ui.intersect=function(d,e,g){if(!e.offset)return false;var f=(d.positionAbs||d.position.absolute).left,a=f+d.helperProportions.width,c=(d.positionAbs||d.position.absolute).top,h=c+d.helperProportions.height,i=e.offset.left,j=i+e.proportions.width,n=e.offset.top,p=n+e.proportions.height;\r
-switch(g){case "fit":return i<=f&&a<=j&&n<=c&&h<=p;case "intersect":return i<f+d.helperProportions.width/2&&a-d.helperProportions.width/2<j&&n<c+d.helperProportions.height/2&&h-d.helperProportions.height/2<p;case "pointer":return b.ui.isOver((d.positionAbs||d.position.absolute).top+(d.clickOffset||d.offset.click).top,(d.positionAbs||d.position.absolute).left+(d.clickOffset||d.offset.click).left,n,i,e.proportions.height,e.proportions.width);case "touch":return(c>=n&&c<=p||h>=n&&h<=p||c<n&&h>p)&&(f>=\r
-i&&f<=j||a>=i&&a<=j||f<i&&a>j);default:return false}};b.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(d,e){var g=b.ui.ddmanager.droppables[d.options.scope]||[],f=e?e.type:null,a=(d.currentItem||d.element).find(":data(droppable)").andSelf(),c=0;a:for(;c<g.length;c++)if(!(g[c].options.disabled||d&&!g[c].accept.call(g[c].element[0],d.currentItem||d.element))){for(var h=0;h<a.length;h++)if(a[h]==g[c].element[0]){g[c].proportions.height=0;continue a}g[c].visible=g[c].element.css("display")!=\r
-"none";if(g[c].visible){f=="mousedown"&&g[c]._activate.call(g[c],e);g[c].offset=g[c].element.offset();g[c].proportions={width:g[c].element[0].offsetWidth,height:g[c].element[0].offsetHeight}}}},drop:function(d,e){var g=false;b.each(b.ui.ddmanager.droppables[d.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&b.ui.intersect(d,this,this.options.tolerance))g=g||this._drop.call(this,e);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],d.currentItem||\r
-d.element)){this.isout=1;this.isover=0;this._deactivate.call(this,e)}}});return g},drag:function(d,e){d.options.refreshPositions&&b.ui.ddmanager.prepareOffsets(d,e);b.each(b.ui.ddmanager.droppables[d.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var g=b.ui.intersect(d,this,this.options.tolerance);if(g=!g&&this.isover==1?"isout":g&&this.isover==0?"isover":null){var f;if(this.options.greedy){var a=this.element.parents(":data(droppable):eq(0)");if(a.length){f=\r
-b.data(a[0],"droppable");f.greedyChild=g=="isover"?1:0}}if(f&&g=="isover"){f.isover=0;f.isout=1;f._out.call(f,e)}this[g]=1;this[g=="isout"?"isover":"isout"]=0;this[g=="isover"?"_over":"_out"].call(this,e);if(f&&g=="isout"){f.isout=0;f.isover=1;f._over.call(f,e)}}}})}}})(jQuery);\r
-(function(b){b.widget("ui.resizable",b.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var g=this,f=this.options;this.element.addClass("ui-resizable");b.extend(this,{_aspectRatio:!!f.aspectRatio,aspectRatio:f.aspectRatio,originalElement:this.element,\r
-_proportionallyResizeElements:[],_helper:f.helper||f.ghost||f.animate?f.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&b.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(b('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),\r
-top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=\r
-this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=f.handles||(!b(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",\r
-nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var a=this.handles.split(",");this.handles={};for(var c=0;c<a.length;c++){var h=b.trim(a[c]),i=b('<div class="ui-resizable-handle '+("ui-resizable-"+h)+'"></div>');/sw|se|ne|nw/.test(h)&&i.css({zIndex:++f.zIndex});"se"==h&&i.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[h]=".ui-resizable-"+h;this.element.append(i)}}this._renderAxis=function(j){j=j||this.element;for(var n in this.handles){if(this.handles[n].constructor==\r
-String)this.handles[n]=b(this.handles[n],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var p=b(this.handles[n],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(n)?p.outerHeight():p.outerWidth();p=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");j.css(p,l);this._proportionallyResize()}b(this.handles[n])}};this._renderAxis(this.element);this._handles=b(".ui-resizable-handle",this.element).disableSelection();\r
-this._handles.mouseover(function(){if(!g.resizing){if(this.className)var j=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);g.axis=j&&j[1]?j[1]:"se"}});if(f.autoHide){this._handles.hide();b(this.element).addClass("ui-resizable-autohide").hover(function(){b(this).removeClass("ui-resizable-autohide");g._handles.show()},function(){if(!g.resizing){b(this).addClass("ui-resizable-autohide");g._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var g=function(a){b(a).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};\r
-if(this.elementIsWrapper){g(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);g(this.originalElement);return this},_mouseCapture:function(g){var f=false;for(var a in this.handles)if(b(this.handles[a])[0]==g.target)f=true;return!this.options.disabled&&f},_mouseStart:function(g){var f=this.options,a=this.element.position(),\r
-c=this.element;this.resizing=true;this.documentScroll={top:b(document).scrollTop(),left:b(document).scrollLeft()};if(c.is(".ui-draggable")||/absolute/.test(c.css("position")))c.css({position:"absolute",top:a.top,left:a.left});b.browser.opera&&/relative/.test(c.css("position"))&&c.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();a=d(this.helper.css("left"));var h=d(this.helper.css("top"));if(f.containment){a+=b(f.containment).scrollLeft()||0;h+=b(f.containment).scrollTop()||0}this.offset=\r
-this.helper.offset();this.position={left:a,top:h};this.size=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalSize=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalPosition={left:a,top:h};this.sizeDiff={width:c.outerWidth()-c.width(),height:c.outerHeight()-c.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=typeof f.aspectRatio=="number"?f.aspectRatio:\r
-this.originalSize.width/this.originalSize.height||1;f=b(".ui-resizable-"+this.axis).css("cursor");b("body").css("cursor",f=="auto"?this.axis+"-resize":f);c.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(g){var f=this.helper,a=this.originalMousePosition,c=this._change[this.axis];if(!c)return false;a=c.apply(this,[g,g.pageX-a.left||0,g.pageY-a.top||0]);if(this._aspectRatio||g.shiftKey)a=this._updateRatio(a,g);a=this._respectSize(a,g);this._propagate("resize",\r
-g);f.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(a);this._trigger("resize",g,this.ui());return false},_mouseStop:function(g){this.resizing=false;var f=this.options,a=this;if(this._helper){var c=this._proportionallyResizeElements,h=c.length&&/textarea/i.test(c[0].nodeName);c=h&&b.ui.hasScroll(c[0],"left")?0:a.sizeDiff.height;\r
-h=h?0:a.sizeDiff.width;h={width:a.helper.width()-h,height:a.helper.height()-c};c=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var i=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;f.animate||this.element.css(b.extend(h,{top:i,left:c}));a.helper.height(a.size.height);a.helper.width(a.size.width);this._helper&&!f.animate&&this._proportionallyResize()}b("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");\r
-this._propagate("stop",g);this._helper&&this.helper.remove();return false},_updateCache:function(g){this.offset=this.helper.offset();if(e(g.left))this.position.left=g.left;if(e(g.top))this.position.top=g.top;if(e(g.height))this.size.height=g.height;if(e(g.width))this.size.width=g.width},_updateRatio:function(g){var f=this.position,a=this.size,c=this.axis;if(g.height)g.width=a.height*this.aspectRatio;else if(g.width)g.height=a.width/this.aspectRatio;if(c=="sw"){g.left=f.left+(a.width-g.width);g.top=\r
-null}if(c=="nw"){g.top=f.top+(a.height-g.height);g.left=f.left+(a.width-g.width)}return g},_respectSize:function(g){var f=this.options,a=this.axis,c=e(g.width)&&f.maxWidth&&f.maxWidth<g.width,h=e(g.height)&&f.maxHeight&&f.maxHeight<g.height,i=e(g.width)&&f.minWidth&&f.minWidth>g.width,j=e(g.height)&&f.minHeight&&f.minHeight>g.height;if(i)g.width=f.minWidth;if(j)g.height=f.minHeight;if(c)g.width=f.maxWidth;if(h)g.height=f.maxHeight;var n=this.originalPosition.left+this.originalSize.width,p=this.position.top+\r
-this.size.height,l=/sw|nw|w/.test(a);a=/nw|ne|n/.test(a);if(i&&l)g.left=n-f.minWidth;if(c&&l)g.left=n-f.maxWidth;if(j&&a)g.top=p-f.minHeight;if(h&&a)g.top=p-f.maxHeight;if((f=!g.width&&!g.height)&&!g.left&&g.top)g.top=null;else if(f&&!g.top&&g.left)g.left=null;return g},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var g=this.helper||this.element,f=0;f<this._proportionallyResizeElements.length;f++){var a=this._proportionallyResizeElements[f];if(!this.borderDif){var c=\r
-[a.css("borderTopWidth"),a.css("borderRightWidth"),a.css("borderBottomWidth"),a.css("borderLeftWidth")],h=[a.css("paddingTop"),a.css("paddingRight"),a.css("paddingBottom"),a.css("paddingLeft")];this.borderDif=b.map(c,function(i,j){i=parseInt(i,10)||0;j=parseInt(h[j],10)||0;return i+j})}b.browser.msie&&(b(g).is(":hidden")||b(g).parents(":hidden").length)||a.css({height:g.height()-this.borderDif[0]-this.borderDif[2]||0,width:g.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var g=\r
-this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||b('<div style="overflow:hidden;"></div>');var f=b.browser.msie&&b.browser.version<7,a=f?1:0;f=f?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-a+"px",top:this.elementOffset.top-a+"px",zIndex:++g.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(g,\r
-f){return{width:this.originalSize.width+f}},w:function(g,f){return{left:this.originalPosition.left+f,width:this.originalSize.width-f}},n:function(g,f,a){return{top:this.originalPosition.top+a,height:this.originalSize.height-a}},s:function(g,f,a){return{height:this.originalSize.height+a}},se:function(g,f,a){return b.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,a]))},sw:function(g,f,a){return b.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,\r
-a]))},ne:function(g,f,a){return b.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,a]))},nw:function(g,f,a){return b.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,a]))}},_propagate:function(g,f){b.ui.plugin.call(this,g,[f,this.ui()]);g!="resize"&&this._trigger(g,f,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,\r
-originalPosition:this.originalPosition}}});b.extend(b.ui.resizable,{version:"1.8.11"});b.ui.plugin.add("resizable","alsoResize",{start:function(){var g=b(this).data("resizable").options,f=function(a){b(a).each(function(){var c=b(this);c.data("resizable-alsoresize",{width:parseInt(c.width(),10),height:parseInt(c.height(),10),left:parseInt(c.css("left"),10),top:parseInt(c.css("top"),10),position:c.css("position")})})};if(typeof g.alsoResize=="object"&&!g.alsoResize.parentNode)if(g.alsoResize.length){g.alsoResize=\r
-g.alsoResize[0];f(g.alsoResize)}else b.each(g.alsoResize,function(a){f(a)});else f(g.alsoResize)},resize:function(g,f){var a=b(this).data("resizable");g=a.options;var c=a.originalSize,h=a.originalPosition,i={height:a.size.height-c.height||0,width:a.size.width-c.width||0,top:a.position.top-h.top||0,left:a.position.left-h.left||0},j=function(n,p){b(n).each(function(){var l=b(this),k=b(this).data("resizable-alsoresize"),m={},o=p&&p.length?p:l.parents(f.originalElement[0]).length?["width","height"]:["width",\r
-"height","top","left"];b.each(o,function(q,s){if((q=(k[s]||0)+(i[s]||0))&&q>=0)m[s]=q||null});if(b.browser.opera&&/relative/.test(l.css("position"))){a._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(m)})};typeof g.alsoResize=="object"&&!g.alsoResize.nodeType?b.each(g.alsoResize,function(n,p){j(n,p)}):j(g.alsoResize)},stop:function(){var g=b(this).data("resizable"),f=g.options,a=function(c){b(c).each(function(){var h=b(this);h.css({position:h.data("resizable-alsoresize").position})})};\r
-if(g._revertToRelativePosition){g._revertToRelativePosition=false;typeof f.alsoResize=="object"&&!f.alsoResize.nodeType?b.each(f.alsoResize,function(c){a(c)}):a(f.alsoResize)}b(this).removeData("resizable-alsoresize")}});b.ui.plugin.add("resizable","animate",{stop:function(g){var f=b(this).data("resizable"),a=f.options,c=f._proportionallyResizeElements,h=c.length&&/textarea/i.test(c[0].nodeName),i=h&&b.ui.hasScroll(c[0],"left")?0:f.sizeDiff.height;h={width:f.size.width-(h?0:f.sizeDiff.width),height:f.size.height-\r
-i};i=parseInt(f.element.css("left"),10)+(f.position.left-f.originalPosition.left)||null;var j=parseInt(f.element.css("top"),10)+(f.position.top-f.originalPosition.top)||null;f.element.animate(b.extend(h,j&&i?{top:j,left:i}:{}),{duration:a.animateDuration,easing:a.animateEasing,step:function(){var n={width:parseInt(f.element.css("width"),10),height:parseInt(f.element.css("height"),10),top:parseInt(f.element.css("top"),10),left:parseInt(f.element.css("left"),10)};c&&c.length&&b(c[0]).css({width:n.width,\r
-height:n.height});f._updateCache(n);f._propagate("resize",g)}})}});b.ui.plugin.add("resizable","containment",{start:function(){var g=b(this).data("resizable"),f=g.element,a=g.options.containment;if(f=a instanceof b?a.get(0):/parent/.test(a)?f.parent().get(0):a){g.containerElement=b(f);if(/document/.test(a)||a==document){g.containerOffset={left:0,top:0};g.containerPosition={left:0,top:0};g.parentData={element:b(document),left:0,top:0,width:b(document).width(),height:b(document).height()||document.body.parentNode.scrollHeight}}else{var c=\r
-b(f),h=[];b(["Top","Right","Left","Bottom"]).each(function(n,p){h[n]=d(c.css("padding"+p))});g.containerOffset=c.offset();g.containerPosition=c.position();g.containerSize={height:c.innerHeight()-h[3],width:c.innerWidth()-h[1]};a=g.containerOffset;var i=g.containerSize.height,j=g.containerSize.width;j=b.ui.hasScroll(f,"left")?f.scrollWidth:j;i=b.ui.hasScroll(f)?f.scrollHeight:i;g.parentData={element:f,left:a.left,top:a.top,width:j,height:i}}}},resize:function(g){var f=b(this).data("resizable"),a=f.options,\r
-c=f.containerOffset,h=f.position;g=f._aspectRatio||g.shiftKey;var i={top:0,left:0},j=f.containerElement;if(j[0]!=document&&/static/.test(j.css("position")))i=c;if(h.left<(f._helper?c.left:0)){f.size.width+=f._helper?f.position.left-c.left:f.position.left-i.left;if(g)f.size.height=f.size.width/a.aspectRatio;f.position.left=a.helper?c.left:0}if(h.top<(f._helper?c.top:0)){f.size.height+=f._helper?f.position.top-c.top:f.position.top;if(g)f.size.width=f.size.height*a.aspectRatio;f.position.top=f._helper?\r
-c.top:0}f.offset.left=f.parentData.left+f.position.left;f.offset.top=f.parentData.top+f.position.top;a=Math.abs((f._helper?f.offset.left-i.left:f.offset.left-i.left)+f.sizeDiff.width);c=Math.abs((f._helper?f.offset.top-i.top:f.offset.top-c.top)+f.sizeDiff.height);h=f.containerElement.get(0)==f.element.parent().get(0);i=/relative|absolute/.test(f.containerElement.css("position"));if(h&&i)a-=f.parentData.left;if(a+f.size.width>=f.parentData.width){f.size.width=f.parentData.width-a;if(g)f.size.height=\r
-f.size.width/f.aspectRatio}if(c+f.size.height>=f.parentData.height){f.size.height=f.parentData.height-c;if(g)f.size.width=f.size.height*f.aspectRatio}},stop:function(){var g=b(this).data("resizable"),f=g.options,a=g.containerOffset,c=g.containerPosition,h=g.containerElement,i=b(g.helper),j=i.offset(),n=i.outerWidth()-g.sizeDiff.width;i=i.outerHeight()-g.sizeDiff.height;g._helper&&!f.animate&&/relative/.test(h.css("position"))&&b(this).css({left:j.left-c.left-a.left,width:n,height:i});g._helper&&!f.animate&&\r
-/static/.test(h.css("position"))&&b(this).css({left:j.left-c.left-a.left,width:n,height:i})}});b.ui.plugin.add("resizable","ghost",{start:function(){var g=b(this).data("resizable"),f=g.options,a=g.size;g.ghost=g.originalElement.clone();g.ghost.css({opacity:0.25,display:"block",position:"relative",height:a.height,width:a.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof f.ghost=="string"?f.ghost:"");g.ghost.appendTo(g.helper)},resize:function(){var g=b(this).data("resizable");\r
-g.ghost&&g.ghost.css({position:"relative",height:g.size.height,width:g.size.width})},stop:function(){var g=b(this).data("resizable");g.ghost&&g.helper&&g.helper.get(0).removeChild(g.ghost.get(0))}});b.ui.plugin.add("resizable","grid",{resize:function(){var g=b(this).data("resizable"),f=g.options,a=g.size,c=g.originalSize,h=g.originalPosition,i=g.axis;f.grid=typeof f.grid=="number"?[f.grid,f.grid]:f.grid;var j=Math.round((a.width-c.width)/(f.grid[0]||1))*(f.grid[0]||1);f=Math.round((a.height-c.height)/\r
-(f.grid[1]||1))*(f.grid[1]||1);if(/^(se|s|e)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f}else if(/^(ne)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f;g.position.top=h.top-f}else{if(/^(sw)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f}else{g.size.width=c.width+j;g.size.height=c.height+f;g.position.top=h.top-f}g.position.left=h.left-j}}});var d=function(g){return parseInt(g,10)||0},e=function(g){return!isNaN(parseInt(g,10))}})(jQuery);\r
-(function(b){b.widget("ui.selectable",b.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var d=this;this.element.addClass("ui-selectable");this.dragged=false;var e;this.refresh=function(){e=b(d.options.filter,d.element[0]);e.each(function(){var g=b(this),f=g.offset();b.data(this,"selectable-item",{element:this,$element:g,left:f.left,top:f.top,right:f.left+g.outerWidth(),bottom:f.top+g.outerHeight(),startselected:false,selected:g.hasClass("ui-selected"),\r
-selecting:g.hasClass("ui-selecting"),unselecting:g.hasClass("ui-unselecting")})})};this.refresh();this.selectees=e.addClass("ui-selectee");this._mouseInit();this.helper=b("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(d){var e=this;this.opos=[d.pageX,\r
-d.pageY];if(!this.options.disabled){var g=this.options;this.selectees=b(g.filter,this.element[0]);this._trigger("start",d);b(g.appendTo).append(this.helper);this.helper.css({left:d.clientX,top:d.clientY,width:0,height:0});g.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var f=b.data(this,"selectable-item");f.startselected=true;if(!d.metaKey){f.$element.removeClass("ui-selected");f.selected=false;f.$element.addClass("ui-unselecting");f.unselecting=true;e._trigger("unselecting",\r
-d,{unselecting:f.element})}});b(d.target).parents().andSelf().each(function(){var f=b.data(this,"selectable-item");if(f){var a=!d.metaKey||!f.$element.hasClass("ui-selected");f.$element.removeClass(a?"ui-unselecting":"ui-selected").addClass(a?"ui-selecting":"ui-unselecting");f.unselecting=!a;f.selecting=a;(f.selected=a)?e._trigger("selecting",d,{selecting:f.element}):e._trigger("unselecting",d,{unselecting:f.element});return false}})}},_mouseDrag:function(d){var e=this;this.dragged=true;if(!this.options.disabled){var g=\r
-this.options,f=this.opos[0],a=this.opos[1],c=d.pageX,h=d.pageY;if(f>c){var i=c;c=f;f=i}if(a>h){i=h;h=a;a=i}this.helper.css({left:f,top:a,width:c-f,height:h-a});this.selectees.each(function(){var j=b.data(this,"selectable-item");if(!(!j||j.element==e.element[0])){var n=false;if(g.tolerance=="touch")n=!(j.left>c||j.right<f||j.top>h||j.bottom<a);else if(g.tolerance=="fit")n=j.left>f&&j.right<c&&j.top>a&&j.bottom<h;if(n){if(j.selected){j.$element.removeClass("ui-selected");j.selected=false}if(j.unselecting){j.$element.removeClass("ui-unselecting");\r
-j.unselecting=false}if(!j.selecting){j.$element.addClass("ui-selecting");j.selecting=true;e._trigger("selecting",d,{selecting:j.element})}}else{if(j.selecting)if(d.metaKey&&j.startselected){j.$element.removeClass("ui-selecting");j.selecting=false;j.$element.addClass("ui-selected");j.selected=true}else{j.$element.removeClass("ui-selecting");j.selecting=false;if(j.startselected){j.$element.addClass("ui-unselecting");j.unselecting=true}e._trigger("unselecting",d,{unselecting:j.element})}if(j.selected)if(!d.metaKey&&\r
-!j.startselected){j.$element.removeClass("ui-selected");j.selected=false;j.$element.addClass("ui-unselecting");j.unselecting=true;e._trigger("unselecting",d,{unselecting:j.element})}}}});return false}},_mouseStop:function(d){var e=this;this.dragged=false;b(".ui-unselecting",this.element[0]).each(function(){var g=b.data(this,"selectable-item");g.$element.removeClass("ui-unselecting");g.unselecting=false;g.startselected=false;e._trigger("unselected",d,{unselected:g.element})});b(".ui-selecting",this.element[0]).each(function(){var g=\r
-b.data(this,"selectable-item");g.$element.removeClass("ui-selecting").addClass("ui-selected");g.selecting=false;g.selected=true;g.startselected=true;e._trigger("selected",d,{selected:g.element})});this._trigger("stop",d);this.helper.remove();return false}});b.extend(b.ui.selectable,{version:"1.8.11"})})(jQuery);\r
-(function(b){b.widget("ui.sortable",b.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");\r
-this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var d=this.items.length-1;d>=0;d--)this.items[d].item.removeData("sortable-item");return this},_setOption:function(d,e){if(d==="disabled"){this.options[d]=\r
-e;this.widget()[e?"addClass":"removeClass"]("ui-sortable-disabled")}else b.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(d,e){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(d);var g=null,f=this;b(d.target).parents().each(function(){if(b.data(this,"sortable-item")==f){g=b(this);return false}});if(b.data(d.target,"sortable-item")==f)g=b(d.target);if(!g)return false;if(this.options.handle&&!e){var a=false;\r
-b(this.options.handle,g).find("*").andSelf().each(function(){if(this==d.target)a=true});if(!a)return false}this.currentItem=g;this._removeCurrentsFromItems();return true},_mouseStart:function(d,e,g){e=this.options;var f=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(d);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-\r
-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};\r
-this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();e.containment&&this._setContainment();if(e.cursor){if(b("body").css("cursor"))this._storedCursor=b("body").css("cursor");b("body").css("cursor",e.cursor)}if(e.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",e.opacity)}if(e.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",e.zIndex)}if(this.scrollParent[0]!=\r
-document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",d,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!g)for(g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",d,f._uiHash(this));if(b.ui.ddmanager)b.ui.ddmanager.current=this;b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,d);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(d);\r
-return true},_mouseDrag:function(d){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var e=this.options,g=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-d.pageY<e.scrollSensitivity)this.scrollParent[0].scrollTop=g=this.scrollParent[0].scrollTop+e.scrollSpeed;else if(d.pageY-this.overflowOffset.top<\r
-e.scrollSensitivity)this.scrollParent[0].scrollTop=g=this.scrollParent[0].scrollTop-e.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-d.pageX<e.scrollSensitivity)this.scrollParent[0].scrollLeft=g=this.scrollParent[0].scrollLeft+e.scrollSpeed;else if(d.pageX-this.overflowOffset.left<e.scrollSensitivity)this.scrollParent[0].scrollLeft=g=this.scrollParent[0].scrollLeft-e.scrollSpeed}else{if(d.pageY-b(document).scrollTop()<e.scrollSensitivity)g=b(document).scrollTop(b(document).scrollTop()-\r
-e.scrollSpeed);else if(b(window).height()-(d.pageY-b(document).scrollTop())<e.scrollSensitivity)g=b(document).scrollTop(b(document).scrollTop()+e.scrollSpeed);if(d.pageX-b(document).scrollLeft()<e.scrollSensitivity)g=b(document).scrollLeft(b(document).scrollLeft()-e.scrollSpeed);else if(b(window).width()-(d.pageX-b(document).scrollLeft())<e.scrollSensitivity)g=b(document).scrollLeft(b(document).scrollLeft()+e.scrollSpeed)}g!==false&&b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,\r
-d)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(e=this.items.length-1;e>=0;e--){g=this.items[e];var f=g.item[0],a=this._intersectsWithPointer(g);if(a)if(f!=this.currentItem[0]&&this.placeholder[a==1?"next":"prev"]()[0]!=f&&!b.ui.contains(this.placeholder[0],f)&&(this.options.type=="semi-dynamic"?!b.ui.contains(this.element[0],\r
-f):true)){this.direction=a==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(g))this._rearrange(d,g);else break;this._trigger("change",d,this._uiHash());break}}this._contactContainers(d);b.ui.ddmanager&&b.ui.ddmanager.drag(this,d);this._trigger("sort",d,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(d,e){if(d){b.ui.ddmanager&&!this.options.dropBehaviour&&b.ui.ddmanager.drop(this,d);if(this.options.revert){var g=this;e=g.placeholder.offset();\r
-g.reverting=true;b(this.helper).animate({left:e.left-this.offset.parent.left-g.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-g.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){g._clear(d)})}else this._clear(d,e);return false}},cancel:function(){var d=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):\r
-this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--){this.containers[e]._trigger("deactivate",null,d._uiHash(this));if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",null,d._uiHash(this));this.containers[e].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();b.extend(this,{helper:null,\r
-dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?b(this.domPosition.prev).after(this.currentItem):b(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(d){var e=this._getItemsAsjQuery(d&&d.connected),g=[];d=d||{};b(e).each(function(){var f=(b(d.item||this).attr(d.attribute||"id")||"").match(d.expression||/(.+)[-=_](.+)/);if(f)g.push((d.key||f[1]+"[]")+"="+(d.key&&d.expression?f[1]:f[2]))});!g.length&&d.key&&g.push(d.key+"=");return g.join("&")},\r
-toArray:function(d){var e=this._getItemsAsjQuery(d&&d.connected),g=[];d=d||{};e.each(function(){g.push(b(d.item||this).attr(d.attribute||"id")||"")});return g},_intersectsWith:function(d){var e=this.positionAbs.left,g=e+this.helperProportions.width,f=this.positionAbs.top,a=f+this.helperProportions.height,c=d.left,h=c+d.width,i=d.top,j=i+d.height,n=this.offset.click.top,p=this.offset.click.left;n=f+n>i&&f+n<j&&e+p>c&&e+p<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||\r
-this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>d[this.floating?"width":"height"]?n:c<e+this.helperProportions.width/2&&g-this.helperProportions.width/2<h&&i<f+this.helperProportions.height/2&&a-this.helperProportions.height/2<j},_intersectsWithPointer:function(d){var e=b.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top,d.height);d=b.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left,d.width);e=e&&d;d=this._getDragVerticalDirection();\r
-var g=this._getDragHorizontalDirection();if(!e)return false;return this.floating?g&&g=="right"||d=="down"?2:1:d&&(d=="down"?2:1)},_intersectsWithSides:function(d){var e=b.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top+d.height/2,d.height);d=b.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left+d.width/2,d.width);var g=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:g&&(g=="down"&&e||g=="up"&&!e)},\r
-_getDragVerticalDirection:function(){var d=this.positionAbs.top-this.lastPositionAbs.top;return d!=0&&(d>0?"down":"up")},_getDragHorizontalDirection:function(){var d=this.positionAbs.left-this.lastPositionAbs.left;return d!=0&&(d>0?"right":"left")},refresh:function(d){this._refreshItems(d);this.refreshPositions();return this},_connectWith:function(){var d=this.options;return d.connectWith.constructor==String?[d.connectWith]:d.connectWith},_getItemsAsjQuery:function(d){var e=[],g=[],f=this._connectWith();\r
-if(f&&d)for(d=f.length-1;d>=0;d--)for(var a=b(f[d]),c=a.length-1;c>=0;c--){var h=b.data(a[c],"sortable");if(h&&h!=this&&!h.options.disabled)g.push([b.isFunction(h.options.items)?h.options.items.call(h.element):b(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}g.push([b.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):b(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),\r
-this]);for(d=g.length-1;d>=0;d--)g[d][0].each(function(){e.push(this)});return b(e)},_removeCurrentsFromItems:function(){for(var d=this.currentItem.find(":data(sortable-item)"),e=0;e<this.items.length;e++)for(var g=0;g<d.length;g++)d[g]==this.items[e].item[0]&&this.items.splice(e,1)},_refreshItems:function(d){this.items=[];this.containers=[this];var e=this.items,g=[[b.isFunction(this.options.items)?this.options.items.call(this.element[0],d,{item:this.currentItem}):b(this.options.items,this.element),\r
-this]],f=this._connectWith();if(f)for(var a=f.length-1;a>=0;a--)for(var c=b(f[a]),h=c.length-1;h>=0;h--){var i=b.data(c[h],"sortable");if(i&&i!=this&&!i.options.disabled){g.push([b.isFunction(i.options.items)?i.options.items.call(i.element[0],d,{item:this.currentItem}):b(i.options.items,i.element),i]);this.containers.push(i)}}for(a=g.length-1;a>=0;a--){d=g[a][1];f=g[a][0];h=0;for(c=f.length;h<c;h++){i=b(f[h]);i.data("sortable-item",d);e.push({item:i,instance:d,width:0,height:0,left:0,top:0})}}},refreshPositions:function(d){if(this.offsetParent&&\r
-this.helper)this.offset.parent=this._getParentOffset();for(var e=this.items.length-1;e>=0;e--){var g=this.items[e],f=this.options.toleranceElement?b(this.options.toleranceElement,g.item):g.item;if(!d){g.width=f.outerWidth();g.height=f.outerHeight()}f=f.offset();g.left=f.left;g.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(e=this.containers.length-1;e>=0;e--){f=this.containers[e].element.offset();this.containers[e].containerCache.left=\r
-f.left;this.containers[e].containerCache.top=f.top;this.containers[e].containerCache.width=this.containers[e].element.outerWidth();this.containers[e].containerCache.height=this.containers[e].element.outerHeight()}return this},_createPlaceholder:function(d){var e=d||this,g=e.options;if(!g.placeholder||g.placeholder.constructor==String){var f=g.placeholder;g.placeholder={element:function(){var a=b(document.createElement(e.currentItem[0].nodeName)).addClass(f||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];\r
-if(!f)a.style.visibility="hidden";return a},update:function(a,c){if(!(f&&!g.forcePlaceholderSize)){c.height()||c.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10));c.width()||c.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10))}}}}e.placeholder=b(g.placeholder.element.call(e.element,e.currentItem));e.currentItem.after(e.placeholder);\r
-g.placeholder.update(e,e.placeholder)},_contactContainers:function(d){for(var e=null,g=null,f=this.containers.length-1;f>=0;f--)if(!b.ui.contains(this.currentItem[0],this.containers[f].element[0]))if(this._intersectsWith(this.containers[f].containerCache)){if(!(e&&b.ui.contains(this.containers[f].element[0],e.element[0]))){e=this.containers[f];g=f}}else if(this.containers[f].containerCache.over){this.containers[f]._trigger("out",d,this._uiHash(this));this.containers[f].containerCache.over=0}if(e)if(this.containers.length===\r
-1){this.containers[g]._trigger("over",d,this._uiHash(this));this.containers[g].containerCache.over=1}else if(this.currentContainer!=this.containers[g]){e=1E4;f=null;for(var a=this.positionAbs[this.containers[g].floating?"left":"top"],c=this.items.length-1;c>=0;c--)if(b.ui.contains(this.containers[g].element[0],this.items[c].item[0])){var h=this.items[c][this.containers[g].floating?"left":"top"];if(Math.abs(h-a)<e){e=Math.abs(h-a);f=this.items[c]}}if(f||this.options.dropOnEmpty){this.currentContainer=\r
-this.containers[g];f?this._rearrange(d,f,null,true):this._rearrange(d,null,this.containers[g].element,true);this._trigger("change",d,this._uiHash());this.containers[g]._trigger("change",d,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[g]._trigger("over",d,this._uiHash(this));this.containers[g].containerCache.over=1}}},_createHelper:function(d){var e=this.options;d=b.isFunction(e.helper)?b(e.helper.apply(this.element[0],[d,this.currentItem])):\r
-e.helper=="clone"?this.currentItem.clone():this.currentItem;d.parents("body").length||b(e.appendTo!="parent"?e.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]);if(d[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(d[0].style.width==""||e.forceHelperSize)d.width(this.currentItem.width());if(d[0].style.height==\r
-""||e.forceHelperSize)d.height(this.currentItem.height());return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(b.isArray(d))d={left:+d[0],top:+d[1]||0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=\r
-this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),\r
-10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.currentItem.position();return{top:d.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions=\r
-{width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,b(d.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b(d.containment=="document"?document:window).height()||\r
-document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)){var e=b(d.containment)[0];d=b(d.containment).offset();var g=b(e).css("overflow")!="hidden";this.containment=[d.left+(parseInt(b(e).css("borderLeftWidth"),10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0)-this.margins.top,d.left+(g?Math.max(e.scrollWidth,\r
-e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(g?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(d,e){if(!e)e=this.position;d=d=="absolute"?1:-1;var g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=\r
-document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);return{top:e.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop())*d),left:e.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():\r
-f?0:g.scrollLeft())*d)}},_generatePosition:function(d){var e=this.options,g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var a=d.pageX,c=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-\r
-this.offset.click.left<this.containment[0])a=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])c=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])a=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])c=this.containment[3]+this.offset.click.top}if(e.grid){c=this.originalPageY+Math.round((c-this.originalPageY)/e.grid[1])*e.grid[1];c=this.containment?!(c-this.offset.click.top<\r
-this.containment[1]||c-this.offset.click.top>this.containment[3])?c:!(c-this.offset.click.top<this.containment[1])?c-e.grid[1]:c+e.grid[1]:c;a=this.originalPageX+Math.round((a-this.originalPageX)/e.grid[0])*e.grid[0];a=this.containment?!(a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2])?a:!(a-this.offset.click.left<this.containment[0])?a-e.grid[0]:a+e.grid[0]:a}}return{top:c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&\r
-this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:g.scrollLeft())}},_rearrange:function(d,e,g,f){g?g[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?e.item[0]:e.item[0].nextSibling);this.counter=\r
-this.counter?++this.counter:1;var a=this,c=this.counter;window.setTimeout(function(){c==a.counter&&a.refreshPositions(!f)},0)},_clear:function(d,e){this.reverting=false;var g=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();\r
-this.fromOutside&&!e&&g.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!e)g.push(function(a){this._trigger("update",a,this._uiHash())});if(!b.ui.contains(this.element[0],this.currentItem[0])){e||g.push(function(a){this._trigger("remove",a,this._uiHash())});for(f=this.containers.length-1;f>=0;f--)if(b.ui.contains(this.containers[f].element[0],\r
-this.currentItem[0])&&!e){g.push(function(a){return function(c){a._trigger("receive",c,this._uiHash(this))}}.call(this,this.containers[f]));g.push(function(a){return function(c){a._trigger("update",c,this._uiHash(this))}}.call(this,this.containers[f]))}}for(f=this.containers.length-1;f>=0;f--){e||g.push(function(a){return function(c){a._trigger("deactivate",c,this._uiHash(this))}}.call(this,this.containers[f]));if(this.containers[f].containerCache.over){g.push(function(a){return function(c){a._trigger("out",\r
-c,this._uiHash(this))}}.call(this,this.containers[f]));this.containers[f].containerCache.over=0}}this._storedCursor&&b("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(f=0;f<g.length;f++)g[f].call(this,d);this._trigger("stop",d,this._uiHash())}return false}e||\r
-this._trigger("beforeStop",d,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!e){for(f=0;f<g.length;f++)g[f].call(this,d);this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){b.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(d){var e=d||this;return{helper:e.helper,placeholder:e.placeholder||b([]),position:e.position,\r
-originalPosition:e.originalPosition,offset:e.positionAbs,item:e.currentItem,sender:d?d.element:null}}});b.extend(b.ui.sortable,{version:"1.8.11"})})(jQuery);\r
-jQuery.effects||function(b,d){function e(l){var k;if(l&&l.constructor==Array&&l.length==3)return l;if(k=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(l))return[parseInt(k[1],10),parseInt(k[2],10),parseInt(k[3],10)];if(k=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(l))return[parseFloat(k[1])*2.55,parseFloat(k[2])*2.55,parseFloat(k[3])*2.55];if(k=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(l))return[parseInt(k[1],\r
-16),parseInt(k[2],16),parseInt(k[3],16)];if(k=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(l))return[parseInt(k[1]+k[1],16),parseInt(k[2]+k[2],16),parseInt(k[3]+k[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(l))return j.transparent;return j[b.trim(l).toLowerCase()]}function g(l,k){var m;do{m=b.curCSS(l,k);if(m!=""&&m!="transparent"||b.nodeName(l,"body"))break;k="backgroundColor"}while(l=l.parentNode);return e(m)}function f(){var l=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,\r
-k={},m,o;if(l&&l.length&&l[0]&&l[l[0]])for(var q=l.length;q--;){m=l[q];if(typeof l[m]=="string"){o=m.replace(/\-(\w)/g,function(s,r){return r.toUpperCase()});k[o]=l[m]}}else for(m in l)if(typeof l[m]==="string")k[m]=l[m];return k}function a(l){var k,m;for(k in l){m=l[k];if(m==null||b.isFunction(m)||k in p||/scrollbar/.test(k)||!/color/i.test(k)&&isNaN(parseFloat(m)))delete l[k]}return l}function c(l,k){var m={_:0},o;for(o in k)if(l[o]!=k[o])m[o]=k[o];return m}function h(l,k,m,o){if(typeof l=="object"){o=\r
-k;m=null;k=l;l=k.effect}if(b.isFunction(k)){o=k;m=null;k={}}if(typeof k=="number"||b.fx.speeds[k]){o=m;m=k;k={}}if(b.isFunction(m)){o=m;m=null}k=k||{};m=m||k.duration;m=b.fx.off?0:typeof m=="number"?m:m in b.fx.speeds?b.fx.speeds[m]:b.fx.speeds._default;o=o||k.complete;return[l,k,m,o]}function i(l){if(!l||typeof l==="number"||b.fx.speeds[l])return true;if(typeof l==="string"&&!b.effects[l])return true;return false}b.effects={};b.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",\r
-"borderTopColor","borderColor","color","outlineColor"],function(l,k){b.fx.step[k]=function(m){if(!m.colorInit){m.start=g(m.elem,k);m.end=e(m.end);m.colorInit=true}m.elem.style[k]="rgb("+Math.max(Math.min(parseInt(m.pos*(m.end[0]-m.start[0])+m.start[0],10),255),0)+","+Math.max(Math.min(parseInt(m.pos*(m.end[1]-m.start[1])+m.start[1],10),255),0)+","+Math.max(Math.min(parseInt(m.pos*(m.end[2]-m.start[2])+m.start[2],10),255),0)+")"}});var j={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,\r
-0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,\r
-211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},n=["add","remove","toggle"],p={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};b.effects.animateClass=function(l,k,m,\r
-o){if(b.isFunction(m)){o=m;m=null}return this.queue("fx",function(){var q=b(this),s=q.attr("style")||" ",r=a(f.call(this)),u,v=q.attr("className");b.each(n,function(w,y){l[y]&&q[y+"Class"](l[y])});u=a(f.call(this));q.attr("className",v);q.animate(c(r,u),k,m,function(){b.each(n,function(w,y){l[y]&&q[y+"Class"](l[y])});if(typeof q.attr("style")=="object"){q.attr("style").cssText="";q.attr("style").cssText=s}else q.attr("style",s);o&&o.apply(this,arguments)});r=b.queue(this);u=r.splice(r.length-1,1)[0];\r
-r.splice(1,0,u);b.dequeue(this)})};b.fn.extend({_addClass:b.fn.addClass,addClass:function(l,k,m,o){return k?b.effects.animateClass.apply(this,[{add:l},k,m,o]):this._addClass(l)},_removeClass:b.fn.removeClass,removeClass:function(l,k,m,o){return k?b.effects.animateClass.apply(this,[{remove:l},k,m,o]):this._removeClass(l)},_toggleClass:b.fn.toggleClass,toggleClass:function(l,k,m,o,q){return typeof k=="boolean"||k===d?m?b.effects.animateClass.apply(this,[k?{add:l}:{remove:l},m,o,q]):this._toggleClass(l,\r
-k):b.effects.animateClass.apply(this,[{toggle:l},k,m,o])},switchClass:function(l,k,m,o,q){return b.effects.animateClass.apply(this,[{add:k,remove:l},m,o,q])}});b.extend(b.effects,{version:"1.8.11",save:function(l,k){for(var m=0;m<k.length;m++)k[m]!==null&&l.data("ec.storage."+k[m],l[0].style[k[m]])},restore:function(l,k){for(var m=0;m<k.length;m++)k[m]!==null&&l.css(k[m],l.data("ec.storage."+k[m]))},setMode:function(l,k){if(k=="toggle")k=l.is(":hidden")?"show":"hide";return k},getBaseline:function(l,\r
-k){var m;switch(l[0]){case "top":m=0;break;case "middle":m=0.5;break;case "bottom":m=1;break;default:m=l[0]/k.height}switch(l[1]){case "left":l=0;break;case "center":l=0.5;break;case "right":l=1;break;default:l=l[1]/k.width}return{x:l,y:m}},createWrapper:function(l){if(l.parent().is(".ui-effects-wrapper"))return l.parent();var k={width:l.outerWidth(true),height:l.outerHeight(true),"float":l.css("float")},m=b("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",\r
-border:"none",margin:0,padding:0});l.wrap(m);m=l.parent();if(l.css("position")=="static"){m.css({position:"relative"});l.css({position:"relative"})}else{b.extend(k,{position:l.css("position"),zIndex:l.css("z-index")});b.each(["top","left","bottom","right"],function(o,q){k[q]=l.css(q);if(isNaN(parseInt(k[q],10)))k[q]="auto"});l.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return m.css(k).show()},removeWrapper:function(l){if(l.parent().is(".ui-effects-wrapper"))return l.parent().replaceWith(l);\r
-return l},setTransition:function(l,k,m,o){o=o||{};b.each(k,function(q,s){unit=l.cssUnit(s);if(unit[0]>0)o[s]=unit[0]*m+unit[1]});return o}});b.fn.extend({effect:function(l){var k=h.apply(this,arguments),m={options:k[1],duration:k[2],callback:k[3]};k=m.options.mode;var o=b.effects[l];if(b.fx.off||!o)return k?this[k](m.duration,m.callback):this.each(function(){m.callback&&m.callback.call(this)});return o.call(this,m)},_show:b.fn.show,show:function(l){if(i(l))return this._show.apply(this,arguments);\r
-else{var k=h.apply(this,arguments);k[1].mode="show";return this.effect.apply(this,k)}},_hide:b.fn.hide,hide:function(l){if(i(l))return this._hide.apply(this,arguments);else{var k=h.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:b.fn.toggle,toggle:function(l){if(i(l)||typeof l==="boolean"||b.isFunction(l))return this.__toggle.apply(this,arguments);else{var k=h.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(l){var k=this.css(l),\r
-m=[];b.each(["em","px","%","pt"],function(o,q){if(k.indexOf(q)>0)m=[parseFloat(k),q]});return m}});b.easing.jswing=b.easing.swing;b.extend(b.easing,{def:"easeOutQuad",swing:function(l,k,m,o,q){return b.easing[b.easing.def](l,k,m,o,q)},easeInQuad:function(l,k,m,o,q){return o*(k/=q)*k+m},easeOutQuad:function(l,k,m,o,q){return-o*(k/=q)*(k-2)+m},easeInOutQuad:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k+m;return-o/2*(--k*(k-2)-1)+m},easeInCubic:function(l,k,m,o,q){return o*(k/=q)*k*k+m},easeOutCubic:function(l,\r
-k,m,o,q){return o*((k=k/q-1)*k*k+1)+m},easeInOutCubic:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k+m;return o/2*((k-=2)*k*k+2)+m},easeInQuart:function(l,k,m,o,q){return o*(k/=q)*k*k*k+m},easeOutQuart:function(l,k,m,o,q){return-o*((k=k/q-1)*k*k*k-1)+m},easeInOutQuart:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k*k+m;return-o/2*((k-=2)*k*k*k-2)+m},easeInQuint:function(l,k,m,o,q){return o*(k/=q)*k*k*k*k+m},easeOutQuint:function(l,k,m,o,q){return o*((k=k/q-1)*k*k*k*k+1)+m},easeInOutQuint:function(l,\r
-k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k*k*k+m;return o/2*((k-=2)*k*k*k*k+2)+m},easeInSine:function(l,k,m,o,q){return-o*Math.cos(k/q*(Math.PI/2))+o+m},easeOutSine:function(l,k,m,o,q){return o*Math.sin(k/q*(Math.PI/2))+m},easeInOutSine:function(l,k,m,o,q){return-o/2*(Math.cos(Math.PI*k/q)-1)+m},easeInExpo:function(l,k,m,o,q){return k==0?m:o*Math.pow(2,10*(k/q-1))+m},easeOutExpo:function(l,k,m,o,q){return k==q?m+o:o*(-Math.pow(2,-10*k/q)+1)+m},easeInOutExpo:function(l,k,m,o,q){if(k==0)return m;if(k==\r
-q)return m+o;if((k/=q/2)<1)return o/2*Math.pow(2,10*(k-1))+m;return o/2*(-Math.pow(2,-10*--k)+2)+m},easeInCirc:function(l,k,m,o,q){return-o*(Math.sqrt(1-(k/=q)*k)-1)+m},easeOutCirc:function(l,k,m,o,q){return o*Math.sqrt(1-(k=k/q-1)*k)+m},easeInOutCirc:function(l,k,m,o,q){if((k/=q/2)<1)return-o/2*(Math.sqrt(1-k*k)-1)+m;return o/2*(Math.sqrt(1-(k-=2)*k)+1)+m},easeInElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q)==1)return m+o;s||(s=q*0.3);if(r<Math.abs(o)){r=o;l=s/4}else l=\r
-s/(2*Math.PI)*Math.asin(o/r);return-(r*Math.pow(2,10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s))+m},easeOutElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q)==1)return m+o;s||(s=q*0.3);if(r<Math.abs(o)){r=o;l=s/4}else l=s/(2*Math.PI)*Math.asin(o/r);return r*Math.pow(2,-10*k)*Math.sin((k*q-l)*2*Math.PI/s)+o+m},easeInOutElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q/2)==2)return m+o;s||(s=q*0.3*1.5);if(r<Math.abs(o)){r=o;l=s/4}else l=s/(2*Math.PI)*Math.asin(o/\r
-r);if(k<1)return-0.5*r*Math.pow(2,10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s)+m;return r*Math.pow(2,-10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s)*0.5+o+m},easeInBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;return o*(k/=q)*k*((s+1)*k-s)+m},easeOutBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;return o*((k=k/q-1)*k*((s+1)*k+s)+1)+m},easeInOutBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;if((k/=q/2)<1)return o/2*k*k*(((s*=1.525)+1)*k-s)+m;return o/2*((k-=2)*k*(((s*=1.525)+1)*k+s)+2)+m},easeInBounce:function(l,\r
-k,m,o,q){return o-b.easing.easeOutBounce(l,q-k,0,o,q)+m},easeOutBounce:function(l,k,m,o,q){return(k/=q)<1/2.75?o*7.5625*k*k+m:k<2/2.75?o*(7.5625*(k-=1.5/2.75)*k+0.75)+m:k<2.5/2.75?o*(7.5625*(k-=2.25/2.75)*k+0.9375)+m:o*(7.5625*(k-=2.625/2.75)*k+0.984375)+m},easeInOutBounce:function(l,k,m,o,q){if(k<q/2)return b.easing.easeInBounce(l,k*2,0,o,q)*0.5+m;return b.easing.easeOutBounce(l,k*2-q,0,o,q)*0.5+o*0.5+m}})}(jQuery);\r
-(function(b){b.effects.blind=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"vertical";b.effects.save(e,g);e.show();var c=b.effects.createWrapper(e).css({overflow:"hidden"}),h=a=="vertical"?"height":"width";a=a=="vertical"?c.height():c.width();f=="show"&&c.css(h,0);var i={};i[h]=f=="show"?a:0;c.animate(i,d.duration,d.options.easing,function(){f=="hide"&&e.hide();b.effects.restore(e,\r
-g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()})})}})(jQuery);\r
-(function(b){b.effects.bounce=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"effect"),a=d.options.direction||"up",c=d.options.distance||20,h=d.options.times||5,i=d.duration||250;/show|hide/.test(f)&&g.push("opacity");b.effects.save(e,g);e.show();b.effects.createWrapper(e);var j=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";c=d.options.distance||(j=="top"?e.outerHeight({margin:true})/3:e.outerWidth({margin:true})/\r
-3);if(f=="show")e.css("opacity",0).css(j,a=="pos"?-c:c);if(f=="hide")c/=h*2;f!="hide"&&h--;if(f=="show"){var n={opacity:1};n[j]=(a=="pos"?"+=":"-=")+c;e.animate(n,i/2,d.options.easing);c/=2;h--}for(n=0;n<h;n++){var p={},l={};p[j]=(a=="pos"?"-=":"+=")+c;l[j]=(a=="pos"?"+=":"-=")+c;e.animate(p,i/2,d.options.easing).animate(l,i/2,d.options.easing);c=f=="hide"?c*2:c/2}if(f=="hide"){n={opacity:0};n[j]=(a=="pos"?"-=":"+=")+c;e.animate(n,i/2,d.options.easing,function(){e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);\r
-d.callback&&d.callback.apply(this,arguments)})}else{p={};l={};p[j]=(a=="pos"?"-=":"+=")+c;l[j]=(a=="pos"?"+=":"-=")+c;e.animate(p,i/2,d.options.easing).animate(l,i/2,d.options.easing,function(){b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments)})}e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);\r
-(function(b){b.effects.clip=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"vertical";b.effects.save(e,g);e.show();var c=b.effects.createWrapper(e).css({overflow:"hidden"});c=e[0].tagName=="IMG"?c:e;var h={size:a=="vertical"?"height":"width",position:a=="vertical"?"top":"left"};a=a=="vertical"?c.height():c.width();if(f=="show"){c.css(h.size,0);c.css(h.position,\r
-a/2)}var i={};i[h.size]=f=="show"?a:0;i[h.position]=f=="show"?0:a/2;c.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.drop=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","opacity"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"left";b.effects.save(e,g);e.show();b.effects.createWrapper(e);var c=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";var h=d.options.distance||(c=="top"?e.outerHeight({margin:true})/2:e.outerWidth({margin:true})/2);if(f=="show")e.css("opacity",0).css(c,a=="pos"?-h:h);var i={opacity:f==\r
-"show"?1:0};i[c]=(f=="show"?a=="pos"?"+=":"-=":a=="pos"?"-=":"+=")+h;e.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.explode=function(d){return this.queue(function(){var e=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3,g=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3;d.options.mode=d.options.mode=="toggle"?b(this).is(":visible")?"hide":"show":d.options.mode;var f=b(this).show().css("visibility","hidden"),a=f.offset();a.top-=parseInt(f.css("marginTop"),10)||0;a.left-=parseInt(f.css("marginLeft"),10)||0;for(var c=f.outerWidth(true),h=f.outerHeight(true),i=0;i<e;i++)for(var j=\r
-0;j<g;j++)f.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(c/g),top:-i*(h/e)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:c/g,height:h/e,left:a.left+j*(c/g)+(d.options.mode=="show"?(j-Math.floor(g/2))*(c/g):0),top:a.top+i*(h/e)+(d.options.mode=="show"?(i-Math.floor(e/2))*(h/e):0),opacity:d.options.mode=="show"?0:1}).animate({left:a.left+j*(c/g)+(d.options.mode=="show"?0:(j-Math.floor(g/2))*(c/g)),top:a.top+\r
-i*(h/e)+(d.options.mode=="show"?0:(i-Math.floor(e/2))*(h/e)),opacity:d.options.mode=="show"?1:0},d.duration||500);setTimeout(function(){d.options.mode=="show"?f.css({visibility:"visible"}):f.css({visibility:"visible"}).hide();d.callback&&d.callback.apply(f[0]);f.dequeue();b("div.ui-effects-explode").remove()},d.duration||500)})}})(jQuery);\r
-(function(b){b.effects.fade=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"hide");e.animate({opacity:g},{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.fold=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.size||15,c=!!d.options.horizFirst,h=d.duration?d.duration/2:b.fx.speeds._default/2;b.effects.save(e,g);e.show();var i=b.effects.createWrapper(e).css({overflow:"hidden"}),j=f=="show"!=c,n=j?["width","height"]:["height","width"];j=j?[i.width(),i.height()]:[i.height(),i.width()];var p=/([0-9]+)%/.exec(a);if(p)a=parseInt(p[1],\r
-10)/100*j[f=="hide"?0:1];if(f=="show")i.css(c?{height:0,width:a}:{height:a,width:0});c={};p={};c[n[0]]=f=="show"?j[0]:a;p[n[1]]=f=="show"?j[1]:0;i.animate(c,h,d.options.easing).animate(p,h,d.options.easing,function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()})})}})(jQuery);\r
-(function(b){b.effects.highlight=function(d){return this.queue(function(){var e=b(this),g=["backgroundImage","backgroundColor","opacity"],f=b.effects.setMode(e,d.options.mode||"show"),a={backgroundColor:e.css("backgroundColor")};if(f=="hide")a.opacity=0;b.effects.save(e,g);e.show().css({backgroundImage:"none",backgroundColor:d.options.color||"#ffff99"}).animate(a,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);f=="show"&&!b.support.opacity&&\r
-this.style.removeAttribute("filter");d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.pulsate=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"show");times=(d.options.times||5)*2-1;duration=d.duration?d.duration/2:b.fx.speeds._default/2;isVisible=e.is(":visible");animateTo=0;if(!isVisible){e.css("opacity",0).show();animateTo=1}if(g=="hide"&&isVisible||g=="show"&&!isVisible)times--;for(g=0;g<times;g++){e.animate({opacity:animateTo},duration,d.options.easing);animateTo=(animateTo+1)%2}e.animate({opacity:animateTo},duration,\r
-d.options.easing,function(){animateTo==0&&e.hide();d.callback&&d.callback.apply(this,arguments)});e.queue("fx",function(){e.dequeue()}).dequeue()})}})(jQuery);\r
-(function(b){b.effects.puff=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"hide"),f=parseInt(d.options.percent,10)||150,a=f/100,c={height:e.height(),width:e.width()};b.extend(d.options,{fade:true,mode:g,percent:g=="hide"?f:100,from:g=="hide"?c:{height:c.height*a,width:c.width*a}});e.effect("scale",d.options,d.duration,d.callback);e.dequeue()})};b.effects.scale=function(d){return this.queue(function(){var e=b(this),g=b.extend(true,{},d.options),f=b.effects.setMode(e,\r
-d.options.mode||"effect"),a=parseInt(d.options.percent,10)||(parseInt(d.options.percent,10)==0?0:f=="hide"?0:100),c=d.options.direction||"both",h=d.options.origin;if(f!="effect"){g.origin=h||["middle","center"];g.restore=true}h={height:e.height(),width:e.width()};e.from=d.options.from||(f=="show"?{height:0,width:0}:h);a={y:c!="horizontal"?a/100:1,x:c!="vertical"?a/100:1};e.to={height:h.height*a.y,width:h.width*a.x};if(d.options.fade){if(f=="show"){e.from.opacity=0;e.to.opacity=1}if(f=="hide"){e.from.opacity=\r
-1;e.to.opacity=0}}g.from=e.from;g.to=e.to;g.mode=f;e.effect("size",g,d.duration,d.callback);e.dequeue()})};b.effects.size=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","width","height","overflow","opacity"],f=["position","top","bottom","left","right","overflow","opacity"],a=["width","height","overflow"],c=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],\r
-j=b.effects.setMode(e,d.options.mode||"effect"),n=d.options.restore||false,p=d.options.scale||"both",l=d.options.origin,k={height:e.height(),width:e.width()};e.from=d.options.from||k;e.to=d.options.to||k;if(l){l=b.effects.getBaseline(l,k);e.from.top=(k.height-e.from.height)*l.y;e.from.left=(k.width-e.from.width)*l.x;e.to.top=(k.height-e.to.height)*l.y;e.to.left=(k.width-e.to.width)*l.x}var m={from:{y:e.from.height/k.height,x:e.from.width/k.width},to:{y:e.to.height/k.height,x:e.to.width/k.width}};\r
-if(p=="box"||p=="both"){if(m.from.y!=m.to.y){g=g.concat(h);e.from=b.effects.setTransition(e,h,m.from.y,e.from);e.to=b.effects.setTransition(e,h,m.to.y,e.to)}if(m.from.x!=m.to.x){g=g.concat(i);e.from=b.effects.setTransition(e,i,m.from.x,e.from);e.to=b.effects.setTransition(e,i,m.to.x,e.to)}}if(p=="content"||p=="both")if(m.from.y!=m.to.y){g=g.concat(c);e.from=b.effects.setTransition(e,c,m.from.y,e.from);e.to=b.effects.setTransition(e,c,m.to.y,e.to)}b.effects.save(e,n?g:f);e.show();b.effects.createWrapper(e);\r
-e.css("overflow","hidden").css(e.from);if(p=="content"||p=="both"){h=h.concat(["marginTop","marginBottom"]).concat(c);i=i.concat(["marginLeft","marginRight"]);a=g.concat(h).concat(i);e.find("*[width]").each(function(){child=b(this);n&&b.effects.save(child,a);var o={height:child.height(),width:child.width()};child.from={height:o.height*m.from.y,width:o.width*m.from.x};child.to={height:o.height*m.to.y,width:o.width*m.to.x};if(m.from.y!=m.to.y){child.from=b.effects.setTransition(child,h,m.from.y,child.from);\r
-child.to=b.effects.setTransition(child,h,m.to.y,child.to)}if(m.from.x!=m.to.x){child.from=b.effects.setTransition(child,i,m.from.x,child.from);child.to=b.effects.setTransition(child,i,m.to.x,child.to)}child.css(child.from);child.animate(child.to,d.duration,d.options.easing,function(){n&&b.effects.restore(child,a)})})}e.animate(e.to,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e.to.opacity===0&&e.css("opacity",e.from.opacity);j=="hide"&&e.hide();b.effects.restore(e,\r
-n?g:f);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.shake=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"];b.effects.setMode(e,d.options.mode||"effect");var f=d.options.direction||"left",a=d.options.distance||20,c=d.options.times||3,h=d.duration||d.options.duration||140;b.effects.save(e,g);e.show();b.effects.createWrapper(e);var i=f=="up"||f=="down"?"top":"left",j=f=="up"||f=="left"?"pos":"neg";f={};var n={},p={};f[i]=(j=="pos"?"-=":"+=")+a;n[i]=(j=="pos"?"+=":"-=")+a*2;p[i]=\r
-(j=="pos"?"-=":"+=")+a*2;e.animate(f,h,d.options.easing);for(a=1;a<c;a++)e.animate(n,h,d.options.easing).animate(p,h,d.options.easing);e.animate(n,h,d.options.easing).animate(f,h/2,d.options.easing,function(){b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments)});e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);\r
-(function(b){b.effects.slide=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"show"),a=d.options.direction||"left";b.effects.save(e,g);e.show();b.effects.createWrapper(e).css({overflow:"hidden"});var c=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";var h=d.options.distance||(c=="top"?e.outerHeight({margin:true}):e.outerWidth({margin:true}));if(f=="show")e.css(c,a=="pos"?isNaN(h)?"-"+h:-h:h);\r
-var i={};i[c]=(f=="show"?a=="pos"?"+=":"-=":a=="pos"?"-=":"+=")+h;e.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.transfer=function(d){return this.queue(function(){var e=b(this),g=b(d.options.to),f=g.offset();g={top:f.top,left:f.left,height:g.innerHeight(),width:g.innerWidth()};f=e.offset();var a=b('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(d.options.className).css({top:f.top,left:f.left,height:e.innerHeight(),width:e.innerWidth(),position:"absolute"}).animate(g,d.duration,d.options.easing,function(){a.remove();d.callback&&d.callback.apply(e[0],arguments);\r
-e.dequeue()})})}})(jQuery);\r
-(function(b){b.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var d=this,e=d.options;d.running=0;d.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");d.headers=\r
-d.element.find(e.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){e.disabled||b(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){e.disabled||b(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){e.disabled||b(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){e.disabled||b(this).removeClass("ui-state-focus")});d.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");\r
-if(e.navigation){var g=d.element.find("a").filter(e.navigationFilter).eq(0);if(g.length){var f=g.closest(".ui-accordion-header");d.active=f.length?f:g.closest(".ui-accordion-content").prev()}}d.active=d._findActive(d.active||e.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");d.active.next().addClass("ui-accordion-content-active");d._createIcons();d.resize();d.element.attr("role","tablist");d.headers.attr("role","tab").bind("keydown.accordion",\r
-function(a){return d._keydown(a)}).next().attr("role","tabpanel");d.headers.not(d.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();d.active.length?d.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):d.headers.eq(0).attr("tabIndex",0);b.browser.safari||d.headers.find("a").attr("tabIndex",-1);e.event&&d.headers.bind(e.event.split(" ").join(".accordion ")+".accordion",function(a){d._clickHandler.call(d,a,this);a.preventDefault()})},_createIcons:function(){var d=\r
-this.options;if(d.icons){b("<span></span>").addClass("ui-icon "+d.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(d.icons.header).toggleClass(d.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var d=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex");\r
-this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var e=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(d.autoHeight||d.fillHeight)e.css("height","");return b.Widget.prototype.destroy.call(this)},_setOption:function(d,e){b.Widget.prototype._setOption.apply(this,arguments);d=="active"&&this.activate(e);if(d=="icons"){this._destroyIcons();\r
-e&&this._createIcons()}if(d=="disabled")this.headers.add(this.headers.next())[e?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(d){if(!(this.options.disabled||d.altKey||d.ctrlKey)){var e=b.ui.keyCode,g=this.headers.length,f=this.headers.index(d.target),a=false;switch(d.keyCode){case e.RIGHT:case e.DOWN:a=this.headers[(f+1)%g];break;case e.LEFT:case e.UP:a=this.headers[(f-1+g)%g];break;case e.SPACE:case e.ENTER:this._clickHandler({target:d.target},d.target);\r
-d.preventDefault()}if(a){b(d.target).attr("tabIndex",-1);b(a).attr("tabIndex",0);a.focus();return false}return true}},resize:function(){var d=this.options,e;if(d.fillSpace){if(b.browser.msie){var g=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}e=this.element.parent().height();b.browser.msie&&this.element.parent().css("overflow",g);this.headers.each(function(){e-=b(this).outerHeight(true)});this.headers.next().each(function(){b(this).height(Math.max(0,e-b(this).innerHeight()+\r
-b(this).height()))}).css("overflow","auto")}else if(d.autoHeight){e=0;this.headers.next().each(function(){e=Math.max(e,b(this).height("").height())}).height(e)}return this},activate:function(d){this.options.active=d;d=this._findActive(d)[0];this._clickHandler({target:d},d);return this},_findActive:function(d){return d?typeof d==="number"?this.headers.filter(":eq("+d+")"):this.headers.not(this.headers.not(d)):d===false?b([]):this.headers.filter(":eq(0)")},_clickHandler:function(d,e){var g=this.options;\r
-if(!g.disabled)if(d.target){d=b(d.currentTarget||e);e=d[0]===this.active[0];g.active=g.collapsible&&e?false:this.headers.index(d);if(!(this.running||!g.collapsible&&e)){var f=this.active;i=d.next();c=this.active.next();h={options:g,newHeader:e&&g.collapsible?b([]):d,oldHeader:this.active,newContent:e&&g.collapsible?b([]):i,oldContent:c};var a=this.headers.index(this.active[0])>this.headers.index(d[0]);this.active=e?b([]):d;this._toggle(i,c,h,e,a);f.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(g.icons.headerSelected).addClass(g.icons.header);\r
-if(!e){d.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(g.icons.header).addClass(g.icons.headerSelected);d.next().addClass("ui-accordion-content-active")}}}else if(g.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(g.icons.headerSelected).addClass(g.icons.header);this.active.next().addClass("ui-accordion-content-active");var c=this.active.next(),\r
-h={options:g,newHeader:b([]),oldHeader:g.active,newContent:b([]),oldContent:c},i=this.active=b([]);this._toggle(i,c,h)}},_toggle:function(d,e,g,f,a){var c=this,h=c.options;c.toShow=d;c.toHide=e;c.data=g;var i=function(){if(c)return c._completed.apply(c,arguments)};c._trigger("changestart",null,c.data);c.running=e.size()===0?d.size():e.size();if(h.animated){g={};g=h.collapsible&&f?{toShow:b([]),toHide:e,complete:i,down:a,autoHeight:h.autoHeight||h.fillSpace}:{toShow:d,toHide:e,complete:i,down:a,autoHeight:h.autoHeight||\r
-h.fillSpace};if(!h.proxied)h.proxied=h.animated;if(!h.proxiedDuration)h.proxiedDuration=h.duration;h.animated=b.isFunction(h.proxied)?h.proxied(g):h.proxied;h.duration=b.isFunction(h.proxiedDuration)?h.proxiedDuration(g):h.proxiedDuration;f=b.ui.accordion.animations;var j=h.duration,n=h.animated;if(n&&!f[n]&&!b.easing[n])n="slide";f[n]||(f[n]=function(p){this.slide(p,{easing:n,duration:j||700})});f[n](g)}else{if(h.collapsible&&f)d.toggle();else{e.hide();d.show()}i(true)}e.prev().attr({"aria-expanded":"false",\r
-"aria-selected":"false",tabIndex:-1}).blur();d.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(d){this.running=d?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});b.extend(b.ui.accordion,{version:"1.8.11",\r
-animations:{slide:function(d,e){d=b.extend({easing:"swing",duration:300},d,e);if(d.toHide.size())if(d.toShow.size()){var g=d.toShow.css("overflow"),f=0,a={},c={},h;e=d.toShow;h=e[0].style.width;e.width(parseInt(e.parent().width(),10)-parseInt(e.css("paddingLeft"),10)-parseInt(e.css("paddingRight"),10)-(parseInt(e.css("borderLeftWidth"),10)||0)-(parseInt(e.css("borderRightWidth"),10)||0));b.each(["height","paddingTop","paddingBottom"],function(i,j){c[j]="hide";i=(""+b.css(d.toShow[0],j)).match(/^([\d+-.]+)(.*)$/);\r
-a[j]={value:i[1],unit:i[2]||"px"}});d.toShow.css({height:0,overflow:"hidden"}).show();d.toHide.filter(":hidden").each(d.complete).end().filter(":visible").animate(c,{step:function(i,j){if(j.prop=="height")f=j.end-j.start===0?0:(j.now-j.start)/(j.end-j.start);d.toShow[0].style[j.prop]=f*a[j.prop].value+a[j.prop].unit},duration:d.duration,easing:d.easing,complete:function(){d.autoHeight||d.toShow.css("height","");d.toShow.css({width:h,overflow:g});d.complete()}})}else d.toHide.animate({height:"hide",\r
-paddingTop:"hide",paddingBottom:"hide"},d);else d.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},d)},bounceslide:function(d){this.slide(d,{easing:d.down?"easeOutBounce":"swing",duration:d.down?1E3:200})}}})})(jQuery);\r
-(function(b){var d=0;b.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var e=this,g=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(a){if(!(e.options.disabled||e.element.attr("readonly"))){f=\r
-false;var c=b.ui.keyCode;switch(a.keyCode){case c.PAGE_UP:e._move("previousPage",a);break;case c.PAGE_DOWN:e._move("nextPage",a);break;case c.UP:e._move("previous",a);a.preventDefault();break;case c.DOWN:e._move("next",a);a.preventDefault();break;case c.ENTER:case c.NUMPAD_ENTER:if(e.menu.active){f=true;a.preventDefault()}case c.TAB:if(!e.menu.active)return;e.menu.select(a);break;case c.ESCAPE:e.element.val(e.term);e.close(a);break;default:clearTimeout(e.searching);e.searching=setTimeout(function(){if(e.term!=\r
-e.element.val()){e.selectedItem=null;e.search(null,a)}},e.options.delay);break}}}).bind("keypress.autocomplete",function(a){if(f){f=false;a.preventDefault()}}).bind("focus.autocomplete",function(){if(!e.options.disabled){e.selectedItem=null;e.previous=e.element.val()}}).bind("blur.autocomplete",function(a){if(!e.options.disabled){clearTimeout(e.searching);e.closing=setTimeout(function(){e.close(a);e._change(a)},150)}});this._initSource();this.response=function(){return e._response.apply(e,arguments)};\r
-this.menu=b("<ul></ul>").addClass("ui-autocomplete").appendTo(b(this.options.appendTo||"body",g)[0]).mousedown(function(a){var c=e.menu.element[0];b(a.target).closest(".ui-menu-item").length||setTimeout(function(){b(document).one("mousedown",function(h){h.target!==e.element[0]&&h.target!==c&&!b.ui.contains(c,h.target)&&e.close()})},1);setTimeout(function(){clearTimeout(e.closing)},13)}).menu({focus:function(a,c){c=c.item.data("item.autocomplete");false!==e._trigger("focus",a,{item:c})&&/^key/.test(a.originalEvent.type)&&\r
-e.element.val(c.value)},selected:function(a,c){var h=c.item.data("item.autocomplete"),i=e.previous;if(e.element[0]!==g.activeElement){e.element.focus();e.previous=i;setTimeout(function(){e.previous=i;e.selectedItem=h},1)}false!==e._trigger("select",a,{item:h})&&e.element.val(h.value);e.term=e.element.val();e.close(a);e.selectedItem=h},blur:function(){e.menu.element.is(":visible")&&e.element.val()!==e.term&&e.element.val(e.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");\r
-b.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();b.Widget.prototype.destroy.call(this)},_setOption:function(e,g){b.Widget.prototype._setOption.apply(this,arguments);e==="source"&&this._initSource();if(e==="appendTo")this.menu.element.appendTo(b(g||"body",this.element[0].ownerDocument)[0]);e==="disabled"&&\r
-g&&this.xhr&&this.xhr.abort()},_initSource:function(){var e=this,g,f;if(b.isArray(this.options.source)){g=this.options.source;this.source=function(a,c){c(b.ui.autocomplete.filter(g,a.term))}}else if(typeof this.options.source==="string"){f=this.options.source;this.source=function(a,c){e.xhr&&e.xhr.abort();e.xhr=b.ajax({url:f,data:a,dataType:"json",autocompleteRequest:++d,success:function(h){this.autocompleteRequest===d&&c(h)},error:function(){this.autocompleteRequest===d&&c([])}})}}else this.source=\r
-this.options.source},search:function(e,g){e=e!=null?e:this.element.val();this.term=this.element.val();if(e.length<this.options.minLength)return this.close(g);clearTimeout(this.closing);if(this._trigger("search",g)!==false)return this._search(e)},_search:function(e){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:e},this.response)},_response:function(e){if(!this.options.disabled&&e&&e.length){e=this._normalize(e);this._suggest(e);this._trigger("open")}else this.close();\r
-this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(e){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",e)}},_change:function(e){this.previous!==this.element.val()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(e){if(e.length&&e[0].label&&e[0].value)return e;return b.map(e,function(g){if(typeof g==="string")return{label:g,value:g};return b.extend({label:g.label||\r
-g.value,value:g.value||g.label},g)})},_suggest:function(e){var g=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(g,e);this.menu.deactivate();this.menu.refresh();g.show();this._resizeMenu();g.position(b.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new b.Event("mouseover"))},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(e,g){var f=this;\r
-b.each(g,function(a,c){f._renderItem(e,c)})},_renderItem:function(e,g){return b("<li></li>").data("item.autocomplete",g).append(b("<a></a>").text(g.label)).appendTo(e)},_move:function(e,g){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(e)||this.menu.last()&&/^next/.test(e)){this.element.val(this.term);this.menu.deactivate()}else this.menu[e](g);else this.search(null,g)},widget:function(){return this.menu.element}});b.extend(b.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,\r
-"\\$&")},filter:function(e,g){var f=new RegExp(b.ui.autocomplete.escapeRegex(g),"i");return b.grep(e,function(a){return f.test(a.label||a.value||a)})}})})(jQuery);\r
-(function(b){b.widget("ui.menu",{_create:function(){var d=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(e){if(b(e.target).closest(".ui-menu-item a").length){e.preventDefault();d.select(e)}});this.refresh()},refresh:function(){var d=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",\r
--1).mouseenter(function(e){d.activate(e,b(this).parent())}).mouseleave(function(){d.deactivate()})},activate:function(d,e){this.deactivate();if(this.hasScroll()){var g=e.offset().top-this.element.offset().top,f=this.element.attr("scrollTop"),a=this.element.height();if(g<0)this.element.attr("scrollTop",f+g);else g>=a&&this.element.attr("scrollTop",f+g-a+e.height())}this.active=e.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",d,{item:e})},\r
-deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(d){this.move("next",".ui-menu-item:first",d)},previous:function(d){this.move("prev",".ui-menu-item:last",d)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(d,e,g){if(this.active){d=this.active[d+"All"](".ui-menu-item").eq(0);\r
-d.length?this.activate(g,d):this.activate(g,this.element.children(e))}else this.activate(g,this.element.children(e))},nextPage:function(d){if(this.hasScroll())if(!this.active||this.last())this.activate(d,this.element.children(".ui-menu-item:first"));else{var e=this.active.offset().top,g=this.element.height(),f=this.element.children(".ui-menu-item").filter(function(){var a=b(this).offset().top-e-g+b(this).height();return a<10&&a>-10});f.length||(f=this.element.children(".ui-menu-item:last"));this.activate(d,\r
-f)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(d){if(this.hasScroll())if(!this.active||this.first())this.activate(d,this.element.children(".ui-menu-item:last"));else{var e=this.active.offset().top,g=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var f=b(this).offset().top-e+g-b(this).height();return f<10&&f>-10});result.length||(result=this.element.children(".ui-menu-item:first"));\r
-this.activate(d,result)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(d){this._trigger("selected",d,{item:this.active})}})})(jQuery);\r
-(function(b){var d,e=function(f){b(":ui-button",f.target.form).each(function(){var a=b(this).data("button");setTimeout(function(){a.refresh()},1)})},g=function(f){var a=f.name,c=f.form,h=b([]);if(a)h=c?b(c).find("[name='"+a+"']"):b("[name='"+a+"']",f.ownerDocument).filter(function(){return!this.form});return h};b.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",\r
-e);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var f=this,a=this.options,c=this.type==="checkbox"||this.type==="radio",h="ui-state-hover"+(!c?" ui-state-active":"");if(a.label===null)a.label=this.buttonElement.html();if(this.element.is(":disabled"))a.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",\r
-function(){if(!a.disabled){b(this).addClass("ui-state-hover");this===d&&b(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){a.disabled||b(this).removeClass(h)}).bind("focus.button",function(){b(this).addClass("ui-state-focus")}).bind("blur.button",function(){b(this).removeClass("ui-state-focus")});c&&this.element.bind("change.button",function(){f.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(a.disabled)return false;b(this).toggleClass("ui-state-active");\r
-f.buttonElement.attr("aria-pressed",f.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(a.disabled)return false;b(this).addClass("ui-state-active");f.buttonElement.attr("aria-pressed",true);var i=f.element[0];g(i).not(i).map(function(){return b(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(a.disabled)return false;b(this).addClass("ui-state-active");\r
-d=this;b(document).one("mouseup",function(){d=null})}).bind("mouseup.button",function(){if(a.disabled)return false;b(this).removeClass("ui-state-active")}).bind("keydown.button",function(i){if(a.disabled)return false;if(i.keyCode==b.ui.keyCode.SPACE||i.keyCode==b.ui.keyCode.ENTER)b(this).addClass("ui-state-active")}).bind("keyup.button",function(){b(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(i){i.keyCode===b.ui.keyCode.SPACE&&b(this).click()})}this._setOption("disabled",\r
-a.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){var f=this.element.parents().filter(":last"),a="label[for="+this.element.attr("id")+"]";this.buttonElement=f.find(a);if(!this.buttonElement.length){f=f.length?f.siblings():this.element.siblings();this.buttonElement=f.filter(a);if(!this.buttonElement.length)this.buttonElement=f.find(a)}this.element.addClass("ui-helper-hidden-accessible");\r
-(f=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",f)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());\r
-this.hasTitle||this.buttonElement.removeAttr("title");b.Widget.prototype.destroy.call(this)},_setOption:function(f,a){b.Widget.prototype._setOption.apply(this,arguments);if(f==="disabled")a?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var f=this.element.is(":disabled");f!==this.options.disabled&&this._setOption("disabled",f);if(this.type==="radio")g(this.element[0]).each(function(){b(this).is(":checked")?b(this).button("widget").addClass("ui-state-active").attr("aria-pressed",\r
-true):b(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var f=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),\r
-a=b("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(f.empty()).text(),c=this.options.icons,h=c.primary&&c.secondary,i=[];if(c.primary||c.secondary){if(this.options.text)i.push("ui-button-text-icon"+(h?"s":c.primary?"-primary":"-secondary"));c.primary&&f.prepend("<span class='ui-button-icon-primary ui-icon "+c.primary+"'></span>");c.secondary&&f.append("<span class='ui-button-icon-secondary ui-icon "+c.secondary+"'></span>");if(!this.options.text){i.push(h?"ui-button-icons-only":\r
-"ui-button-icon-only");this.hasTitle||f.attr("title",a)}}else i.push("ui-button-text-only");f.addClass(i.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(f,a){f==="disabled"&&this.buttons.button("option",f,a);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},\r
-destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");b.Widget.prototype.destroy.call(this)}})})(jQuery);\r
-(function(b,d){function e(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=\r
-"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",\r
-"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",\r
-minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};b.extend(this._defaults,this.regional[""]);this.dpDiv=b('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function g(a,c){b.extend(a,c);for(var h in c)if(c[h]==\r
-null||c[h]==d)a[h]=c[h];return a}b.extend(b.ui,{datepicker:{version:"1.8.11"}});var f=(new Date).getTime();b.extend(e.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){g(this._defaults,a||{});return this},_attachDatepicker:function(a,c){var h=null;for(var i in this._defaults){var j=a.getAttribute("date:"+i);if(j){h=h||{};try{h[i]=eval(j)}catch(n){h[i]=j}}}i=a.nodeName.toLowerCase();\r
-j=i=="div"||i=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var p=this._newInst(b(a),j);p.settings=b.extend({},c||{},h||{});if(i=="input")this._connectDatepicker(a,p);else j&&this._inlineDatepicker(a,p)},_newInst:function(a,c){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:c,dpDiv:!c?this.dpDiv:b('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},\r
-_connectDatepicker:function(a,c){var h=b(a);c.append=b([]);c.trigger=b([]);if(!h.hasClass(this.markerClassName)){this._attachments(h,c);h.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(i,j,n){c.settings[j]=n}).bind("getData.datepicker",function(i,j){return this._get(c,j)});this._autoSize(c);b.data(a,"datepicker",c)}},_attachments:function(a,c){var h=this._get(c,"appendText"),i=this._get(c,"isRTL");c.append&&\r
-c.append.remove();if(h){c.append=b('<span class="'+this._appendClass+'">'+h+"</span>");a[i?"before":"after"](c.append)}a.unbind("focus",this._showDatepicker);c.trigger&&c.trigger.remove();h=this._get(c,"showOn");if(h=="focus"||h=="both")a.focus(this._showDatepicker);if(h=="button"||h=="both"){h=this._get(c,"buttonText");var j=this._get(c,"buttonImage");c.trigger=b(this._get(c,"buttonImageOnly")?b("<img/>").addClass(this._triggerClass).attr({src:j,alt:h,title:h}):b('<button type="button"></button>').addClass(this._triggerClass).html(j==\r
-""?h:b("<img/>").attr({src:j,alt:h,title:h})));a[i?"before":"after"](c.trigger);c.trigger.click(function(){b.datepicker._datepickerShowing&&b.datepicker._lastInput==a[0]?b.datepicker._hideDatepicker():b.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var c=new Date(2009,11,20),h=this._get(a,"dateFormat");if(h.match(/[DM]/)){var i=function(j){for(var n=0,p=0,l=0;l<j.length;l++)if(j[l].length>n){n=j[l].length;p=l}return p};c.setMonth(i(this._get(a,\r
-h.match(/MM/)?"monthNames":"monthNamesShort")));c.setDate(i(this._get(a,h.match(/DD/)?"dayNames":"dayNamesShort"))+20-c.getDay())}a.input.attr("size",this._formatDate(a,c).length)}},_inlineDatepicker:function(a,c){var h=b(a);if(!h.hasClass(this.markerClassName)){h.addClass(this.markerClassName).append(c.dpDiv).bind("setData.datepicker",function(i,j,n){c.settings[j]=n}).bind("getData.datepicker",function(i,j){return this._get(c,j)});b.data(a,"datepicker",c);this._setDate(c,this._getDefaultDate(c),\r
-true);this._updateDatepicker(c);this._updateAlternate(c);c.dpDiv.show()}},_dialogDatepicker:function(a,c,h,i,j){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=b('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);b("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};b.data(this._dialogInput[0],"datepicker",a)}g(a.settings,i||{});\r
-c=c&&c.constructor==Date?this._formatDate(a,c):c;this._dialogInput.val(c);this._pos=j?j.length?j:[j.pageX,j.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=h;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);\r
-this._showDatepicker(this._dialogInput[0]);b.blockUI&&b.blockUI(this.dpDiv);b.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();b.removeData(a,"datepicker");if(i=="input"){h.append.remove();h.trigger.remove();c.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",\r
-this._doKeyUp)}else if(i=="div"||i=="span")c.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();if(i=="input"){a.disabled=false;h.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(i=="div"||i=="span")c.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=b.map(this._disabledInputs,\r
-function(j){return j==a?null:j})}},_disableDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();if(i=="input"){a.disabled=true;h.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(i=="div"||i=="span")c.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=b.map(this._disabledInputs,function(j){return j==a?null:\r
-j});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var c=0;c<this._disabledInputs.length;c++)if(this._disabledInputs[c]==a)return true;return false},_getInst:function(a){try{return b.data(a,"datepicker")}catch(c){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,c,h){var i=this._getInst(a);if(arguments.length==2&&typeof c=="string")return c=="defaults"?b.extend({},b.datepicker._defaults):i?c=="all"?b.extend({},\r
-i.settings):this._get(i,c):null;var j=c||{};if(typeof c=="string"){j={};j[c]=h}if(i){this._curInst==i&&this._hideDatepicker();var n=this._getDateDatepicker(a,true),p=this._getMinMaxDate(i,"min"),l=this._getMinMaxDate(i,"max");g(i.settings,j);if(p!==null&&j.dateFormat!==d&&j.minDate===d)i.settings.minDate=this._formatDate(i,p);if(l!==null&&j.dateFormat!==d&&j.maxDate===d)i.settings.maxDate=this._formatDate(i,l);this._attachments(b(a),i);this._autoSize(i);this._setDateDatepicker(a,n);this._updateDatepicker(i)}},\r
-_changeDatepicker:function(a,c,h){this._optionDatepicker(a,c,h)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,c){if(a=this._getInst(a)){this._setDate(a,c);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,c){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,c);return a?this._getDate(a):null},_doKeyDown:function(a){var c=b.datepicker._getInst(a.target),h=true,i=c.dpDiv.is(".ui-datepicker-rtl");\r
-c._keyEvent=true;if(b.datepicker._datepickerShowing)switch(a.keyCode){case 9:b.datepicker._hideDatepicker();h=false;break;case 13:h=b("td."+b.datepicker._dayOverClass+":not(."+b.datepicker._currentClass+")",c.dpDiv);h[0]?b.datepicker._selectDay(a.target,c.selectedMonth,c.selectedYear,h[0]):b.datepicker._hideDatepicker();return false;case 27:b.datepicker._hideDatepicker();break;case 33:b.datepicker._adjustDate(a.target,a.ctrlKey?-b.datepicker._get(c,"stepBigMonths"):-b.datepicker._get(c,"stepMonths"),\r
-"M");break;case 34:b.datepicker._adjustDate(a.target,a.ctrlKey?+b.datepicker._get(c,"stepBigMonths"):+b.datepicker._get(c,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)b.datepicker._clearDate(a.target);h=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)b.datepicker._gotoToday(a.target);h=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,i?+1:-1,"D");h=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)b.datepicker._adjustDate(a.target,a.ctrlKey?\r
--b.datepicker._get(c,"stepBigMonths"):-b.datepicker._get(c,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,-7,"D");h=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,i?-1:+1,"D");h=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)b.datepicker._adjustDate(a.target,a.ctrlKey?+b.datepicker._get(c,"stepBigMonths"):+b.datepicker._get(c,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,\r
-+7,"D");h=a.ctrlKey||a.metaKey;break;default:h=false}else if(a.keyCode==36&&a.ctrlKey)b.datepicker._showDatepicker(this);else h=false;if(h){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var c=b.datepicker._getInst(a.target);if(b.datepicker._get(c,"constrainInput")){c=b.datepicker._possibleChars(b.datepicker._get(c,"dateFormat"));var h=String.fromCharCode(a.charCode==d?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||h<" "||!c||c.indexOf(h)>-1}},_doKeyUp:function(a){a=b.datepicker._getInst(a.target);\r
-if(a.input.val()!=a.lastVal)try{if(b.datepicker.parseDate(b.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,b.datepicker._getFormatConfig(a))){b.datepicker._setDateFromField(a);b.datepicker._updateAlternate(a);b.datepicker._updateDatepicker(a)}}catch(c){b.datepicker.log(c)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=b("input",a.parentNode)[0];if(!(b.datepicker._isDisabledDatepicker(a)||b.datepicker._lastInput==a)){var c=b.datepicker._getInst(a);\r
-b.datepicker._curInst&&b.datepicker._curInst!=c&&b.datepicker._curInst.dpDiv.stop(true,true);var h=b.datepicker._get(c,"beforeShow");g(c.settings,h?h.apply(a,[a,c]):{});c.lastVal=null;b.datepicker._lastInput=a;b.datepicker._setDateFromField(c);if(b.datepicker._inDialog)a.value="";if(!b.datepicker._pos){b.datepicker._pos=b.datepicker._findPos(a);b.datepicker._pos[1]+=a.offsetHeight}var i=false;b(a).parents().each(function(){i|=b(this).css("position")=="fixed";return!i});if(i&&b.browser.opera){b.datepicker._pos[0]-=\r
-document.documentElement.scrollLeft;b.datepicker._pos[1]-=document.documentElement.scrollTop}h={left:b.datepicker._pos[0],top:b.datepicker._pos[1]};b.datepicker._pos=null;c.dpDiv.empty();c.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});b.datepicker._updateDatepicker(c);h=b.datepicker._checkOffset(c,h,i);c.dpDiv.css({position:b.datepicker._inDialog&&b.blockUI?"static":i?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"});if(!c.inline){h=b.datepicker._get(c,"showAnim");\r
-var j=b.datepicker._get(c,"duration"),n=function(){b.datepicker._datepickerShowing=true;var p=c.dpDiv.find("iframe.ui-datepicker-cover");if(p.length){var l=b.datepicker._getBorders(c.dpDiv);p.css({left:-l[0],top:-l[1],width:c.dpDiv.outerWidth(),height:c.dpDiv.outerHeight()})}};c.dpDiv.zIndex(b(a).zIndex()+1);b.effects&&b.effects[h]?c.dpDiv.show(h,b.datepicker._get(c,"showOptions"),j,n):c.dpDiv[h||"show"](h?j:null,n);if(!h||!j)n();c.input.is(":visible")&&!c.input.is(":disabled")&&c.input.focus();b.datepicker._curInst=\r
-c}}},_updateDatepicker:function(a){var c=this,h=b.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var i=a.dpDiv.find("iframe.ui-datepicker-cover");i.length&&i.css({left:-h[0],top:-h[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){b(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&b(this).removeClass("ui-datepicker-prev-hover");\r
-this.className.indexOf("ui-datepicker-next")!=-1&&b(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!c._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){b(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");b(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&b(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&b(this).addClass("ui-datepicker-next-hover")}}).end().find("."+\r
-this._dayOverClass+" a").trigger("mouseover").end();h=this._getNumberOfMonths(a);i=h[1];i>1?a.dpDiv.addClass("ui-datepicker-multi-"+i).css("width",17*i+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(h[0]!=1||h[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==b.datepicker._curInst&&b.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&\r
-a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var j=a.yearshtml;setTimeout(function(){j===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);j=a.yearshtml=null},0)}},_getBorders:function(a){var c=function(h){return{thin:1,medium:2,thick:3}[h]||h};return[parseFloat(c(a.css("border-left-width"))),parseFloat(c(a.css("border-top-width")))]},_checkOffset:function(a,c,h){var i=a.dpDiv.outerWidth(),j=a.dpDiv.outerHeight(),n=a.input?a.input.outerWidth():\r
-0,p=a.input?a.input.outerHeight():0,l=document.documentElement.clientWidth+b(document).scrollLeft(),k=document.documentElement.clientHeight+b(document).scrollTop();c.left-=this._get(a,"isRTL")?i-n:0;c.left-=h&&c.left==a.input.offset().left?b(document).scrollLeft():0;c.top-=h&&c.top==a.input.offset().top+p?b(document).scrollTop():0;c.left-=Math.min(c.left,c.left+i>l&&l>i?Math.abs(c.left+i-l):0);c.top-=Math.min(c.top,c.top+j>k&&k>j?Math.abs(j+p):0);return c},_findPos:function(a){for(var c=this._get(this._getInst(a),\r
-"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||b.expr.filters.hidden(a));)a=a[c?"previousSibling":"nextSibling"];a=b(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var c=this._curInst;if(!(!c||a&&c!=b.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(c,"showAnim");var h=this._get(c,"duration"),i=function(){b.datepicker._tidyDialog(c);this._curInst=null};b.effects&&b.effects[a]?c.dpDiv.hide(a,b.datepicker._get(c,"showOptions"),h,i):c.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?\r
-"fadeOut":"hide"](a?h:null,i);a||i();if(a=this._get(c,"onClose"))a.apply(c.input?c.input[0]:null,[c.input?c.input.val():"",c]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(b.blockUI){b.unblockUI();b("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(b.datepicker._curInst){a=\r
-b(a.target);a[0].id!=b.datepicker._mainDivId&&a.parents("#"+b.datepicker._mainDivId).length==0&&!a.hasClass(b.datepicker.markerClassName)&&!a.hasClass(b.datepicker._triggerClass)&&b.datepicker._datepickerShowing&&!(b.datepicker._inDialog&&b.blockUI)&&b.datepicker._hideDatepicker()}},_adjustDate:function(a,c,h){a=b(a);var i=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(i,c+(h=="M"?this._get(i,"showCurrentAtPos"):0),h);this._updateDatepicker(i)}},_gotoToday:function(a){a=\r
-b(a);var c=this._getInst(a[0]);if(this._get(c,"gotoCurrent")&&c.currentDay){c.selectedDay=c.currentDay;c.drawMonth=c.selectedMonth=c.currentMonth;c.drawYear=c.selectedYear=c.currentYear}else{var h=new Date;c.selectedDay=h.getDate();c.drawMonth=c.selectedMonth=h.getMonth();c.drawYear=c.selectedYear=h.getFullYear()}this._notifyChange(c);this._adjustDate(a)},_selectMonthYear:function(a,c,h){a=b(a);var i=this._getInst(a[0]);i._selectingMonthYear=false;i["selected"+(h=="M"?"Month":"Year")]=i["draw"+(h==\r
-"M"?"Month":"Year")]=parseInt(c.options[c.selectedIndex].value,10);this._notifyChange(i);this._adjustDate(a)},_clickMonthYear:function(a){var c=this._getInst(b(a)[0]);c.input&&c._selectingMonthYear&&setTimeout(function(){c.input.focus()},0);c._selectingMonthYear=!c._selectingMonthYear},_selectDay:function(a,c,h,i){var j=b(a);if(!(b(i).hasClass(this._unselectableClass)||this._isDisabledDatepicker(j[0]))){j=this._getInst(j[0]);j.selectedDay=j.currentDay=b("a",i).html();j.selectedMonth=j.currentMonth=\r
-c;j.selectedYear=j.currentYear=h;this._selectDate(a,this._formatDate(j,j.currentDay,j.currentMonth,j.currentYear))}},_clearDate:function(a){a=b(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,c){a=this._getInst(b(a)[0]);c=c!=null?c:this._formatDate(a);a.input&&a.input.val(c);this._updateAlternate(a);var h=this._get(a,"onSelect");if(h)h.apply(a.input?a.input[0]:null,[c,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();\r
-this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var c=this._get(a,"altField");if(c){var h=this._get(a,"altFormat")||this._get(a,"dateFormat"),i=this._getDate(a),j=this.formatDate(h,i,this._getFormatConfig(a));b(c).each(function(){b(this).val(j)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var c=a.getTime();a.setMonth(0);\r
-a.setDate(1);return Math.floor(Math.round((c-a)/864E5)/7)+1},parseDate:function(a,c,h){if(a==null||c==null)throw"Invalid arguments";c=typeof c=="object"?c.toString():c+"";if(c=="")return null;var i=(h?h.shortYearCutoff:null)||this._defaults.shortYearCutoff;i=typeof i!="string"?i:(new Date).getFullYear()%100+parseInt(i,10);for(var j=(h?h.dayNamesShort:null)||this._defaults.dayNamesShort,n=(h?h.dayNames:null)||this._defaults.dayNames,p=(h?h.monthNamesShort:null)||this._defaults.monthNamesShort,l=(h?\r
-h.monthNames:null)||this._defaults.monthNames,k=h=-1,m=-1,o=-1,q=false,s=function(x){(x=y+1<a.length&&a.charAt(y+1)==x)&&y++;return x},r=function(x){var C=s(x);x=new RegExp("^\\d{1,"+(x=="@"?14:x=="!"?20:x=="y"&&C?4:x=="o"?3:2)+"}");x=c.substring(w).match(x);if(!x)throw"Missing number at position "+w;w+=x[0].length;return parseInt(x[0],10)},u=function(x,C,J){x=s(x)?J:C;for(C=0;C<x.length;C++)if(c.substr(w,x[C].length).toLowerCase()==x[C].toLowerCase()){w+=x[C].length;return C+1}throw"Unknown name at position "+\r
-w;},v=function(){if(c.charAt(w)!=a.charAt(y))throw"Unexpected literal at position "+w;w++},w=0,y=0;y<a.length;y++)if(q)if(a.charAt(y)=="'"&&!s("'"))q=false;else v();else switch(a.charAt(y)){case "d":m=r("d");break;case "D":u("D",j,n);break;case "o":o=r("o");break;case "m":k=r("m");break;case "M":k=u("M",p,l);break;case "y":h=r("y");break;case "@":var B=new Date(r("@"));h=B.getFullYear();k=B.getMonth()+1;m=B.getDate();break;case "!":B=new Date((r("!")-this._ticksTo1970)/1E4);h=B.getFullYear();k=B.getMonth()+\r
-1;m=B.getDate();break;case "'":if(s("'"))v();else q=true;break;default:v()}if(h==-1)h=(new Date).getFullYear();else if(h<100)h+=(new Date).getFullYear()-(new Date).getFullYear()%100+(h<=i?0:-100);if(o>-1){k=1;m=o;do{i=this._getDaysInMonth(h,k-1);if(m<=i)break;k++;m-=i}while(1)}B=this._daylightSavingAdjust(new Date(h,k-1,m));if(B.getFullYear()!=h||B.getMonth()+1!=k||B.getDate()!=m)throw"Invalid date";return B},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",\r
-RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,c,h){if(!c)return"";var i=(h?h.dayNamesShort:null)||this._defaults.dayNamesShort,j=(h?h.dayNames:null)||this._defaults.dayNames,n=(h?h.monthNamesShort:null)||this._defaults.monthNamesShort;h=(h?h.monthNames:null)||this._defaults.monthNames;var p=function(s){(s=q+1<a.length&&\r
-a.charAt(q+1)==s)&&q++;return s},l=function(s,r,u){r=""+r;if(p(s))for(;r.length<u;)r="0"+r;return r},k=function(s,r,u,v){return p(s)?v[r]:u[r]},m="",o=false;if(c)for(var q=0;q<a.length;q++)if(o)if(a.charAt(q)=="'"&&!p("'"))o=false;else m+=a.charAt(q);else switch(a.charAt(q)){case "d":m+=l("d",c.getDate(),2);break;case "D":m+=k("D",c.getDay(),i,j);break;case "o":m+=l("o",(c.getTime()-(new Date(c.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":m+=l("m",c.getMonth()+1,2);break;case "M":m+=k("M",\r
-c.getMonth(),n,h);break;case "y":m+=p("y")?c.getFullYear():(c.getYear()%100<10?"0":"")+c.getYear()%100;break;case "@":m+=c.getTime();break;case "!":m+=c.getTime()*1E4+this._ticksTo1970;break;case "'":if(p("'"))m+="'";else o=true;break;default:m+=a.charAt(q)}return m},_possibleChars:function(a){for(var c="",h=false,i=function(n){(n=j+1<a.length&&a.charAt(j+1)==n)&&j++;return n},j=0;j<a.length;j++)if(h)if(a.charAt(j)=="'"&&!i("'"))h=false;else c+=a.charAt(j);else switch(a.charAt(j)){case "d":case "m":case "y":case "@":c+=\r
-"0123456789";break;case "D":case "M":return null;case "'":if(i("'"))c+="'";else h=true;break;default:c+=a.charAt(j)}return c},_get:function(a,c){return a.settings[c]!==d?a.settings[c]:this._defaults[c]},_setDateFromField:function(a,c){if(a.input.val()!=a.lastVal){var h=this._get(a,"dateFormat"),i=a.lastVal=a.input?a.input.val():null,j,n;j=n=this._getDefaultDate(a);var p=this._getFormatConfig(a);try{j=this.parseDate(h,i,p)||n}catch(l){this.log(l);i=c?"":i}a.selectedDay=j.getDate();a.drawMonth=a.selectedMonth=\r
-j.getMonth();a.drawYear=a.selectedYear=j.getFullYear();a.currentDay=i?j.getDate():0;a.currentMonth=i?j.getMonth():0;a.currentYear=i?j.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,c,h){var i=function(n){var p=new Date;p.setDate(p.getDate()+n);return p},j=function(n){try{return b.datepicker.parseDate(b.datepicker._get(a,"dateFormat"),n,b.datepicker._getFormatConfig(a))}catch(p){}var l=\r
-(n.toLowerCase().match(/^c/)?b.datepicker._getDate(a):null)||new Date,k=l.getFullYear(),m=l.getMonth();l=l.getDate();for(var o=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,q=o.exec(n);q;){switch(q[2]||"d"){case "d":case "D":l+=parseInt(q[1],10);break;case "w":case "W":l+=parseInt(q[1],10)*7;break;case "m":case "M":m+=parseInt(q[1],10);l=Math.min(l,b.datepicker._getDaysInMonth(k,m));break;case "y":case "Y":k+=parseInt(q[1],10);l=Math.min(l,b.datepicker._getDaysInMonth(k,m));break}q=o.exec(n)}return new Date(k,\r
-m,l)};if(c=(c=c==null||c===""?h:typeof c=="string"?j(c):typeof c=="number"?isNaN(c)?h:i(c):new Date(c.getTime()))&&c.toString()=="Invalid Date"?h:c){c.setHours(0);c.setMinutes(0);c.setSeconds(0);c.setMilliseconds(0)}return this._daylightSavingAdjust(c)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,c,h){var i=!c,j=a.selectedMonth,n=a.selectedYear;c=this._restrictMinMax(a,this._determineDate(a,c,new Date));a.selectedDay=\r
-a.currentDay=c.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=c.getMonth();a.drawYear=a.selectedYear=a.currentYear=c.getFullYear();if((j!=a.selectedMonth||n!=a.selectedYear)&&!h)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(i?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var c=new Date;c=this._daylightSavingAdjust(new Date(c.getFullYear(),\r
-c.getMonth(),c.getDate()));var h=this._get(a,"isRTL"),i=this._get(a,"showButtonPanel"),j=this._get(a,"hideIfNoPrevNext"),n=this._get(a,"navigationAsDateFormat"),p=this._getNumberOfMonths(a),l=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),m=p[0]!=1||p[1]!=1,o=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),q=this._getMinMaxDate(a,"min"),s=this._getMinMaxDate(a,"max");l=a.drawMonth-l;var r=a.drawYear;if(l<0){l+=12;r--}if(s){var u=\r
-this._daylightSavingAdjust(new Date(s.getFullYear(),s.getMonth()-p[0]*p[1]+1,s.getDate()));for(u=q&&u<q?q:u;this._daylightSavingAdjust(new Date(r,l,1))>u;){l--;if(l<0){l=11;r--}}}a.drawMonth=l;a.drawYear=r;u=this._get(a,"prevText");u=!n?u:this.formatDate(u,this._daylightSavingAdjust(new Date(r,l-k,1)),this._getFormatConfig(a));u=this._canAdjustMonth(a,-1,r,l)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+u+'"><span class="ui-icon ui-icon-circle-triangle-'+\r
-(h?"e":"w")+'">'+u+"</span></a>":j?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+u+'"><span class="ui-icon ui-icon-circle-triangle-'+(h?"e":"w")+'">'+u+"</span></a>";var v=this._get(a,"nextText");v=!n?v:this.formatDate(v,this._daylightSavingAdjust(new Date(r,l+k,1)),this._getFormatConfig(a));j=this._canAdjustMonth(a,+1,r,l)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+v+'"><span class="ui-icon ui-icon-circle-triangle-'+\r
-(h?"w":"e")+'">'+v+"</span></a>":j?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+v+'"><span class="ui-icon ui-icon-circle-triangle-'+(h?"w":"e")+'">'+v+"</span></a>";k=this._get(a,"currentText");v=this._get(a,"gotoCurrent")&&a.currentDay?o:c;k=!n?k:this.formatDate(k,v,this._getFormatConfig(a));n=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+f+'.datepicker._hideDatepicker();">'+this._get(a,\r
-"closeText")+"</button>":"";i=i?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(h?n:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(h?"":n)+"</div>":"";n=parseInt(this._get(a,"firstDay"),10);n=isNaN(n)?0:n;k=this._get(a,"showWeek");v=this._get(a,"dayNames");this._get(a,"dayNamesShort");var w=this._get(a,"dayNamesMin"),y=\r
-this._get(a,"monthNames"),B=this._get(a,"monthNamesShort"),x=this._get(a,"beforeShowDay"),C=this._get(a,"showOtherMonths"),J=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),K="",G=0;G<p[0];G++){for(var N="",H=0;H<p[1];H++){var O=this._daylightSavingAdjust(new Date(r,l,a.selectedDay)),A=" ui-corner-all",D="";if(m){D+='<div class="ui-datepicker-group';if(p[1]>1)switch(H){case 0:D+=" ui-datepicker-group-first";A=" ui-corner-"+(h?"right":"left");break;case p[1]-\r
-1:D+=" ui-datepicker-group-last";A=" ui-corner-"+(h?"left":"right");break;default:D+=" ui-datepicker-group-middle";A="";break}D+='">'}D+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+A+'">'+(/all|left/.test(A)&&G==0?h?j:u:"")+(/all|right/.test(A)&&G==0?h?u:j:"")+this._generateMonthYearHeader(a,l,r,q,s,G>0||H>0,y,B)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var E=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(A=0;A<7;A++){var z=\r
-(A+n)%7;E+="<th"+((A+n+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+v[z]+'">'+w[z]+"</span></th>"}D+=E+"</tr></thead><tbody>";E=this._getDaysInMonth(r,l);if(r==a.selectedYear&&l==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,E);A=(this._getFirstDayOfMonth(r,l)-n+7)%7;E=m?6:Math.ceil((A+E)/7);z=this._daylightSavingAdjust(new Date(r,l,1-A));for(var P=0;P<E;P++){D+="<tr>";var Q=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(z)+"</td>";for(A=0;A<7;A++){var I=\r
-x?x.apply(a.input?a.input[0]:null,[z]):[true,""],F=z.getMonth()!=l,L=F&&!J||!I[0]||q&&z<q||s&&z>s;Q+='<td class="'+((A+n+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(z.getTime()==O.getTime()&&l==a.selectedMonth&&a._keyEvent||M.getTime()==z.getTime()&&M.getTime()==O.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!C?"":" "+I[1]+(z.getTime()==o.getTime()?" "+this._currentClass:"")+(z.getTime()==c.getTime()?" ui-datepicker-today":\r
-""))+'"'+((!F||C)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+f+".datepicker._selectDay('#"+a.id+"',"+z.getMonth()+","+z.getFullYear()+', this);return false;"')+">"+(F&&!C?"&#xa0;":L?'<span class="ui-state-default">'+z.getDate()+"</span>":'<a class="ui-state-default'+(z.getTime()==c.getTime()?" ui-state-highlight":"")+(z.getTime()==o.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+z.getDate()+"</a>")+"</td>";z.setDate(z.getDate()+1);z=this._daylightSavingAdjust(z)}D+=\r
-Q+"</tr>"}l++;if(l>11){l=0;r++}D+="</tbody></table>"+(m?"</div>"+(p[0]>0&&H==p[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");N+=D}K+=N}K+=i+(b.browser.msie&&parseInt(b.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return K},_generateMonthYearHeader:function(a,c,h,i,j,n,p,l){var k=this._get(a,"changeMonth"),m=this._get(a,"changeYear"),o=this._get(a,"showMonthAfterYear"),q='<div class="ui-datepicker-title">',\r
-s="";if(n||!k)s+='<span class="ui-datepicker-month">'+p[c]+"</span>";else{p=i&&i.getFullYear()==h;var r=j&&j.getFullYear()==h;s+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+f+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+f+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var u=0;u<12;u++)if((!p||u>=i.getMonth())&&(!r||u<=j.getMonth()))s+='<option value="'+u+'"'+(u==c?' selected="selected"':"")+">"+l[u]+"</option>";s+="</select>"}o||(q+=s+(n||!(k&&\r
-m)?"&#xa0;":""));a.yearshtml="";if(n||!m)q+='<span class="ui-datepicker-year">'+h+"</span>";else{l=this._get(a,"yearRange").split(":");var v=(new Date).getFullYear();p=function(w){w=w.match(/c[+-].*/)?h+parseInt(w.substring(1),10):w.match(/[+-].*/)?v+parseInt(w,10):parseInt(w,10);return isNaN(w)?v:w};c=p(l[0]);l=Math.max(c,p(l[1]||""));c=i?Math.max(c,i.getFullYear()):c;l=j?Math.min(l,j.getFullYear()):l;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+f+".datepicker._selectMonthYear('#"+\r
-a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+f+".datepicker._clickMonthYear('#"+a.id+"');\">";c<=l;c++)a.yearshtml+='<option value="'+c+'"'+(c==h?' selected="selected"':"")+">"+c+"</option>";a.yearshtml+="</select>";if(b.browser.mozilla)q+='<select class="ui-datepicker-year"><option value="'+h+'" selected="selected">'+h+"</option></select>";else{q+=a.yearshtml;a.yearshtml=null}}q+=this._get(a,"yearSuffix");if(o)q+=(n||!(k&&m)?"&#xa0;":"")+s;q+="</div>";return q},_adjustInstDate:function(a,c,h){var i=\r
-a.drawYear+(h=="Y"?c:0),j=a.drawMonth+(h=="M"?c:0);c=Math.min(a.selectedDay,this._getDaysInMonth(i,j))+(h=="D"?c:0);i=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(i,j,c)));a.selectedDay=i.getDate();a.drawMonth=a.selectedMonth=i.getMonth();a.drawYear=a.selectedYear=i.getFullYear();if(h=="M"||h=="Y")this._notifyChange(a)},_restrictMinMax:function(a,c){var h=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");c=h&&c<h?h:c;return c=a&&c>a?a:c},_notifyChange:function(a){var c=this._get(a,\r
-"onChangeMonthYear");if(c)c.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,c){return this._determineDate(a,this._get(a,c+"Date"),null)},_getDaysInMonth:function(a,c){return 32-this._daylightSavingAdjust(new Date(a,c,32)).getDate()},_getFirstDayOfMonth:function(a,c){return(new Date(a,c,1)).getDay()},_canAdjustMonth:function(a,c,h,i){var j=this._getNumberOfMonths(a);\r
-h=this._daylightSavingAdjust(new Date(h,i+(c<0?c:j[0]*j[1]),1));c<0&&h.setDate(this._getDaysInMonth(h.getFullYear(),h.getMonth()));return this._isInRange(a,h)},_isInRange:function(a,c){var h=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!h||c.getTime()>=h.getTime())&&(!a||c.getTime()<=a.getTime())},_getFormatConfig:function(a){var c=this._get(a,"shortYearCutoff");c=typeof c!="string"?c:(new Date).getFullYear()%100+parseInt(c,10);return{shortYearCutoff:c,dayNamesShort:this._get(a,\r
-"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,c,h,i){if(!c){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}c=c?typeof c=="object"?c:this._daylightSavingAdjust(new Date(i,h,c)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),c,this._getFormatConfig(a))}});b.fn.datepicker=\r
-function(a){if(!this.length)return this;if(!b.datepicker.initialized){b(document).mousedown(b.datepicker._checkExternalClick).find("body").append(b.datepicker.dpDiv);b.datepicker.initialized=true}var c=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this[0]].concat(c));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,\r
-[this[0]].concat(c));return this.each(function(){typeof a=="string"?b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this].concat(c)):b.datepicker._attachDatepicker(this,a)})};b.datepicker=new e;b.datepicker.initialized=false;b.datepicker.uuid=(new Date).getTime();b.datepicker.version="1.8.11";window["DP_jQuery_"+f]=b})(jQuery);\r
-(function(b,d){var e={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},g={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};b.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(f){var a=b(this).css(f).offset().top;a<0&&\r
-b(this).css("top",f.top-a)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var f=this,a=f.options,c=a.title||"&#160;",h=b.ui.dialog.getTitleId(f.element),i=(f.uiDialog=b("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+a.dialogClass).css({zIndex:a.zIndex}).attr("tabIndex",\r
--1).css("outline",0).keydown(function(p){if(a.closeOnEscape&&p.keyCode&&p.keyCode===b.ui.keyCode.ESCAPE){f.close(p);p.preventDefault()}}).attr({role:"dialog","aria-labelledby":h}).mousedown(function(p){f.moveToTop(false,p)});f.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(i);var j=(f.uiDialogTitlebar=b("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(i),n=b('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",\r
-"button").hover(function(){n.addClass("ui-state-hover")},function(){n.removeClass("ui-state-hover")}).focus(function(){n.addClass("ui-state-focus")}).blur(function(){n.removeClass("ui-state-focus")}).click(function(p){f.close(p);return false}).appendTo(j);(f.uiDialogTitlebarCloseText=b("<span></span>")).addClass("ui-icon ui-icon-closethick").text(a.closeText).appendTo(n);b("<span></span>").addClass("ui-dialog-title").attr("id",h).html(c).prependTo(j);if(b.isFunction(a.beforeclose)&&!b.isFunction(a.beforeClose))a.beforeClose=\r
-a.beforeclose;j.find("*").add(j).disableSelection();a.draggable&&b.fn.draggable&&f._makeDraggable();a.resizable&&b.fn.resizable&&f._makeResizable();f._createButtons(a.buttons);f._isOpen=false;b.fn.bgiframe&&i.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var f=this;f.overlay&&f.overlay.destroy();f.uiDialog.hide();f.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");f.uiDialog.remove();f.originalTitle&&\r
-f.element.attr("title",f.originalTitle);return f},widget:function(){return this.uiDialog},close:function(f){var a=this,c,h;if(false!==a._trigger("beforeClose",f)){a.overlay&&a.overlay.destroy();a.uiDialog.unbind("keypress.ui-dialog");a._isOpen=false;if(a.options.hide)a.uiDialog.hide(a.options.hide,function(){a._trigger("close",f)});else{a.uiDialog.hide();a._trigger("close",f)}b.ui.dialog.overlay.resize();if(a.options.modal){c=0;b(".ui-dialog").each(function(){if(this!==a.uiDialog[0]){h=b(this).css("z-index");\r
-isNaN(h)||(c=Math.max(c,h))}});b.ui.dialog.maxZ=c}return a}},isOpen:function(){return this._isOpen},moveToTop:function(f,a){var c=this,h=c.options;if(h.modal&&!f||!h.stack&&!h.modal)return c._trigger("focus",a);if(h.zIndex>b.ui.dialog.maxZ)b.ui.dialog.maxZ=h.zIndex;if(c.overlay){b.ui.dialog.maxZ+=1;c.overlay.$el.css("z-index",b.ui.dialog.overlay.maxZ=b.ui.dialog.maxZ)}f={scrollTop:c.element.attr("scrollTop"),scrollLeft:c.element.attr("scrollLeft")};b.ui.dialog.maxZ+=1;c.uiDialog.css("z-index",b.ui.dialog.maxZ);\r
-c.element.attr(f);c._trigger("focus",a);return c},open:function(){if(!this._isOpen){var f=this,a=f.options,c=f.uiDialog;f.overlay=a.modal?new b.ui.dialog.overlay(f):null;f._size();f._position(a.position);c.show(a.show);f.moveToTop(true);a.modal&&c.bind("keypress.ui-dialog",function(h){if(h.keyCode===b.ui.keyCode.TAB){var i=b(":tabbable",this),j=i.filter(":first");i=i.filter(":last");if(h.target===i[0]&&!h.shiftKey){j.focus(1);return false}else if(h.target===j[0]&&h.shiftKey){i.focus(1);return false}}});\r
-b(f.element.find(":tabbable").get().concat(c.find(".ui-dialog-buttonpane :tabbable").get().concat(c.get()))).eq(0).focus();f._isOpen=true;f._trigger("open");return f}},_createButtons:function(f){var a=this,c=false,h=b("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),i=b("<div></div>").addClass("ui-dialog-buttonset").appendTo(h);a.uiDialog.find(".ui-dialog-buttonpane").remove();typeof f==="object"&&f!==null&&b.each(f,function(){return!(c=true)});if(c){b.each(f,function(j,\r
-n){n=b.isFunction(n)?{click:n,text:j}:n;j=b('<button type="button"></button>').attr(n,true).unbind("click").click(function(){n.click.apply(a.element[0],arguments)}).appendTo(i);b.fn.button&&j.button()});h.appendTo(a.uiDialog)}},_makeDraggable:function(){function f(j){return{position:j.position,offset:j.offset}}var a=this,c=a.options,h=b(document),i;a.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(j,n){i=\r
-c.height==="auto"?"auto":b(this).height();b(this).height(b(this).height()).addClass("ui-dialog-dragging");a._trigger("dragStart",j,f(n))},drag:function(j,n){a._trigger("drag",j,f(n))},stop:function(j,n){c.position=[n.position.left-h.scrollLeft(),n.position.top-h.scrollTop()];b(this).removeClass("ui-dialog-dragging").height(i);a._trigger("dragStop",j,f(n));b.ui.dialog.overlay.resize()}})},_makeResizable:function(f){function a(j){return{originalPosition:j.originalPosition,originalSize:j.originalSize,\r
-position:j.position,size:j.size}}f=f===d?this.options.resizable:f;var c=this,h=c.options,i=c.uiDialog.css("position");f=typeof f==="string"?f:"n,e,s,w,se,sw,ne,nw";c.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:c.element,maxWidth:h.maxWidth,maxHeight:h.maxHeight,minWidth:h.minWidth,minHeight:c._minHeight(),handles:f,start:function(j,n){b(this).addClass("ui-dialog-resizing");c._trigger("resizeStart",j,a(n))},resize:function(j,n){c._trigger("resize",j,a(n))},stop:function(j,\r
-n){b(this).removeClass("ui-dialog-resizing");h.height=b(this).height();h.width=b(this).width();c._trigger("resizeStop",j,a(n));b.ui.dialog.overlay.resize()}}).css("position",i).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var f=this.options;return f.height==="auto"?f.minHeight:Math.min(f.minHeight,f.height)},_position:function(f){var a=[],c=[0,0],h;if(f){if(typeof f==="string"||typeof f==="object"&&"0"in f){a=f.split?f.split(" "):[f[0],f[1]];if(a.length===\r
-1)a[1]=a[0];b.each(["left","top"],function(i,j){if(+a[i]===a[i]){c[i]=a[i];a[i]=j}});f={my:a.join(" "),at:a.join(" "),offset:c.join(" ")}}f=b.extend({},b.ui.dialog.prototype.options.position,f)}else f=b.ui.dialog.prototype.options.position;(h=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(b.extend({of:window},f));h||this.uiDialog.hide()},_setOptions:function(f){var a=this,c={},h=false;b.each(f,function(i,j){a._setOption(i,j);if(i in e)h=true;if(i in\r
-g)c[i]=j});h&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",c)},_setOption:function(f,a){var c=this,h=c.uiDialog;switch(f){case "beforeclose":f="beforeClose";break;case "buttons":c._createButtons(a);break;case "closeText":c.uiDialogTitlebarCloseText.text(""+a);break;case "dialogClass":h.removeClass(c.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+a);break;case "disabled":a?h.addClass("ui-dialog-disabled"):h.removeClass("ui-dialog-disabled");\r
-break;case "draggable":var i=h.is(":data(draggable)");i&&!a&&h.draggable("destroy");!i&&a&&c._makeDraggable();break;case "position":c._position(a);break;case "resizable":(i=h.is(":data(resizable)"))&&!a&&h.resizable("destroy");i&&typeof a==="string"&&h.resizable("option","handles",a);!i&&a!==false&&c._makeResizable(a);break;case "title":b(".ui-dialog-title",c.uiDialogTitlebar).html(""+(a||"&#160;"));break}b.Widget.prototype._setOption.apply(c,arguments)},_size:function(){var f=this.options,a,c,h=\r
-this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(f.minWidth>f.width)f.width=f.minWidth;a=this.uiDialog.css({height:"auto",width:f.width}).height();c=Math.max(0,f.minHeight-a);if(f.height==="auto")if(b.support.minHeight)this.element.css({minHeight:c,height:"auto"});else{this.uiDialog.show();f=this.element.css("height","auto").height();h||this.uiDialog.hide();this.element.height(Math.max(f,c))}else this.element.height(Math.max(f.height-a,0));this.uiDialog.is(":data(resizable)")&&\r
-this.uiDialog.resizable("option","minHeight",this._minHeight())}});b.extend(b.ui.dialog,{version:"1.8.11",uuid:0,maxZ:0,getTitleId:function(f){f=f.attr("id");if(!f){this.uuid+=1;f=this.uuid}return"ui-dialog-title-"+f},overlay:function(f){this.$el=b.ui.dialog.overlay.create(f)}});b.extend(b.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:b.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(f){return f+".dialog-overlay"}).join(" "),create:function(f){if(this.instances.length===\r
-0){setTimeout(function(){b.ui.dialog.overlay.instances.length&&b(document).bind(b.ui.dialog.overlay.events,function(c){if(b(c.target).zIndex()<b.ui.dialog.overlay.maxZ)return false})},1);b(document).bind("keydown.dialog-overlay",function(c){if(f.options.closeOnEscape&&c.keyCode&&c.keyCode===b.ui.keyCode.ESCAPE){f.close(c);c.preventDefault()}});b(window).bind("resize.dialog-overlay",b.ui.dialog.overlay.resize)}var a=(this.oldInstances.pop()||b("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),\r
-height:this.height()});b.fn.bgiframe&&a.bgiframe();this.instances.push(a);return a},destroy:function(f){var a=b.inArray(f,this.instances);a!=-1&&this.oldInstances.push(this.instances.splice(a,1)[0]);this.instances.length===0&&b([document,window]).unbind(".dialog-overlay");f.remove();var c=0;b.each(this.instances,function(){c=Math.max(c,this.css("z-index"))});this.maxZ=c},height:function(){var f,a;if(b.browser.msie&&b.browser.version<7){f=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);\r
-a=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return f<a?b(window).height()+"px":f+"px"}else return b(document).height()+"px"},width:function(){var f,a;if(b.browser.msie&&b.browser.version<7){f=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);a=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return f<a?b(window).width()+"px":f+"px"}else return b(document).width()+"px"},resize:function(){var f=b([]);b.each(b.ui.dialog.overlay.instances,\r
-function(){f=f.add(this)});f.css({width:0,height:0}).css({width:b.ui.dialog.overlay.width(),height:b.ui.dialog.overlay.height()})}});b.extend(b.ui.dialog.overlay.prototype,{destroy:function(){b.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);\r
-(function(b){b.ui=b.ui||{};var d=/left|center|right/,e=/top|center|bottom/,g=b.fn.position,f=b.fn.offset;b.fn.position=function(a){if(!a||!a.of)return g.apply(this,arguments);a=b.extend({},a);var c=b(a.of),h=c[0],i=(a.collision||"flip").split(" "),j=a.offset?a.offset.split(" "):[0,0],n,p,l;if(h.nodeType===9){n=c.width();p=c.height();l={top:0,left:0}}else if(h.setTimeout){n=c.width();p=c.height();l={top:c.scrollTop(),left:c.scrollLeft()}}else if(h.preventDefault){a.at="left top";n=p=0;l={top:a.of.pageY,\r
-left:a.of.pageX}}else{n=c.outerWidth();p=c.outerHeight();l=c.offset()}b.each(["my","at"],function(){var k=(a[this]||"").split(" ");if(k.length===1)k=d.test(k[0])?k.concat(["center"]):e.test(k[0])?["center"].concat(k):["center","center"];k[0]=d.test(k[0])?k[0]:"center";k[1]=e.test(k[1])?k[1]:"center";a[this]=k});if(i.length===1)i[1]=i[0];j[0]=parseInt(j[0],10)||0;if(j.length===1)j[1]=j[0];j[1]=parseInt(j[1],10)||0;if(a.at[0]==="right")l.left+=n;else if(a.at[0]==="center")l.left+=n/2;if(a.at[1]==="bottom")l.top+=\r
-p;else if(a.at[1]==="center")l.top+=p/2;l.left+=j[0];l.top+=j[1];return this.each(function(){var k=b(this),m=k.outerWidth(),o=k.outerHeight(),q=parseInt(b.curCSS(this,"marginLeft",true))||0,s=parseInt(b.curCSS(this,"marginTop",true))||0,r=m+q+(parseInt(b.curCSS(this,"marginRight",true))||0),u=o+s+(parseInt(b.curCSS(this,"marginBottom",true))||0),v=b.extend({},l),w;if(a.my[0]==="right")v.left-=m;else if(a.my[0]==="center")v.left-=m/2;if(a.my[1]==="bottom")v.top-=o;else if(a.my[1]==="center")v.top-=\r
-o/2;v.left=Math.round(v.left);v.top=Math.round(v.top);w={left:v.left-q,top:v.top-s};b.each(["left","top"],function(y,B){b.ui.position[i[y]]&&b.ui.position[i[y]][B](v,{targetWidth:n,targetHeight:p,elemWidth:m,elemHeight:o,collisionPosition:w,collisionWidth:r,collisionHeight:u,offset:j,my:a.my,at:a.at})});b.fn.bgiframe&&k.bgiframe();k.offset(b.extend(v,{using:a.using}))})};b.ui.position={fit:{left:function(a,c){var h=b(window);h=c.collisionPosition.left+c.collisionWidth-h.width()-h.scrollLeft();a.left=\r
-h>0?a.left-h:Math.max(a.left-c.collisionPosition.left,a.left)},top:function(a,c){var h=b(window);h=c.collisionPosition.top+c.collisionHeight-h.height()-h.scrollTop();a.top=h>0?a.top-h:Math.max(a.top-c.collisionPosition.top,a.top)}},flip:{left:function(a,c){if(c.at[0]!=="center"){var h=b(window);h=c.collisionPosition.left+c.collisionWidth-h.width()-h.scrollLeft();var i=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,j=c.at[0]==="left"?c.targetWidth:-c.targetWidth,n=-2*c.offset[0];a.left+=\r
-c.collisionPosition.left<0?i+j+n:h>0?i+j+n:0}},top:function(a,c){if(c.at[1]!=="center"){var h=b(window);h=c.collisionPosition.top+c.collisionHeight-h.height()-h.scrollTop();var i=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,j=c.at[1]==="top"?c.targetHeight:-c.targetHeight,n=-2*c.offset[1];a.top+=c.collisionPosition.top<0?i+j+n:h>0?i+j+n:0}}}};if(!b.offset.setOffset){b.offset.setOffset=function(a,c){if(/static/.test(b.curCSS(a,"position")))a.style.position="relative";var h=b(a),\r
-i=h.offset(),j=parseInt(b.curCSS(a,"top",true),10)||0,n=parseInt(b.curCSS(a,"left",true),10)||0;i={top:c.top-i.top+j,left:c.left-i.left+n};"using"in c?c.using.call(a,i):h.css(i)};b.fn.offset=function(a){var c=this[0];if(!c||!c.ownerDocument)return null;if(a)return this.each(function(){b.offset.setOffset(this,a)});return f.call(this)}}})(jQuery);\r
-(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");\r
-this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(e){if(e===d)return this._value();this._setOption("value",e);return this},_setOption:function(e,g){if(e==="value"){this.options.value=g;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var e=this.options.value;if(typeof e!=="number")e=0;return Math.min(this.options.max,Math.max(this.min,e))},_percentage:function(){return 100*\r
-this._value()/this.options.max},_refreshValue:function(){var e=this.value(),g=this._percentage();if(this.oldValue!==e){this.oldValue=e;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",e===this.options.max).width(g.toFixed(0)+"%");this.element.attr("aria-valuenow",e)}});b.extend(b.ui.progressbar,{version:"1.8.11"})})(jQuery);\r
-(function(b){b.widget("ui.slider",b.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var d=this,e=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");e.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");\r
-this.range=b([]);if(e.range){if(e.range===true){this.range=b("<div></div>");if(!e.values)e.values=[this._valueMin(),this._valueMin()];if(e.values.length&&e.values.length!==2)e.values=[e.values[0],e.values[0]]}else this.range=b("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(e.range==="min"||e.range==="max")this.range.addClass("ui-slider-range-"+e.range);this.range.addClass("ui-widget-header")}b(".ui-slider-handle",this.element).length===0&&b("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");\r
-if(e.values&&e.values.length)for(;b(".ui-slider-handle",this.element).length<e.values.length;)b("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=b(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){e.disabled||b(this).addClass("ui-state-hover")},function(){b(this).removeClass("ui-state-hover")}).focus(function(){if(e.disabled)b(this).blur();\r
-else{b(".ui-slider .ui-state-focus").removeClass("ui-state-focus");b(this).addClass("ui-state-focus")}}).blur(function(){b(this).removeClass("ui-state-focus")});this.handles.each(function(g){b(this).data("index.ui-slider-handle",g)});this.handles.keydown(function(g){var f=true,a=b(this).data("index.ui-slider-handle"),c,h,i;if(!d.options.disabled){switch(g.keyCode){case b.ui.keyCode.HOME:case b.ui.keyCode.END:case b.ui.keyCode.PAGE_UP:case b.ui.keyCode.PAGE_DOWN:case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:f=\r
-false;if(!d._keySliding){d._keySliding=true;b(this).addClass("ui-state-active");c=d._start(g,a);if(c===false)return}break}i=d.options.step;c=d.options.values&&d.options.values.length?(h=d.values(a)):(h=d.value());switch(g.keyCode){case b.ui.keyCode.HOME:h=d._valueMin();break;case b.ui.keyCode.END:h=d._valueMax();break;case b.ui.keyCode.PAGE_UP:h=d._trimAlignValue(c+(d._valueMax()-d._valueMin())/5);break;case b.ui.keyCode.PAGE_DOWN:h=d._trimAlignValue(c-(d._valueMax()-d._valueMin())/5);break;case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:if(c===\r
-d._valueMax())return;h=d._trimAlignValue(c+i);break;case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:if(c===d._valueMin())return;h=d._trimAlignValue(c-i);break}d._slide(g,a,h);return f}}).keyup(function(g){var f=b(this).data("index.ui-slider-handle");if(d._keySliding){d._keySliding=false;d._stop(g,f);d._change(g,f);b(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");\r
-this._mouseDestroy();return this},_mouseCapture:function(d){var e=this.options,g,f,a,c,h;if(e.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();g=this._normValueFromMouse({x:d.pageX,y:d.pageY});f=this._valueMax()-this._valueMin()+1;c=this;this.handles.each(function(i){var j=Math.abs(g-c.values(i));if(f>j){f=j;a=b(this);h=i}});if(e.range===true&&this.values(1)===e.min){h+=1;a=b(this.handles[h])}if(this._start(d,\r
-h)===false)return false;this._mouseSliding=true;c._handleIndex=h;a.addClass("ui-state-active").focus();e=a.offset();this._clickOffset=!b(d.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:d.pageX-e.left-a.width()/2,top:d.pageY-e.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(d,h,g);return this._animateOff=true},_mouseStart:function(){return true},\r
-_mouseDrag:function(d){var e=this._normValueFromMouse({x:d.pageX,y:d.pageY});this._slide(d,this._handleIndex,e);return false},_mouseStop:function(d){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(d,this._handleIndex);this._change(d,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(d){var e;\r
-if(this.orientation==="horizontal"){e=this.elementSize.width;d=d.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{e=this.elementSize.height;d=d.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}e=d/e;if(e>1)e=1;if(e<0)e=0;if(this.orientation==="vertical")e=1-e;d=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+e*d)},_start:function(d,e){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=\r
-this.values(e);g.values=this.values()}return this._trigger("start",d,g)},_slide:function(d,e,g){var f;if(this.options.values&&this.options.values.length){f=this.values(e?0:1);if(this.options.values.length===2&&this.options.range===true&&(e===0&&g>f||e===1&&g<f))g=f;if(g!==this.values(e)){f=this.values();f[e]=g;d=this._trigger("slide",d,{handle:this.handles[e],value:g,values:f});this.values(e?0:1);d!==false&&this.values(e,g,true)}}else if(g!==this.value()){d=this._trigger("slide",d,{handle:this.handles[e],\r
-value:g});d!==false&&this.value(g)}},_stop:function(d,e){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=this.values(e);g.values=this.values()}this._trigger("stop",d,g)},_change:function(d,e){if(!this._keySliding&&!this._mouseSliding){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=this.values(e);g.values=this.values()}this._trigger("change",d,g)}},value:function(d){if(arguments.length){this.options.value=\r
-this._trimAlignValue(d);this._refreshValue();this._change(null,0)}return this._value()},values:function(d,e){var g,f,a;if(arguments.length>1){this.options.values[d]=this._trimAlignValue(e);this._refreshValue();this._change(null,d)}if(arguments.length)if(b.isArray(arguments[0])){g=this.options.values;f=arguments[0];for(a=0;a<g.length;a+=1){g[a]=this._trimAlignValue(f[a]);this._change(null,a)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(d):this.value();\r
-else return this._values()},_setOption:function(d,e){var g,f=0;if(b.isArray(this.options.values))f=this.options.values.length;b.Widget.prototype._setOption.apply(this,arguments);switch(d){case "disabled":if(e){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();\r
-this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(g=0;g<f;g+=1)this._change(null,g);this._animateOff=false;break}},_value:function(){var d=this.options.value;return d=this._trimAlignValue(d)},_values:function(d){var e,g;if(arguments.length){e=this.options.values[d];\r
-return e=this._trimAlignValue(e)}else{e=this.options.values.slice();for(g=0;g<e.length;g+=1)e[g]=this._trimAlignValue(e[g]);return e}},_trimAlignValue:function(d){if(d<=this._valueMin())return this._valueMin();if(d>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,g=(d-this._valueMin())%e;alignValue=d-g;if(Math.abs(g)*2>=e)alignValue+=g>0?e:-e;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},\r
-_refreshValue:function(){var d=this.options.range,e=this.options,g=this,f=!this._animateOff?e.animate:false,a,c={},h,i,j,n;if(this.options.values&&this.options.values.length)this.handles.each(function(p){a=(g.values(p)-g._valueMin())/(g._valueMax()-g._valueMin())*100;c[g.orientation==="horizontal"?"left":"bottom"]=a+"%";b(this).stop(1,1)[f?"animate":"css"](c,e.animate);if(g.options.range===true)if(g.orientation==="horizontal"){if(p===0)g.range.stop(1,1)[f?"animate":"css"]({left:a+"%"},e.animate);\r
-if(p===1)g.range[f?"animate":"css"]({width:a-h+"%"},{queue:false,duration:e.animate})}else{if(p===0)g.range.stop(1,1)[f?"animate":"css"]({bottom:a+"%"},e.animate);if(p===1)g.range[f?"animate":"css"]({height:a-h+"%"},{queue:false,duration:e.animate})}h=a});else{i=this.value();j=this._valueMin();n=this._valueMax();a=n!==j?(i-j)/(n-j)*100:0;c[g.orientation==="horizontal"?"left":"bottom"]=a+"%";this.handle.stop(1,1)[f?"animate":"css"](c,e.animate);if(d==="min"&&this.orientation==="horizontal")this.range.stop(1,\r
-1)[f?"animate":"css"]({width:a+"%"},e.animate);if(d==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-a+"%"},{queue:false,duration:e.animate});if(d==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:a+"%"},e.animate);if(d==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-a+"%"},{queue:false,duration:e.animate})}}});b.extend(b.ui.slider,{version:"1.8.11"})})(jQuery);\r
-(function(b,d){function e(){return++f}function g(){return++a}var f=0,a=0;b.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(c,h){if(c=="selected")this.options.collapsible&&\r
-h==this.options.selected||this.select(h);else{this.options[c]=h;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+g());return b.cookie.apply(null,[c].concat(b.makeArray(arguments)))},_ui:function(c,h){return{tab:c,panel:h,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c=\r
-b(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function h(r,u){r.css("display","");!b.support.opacity&&u.opacity&&r[0].style.removeAttribute("filter")}var i=this,j=this.options,n=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=b(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return b("a",this)[0]});this.panels=b([]);this.anchors.each(function(r,u){var v=b(u).attr("href"),w=v.split("#")[0],y;if(w&&(w===location.toString().split("#")[0]||\r
-(y=b("base")[0])&&w===y.href)){v=u.hash;u.href=v}if(n.test(v))i.panels=i.panels.add(i.element.find(i._sanitizeSelector(v)));else if(v&&v!=="#"){b.data(u,"href.tabs",v);b.data(u,"load.tabs",v.replace(/#.*$/,""));v=i._tabId(u);u.href="#"+v;u=i.element.find("#"+v);if(!u.length){u=b(j.panelTemplate).attr("id",v).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(i.panels[r-1]||i.list);u.data("destroy.tabs",true)}i.panels=i.panels.add(u)}else j.disabled.push(r)});if(c){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");\r
-this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(j.selected===d){location.hash&&this.anchors.each(function(r,u){if(u.hash==location.hash){j.selected=r;return false}});if(typeof j.selected!=="number"&&j.cookie)j.selected=parseInt(i._cookie(),10);if(typeof j.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)j.selected=\r
-this.lis.index(this.lis.filter(".ui-tabs-selected"));j.selected=j.selected||(this.lis.length?0:-1)}else if(j.selected===null)j.selected=-1;j.selected=j.selected>=0&&this.anchors[j.selected]||j.selected<0?j.selected:0;j.disabled=b.unique(j.disabled.concat(b.map(this.lis.filter(".ui-state-disabled"),function(r){return i.lis.index(r)}))).sort();b.inArray(j.selected,j.disabled)!=-1&&j.disabled.splice(b.inArray(j.selected,j.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");\r
-if(j.selected>=0&&this.anchors.length){i.element.find(i._sanitizeSelector(i.anchors[j.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(j.selected).addClass("ui-tabs-selected ui-state-active");i.element.queue("tabs",function(){i._trigger("show",null,i._ui(i.anchors[j.selected],i.element.find(i._sanitizeSelector(i.anchors[j.selected].hash))[0]))});this.load(j.selected)}b(window).bind("unload",function(){i.lis.add(i.anchors).unbind(".tabs");i.lis=i.anchors=i.panels=null})}else j.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));\r
-this.element[j.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");j.cookie&&this._cookie(j.selected,j.cookie);c=0;for(var p;p=this.lis[c];c++)b(p)[b.inArray(c,j.disabled)!=-1&&!b(p).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");j.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(j.event!=="mouseover"){var l=function(r,u){u.is(":not(.ui-state-disabled)")&&u.addClass("ui-state-"+r)},k=function(r,u){u.removeClass("ui-state-"+\r
-r)};this.lis.bind("mouseover.tabs",function(){l("hover",b(this))});this.lis.bind("mouseout.tabs",function(){k("hover",b(this))});this.anchors.bind("focus.tabs",function(){l("focus",b(this).closest("li"))});this.anchors.bind("blur.tabs",function(){k("focus",b(this).closest("li"))})}var m,o;if(j.fx)if(b.isArray(j.fx)){m=j.fx[0];o=j.fx[1]}else m=o=j.fx;var q=o?function(r,u){b(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",\r
-function(){h(u,o);i._trigger("show",null,i._ui(r,u[0]))})}:function(r,u){b(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.removeClass("ui-tabs-hide");i._trigger("show",null,i._ui(r,u[0]))},s=m?function(r,u){u.animate(m,m.duration||"normal",function(){i.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");h(u,m);i.element.dequeue("tabs")})}:function(r,u){i.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");i.element.dequeue("tabs")};\r
-this.anchors.bind(j.event+".tabs",function(){var r=this,u=b(r).closest("li"),v=i.panels.filter(":not(.ui-tabs-hide)"),w=i.element.find(i._sanitizeSelector(r.hash));if(u.hasClass("ui-tabs-selected")&&!j.collapsible||u.hasClass("ui-state-disabled")||u.hasClass("ui-state-processing")||i.panels.filter(":animated").length||i._trigger("select",null,i._ui(this,w[0]))===false){this.blur();return false}j.selected=i.anchors.index(this);i.abort();if(j.collapsible)if(u.hasClass("ui-tabs-selected")){j.selected=\r
--1;j.cookie&&i._cookie(j.selected,j.cookie);i.element.queue("tabs",function(){s(r,v)}).dequeue("tabs");this.blur();return false}else if(!v.length){j.cookie&&i._cookie(j.selected,j.cookie);i.element.queue("tabs",function(){q(r,w)});i.load(i.anchors.index(this));this.blur();return false}j.cookie&&i._cookie(j.selected,j.cookie);if(w.length){v.length&&i.element.queue("tabs",function(){s(r,v)});i.element.queue("tabs",function(){q(r,w)});i.load(i.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";\r
-b.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));return c},destroy:function(){var c=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var h=\r
-b.data(this,"href.tabs");if(h)this.href=h;var i=b(this).unbind(".tabs");b.each(["href","load","cache"],function(j,n){i.removeData(n+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){b.data(this,"destroy.tabs")?b(this).remove():b(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,\r
-h,i){if(i===d)i=this.anchors.length;var j=this,n=this.options;h=b(n.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,h));c=!c.indexOf("#")?c.replace("#",""):this._tabId(b("a",h)[0]);h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var p=j.element.find("#"+c);p.length||(p=b(n.panelTemplate).attr("id",c).data("destroy.tabs",true));p.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(i>=this.lis.length){h.appendTo(this.list);p.appendTo(this.list[0].parentNode)}else{h.insertBefore(this.lis[i]);\r
-p.insertBefore(this.panels[i])}n.disabled=b.map(n.disabled,function(l){return l>=i?++l:l});this._tabify();if(this.anchors.length==1){n.selected=0;h.addClass("ui-tabs-selected ui-state-active");p.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){j._trigger("show",null,j._ui(j.anchors[0],j.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[i],this.panels[i]));return this},remove:function(c){c=this._getIndex(c);var h=this.options,i=this.lis.eq(c).remove(),j=this.panels.eq(c).remove();\r
-if(i.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1<this.anchors.length?1:-1));h.disabled=b.map(b.grep(h.disabled,function(n){return n!=c}),function(n){return n>=c?--n:n});this._tabify();this._trigger("remove",null,this._ui(i.find("a")[0],j[0]));return this},enable:function(c){c=this._getIndex(c);var h=this.options;if(b.inArray(c,h.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");h.disabled=b.grep(h.disabled,function(i){return i!=c});this._trigger("enable",null,\r
-this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){c=this._getIndex(c);var h=this.options;if(c!=h.selected){this.lis.eq(c).addClass("ui-state-disabled");h.disabled.push(c);h.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this},select:function(c){c=this._getIndex(c);if(c==-1)if(this.options.collapsible&&this.options.selected!=-1)c=this.options.selected;else return this;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},\r
-load:function(c){c=this._getIndex(c);var h=this,i=this.options,j=this.anchors.eq(c)[0],n=b.data(j,"load.tabs");this.abort();if(!n||this.element.queue("tabs").length!==0&&b.data(j,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing");if(i.spinner){var p=b("span",j);p.data("label.tabs",p.html()).html(i.spinner)}this.xhr=b.ajax(b.extend({},i.ajaxOptions,{url:n,success:function(l,k){h.element.find(h._sanitizeSelector(j.hash)).html(l);h._cleanup();i.cache&&b.data(j,\r
-"cache.tabs",true);h._trigger("load",null,h._ui(h.anchors[c],h.panels[c]));try{i.ajaxOptions.success(l,k)}catch(m){}},error:function(l,k){h._cleanup();h._trigger("load",null,h._ui(h.anchors[c],h.panels[c]));try{i.ajaxOptions.error(l,k,c,j)}catch(m){}}}));h.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},\r
-url:function(c,h){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",h);return this},length:function(){return this.anchors.length}});b.extend(b.ui.tabs,{version:"1.8.11"});b.extend(b.ui.tabs.prototype,{rotation:null,rotate:function(c,h){var i=this,j=this.options,n=i._rotate||(i._rotate=function(p){clearTimeout(i.rotation);i.rotation=setTimeout(function(){var l=j.selected;i.select(++l<i.anchors.length?l:0)},c);p&&p.stopPropagation()});h=i._unrotate||(i._unrotate=!h?function(p){p.clientX&&\r
+/*!
+ * jQuery UI 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(b,d){function e(g){return!b(g).parents().andSelf().filter(function(){return b.curCSS(this,"visibility")==="hidden"||b.expr.filters.hidden(this)}).length}b.ui=b.ui||{};if(!b.ui.version){b.extend(b.ui,{version:"1.8.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
+NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});b.fn.extend({_focus:b.fn.focus,focus:function(g,f){return typeof g==="number"?this.each(function(){var a=this;setTimeout(function(){b(a).focus();f&&f.call(a)},g)}):this._focus.apply(this,arguments)},scrollParent:function(){var g;g=b.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(b.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!g.length?b(document):g},zIndex:function(g){if(g!==d)return this.css("zIndex",g);if(this.length){g=b(this[0]);for(var f;g.length&&g[0]!==document;){f=g.css("position");
+if(f==="absolute"||f==="relative"||f==="fixed"){f=parseInt(g.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}g=g.parent()}}return 0},disableSelection:function(){return this.bind((b.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(g){g.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});b.each(["Width","Height"],function(g,f){function a(j,n,p,l){b.each(c,function(){n-=parseFloat(b.curCSS(j,"padding"+this,true))||0;if(p)n-=parseFloat(b.curCSS(j,
+"border"+this+"Width",true))||0;if(l)n-=parseFloat(b.curCSS(j,"margin"+this,true))||0});return n}var c=f==="Width"?["Left","Right"]:["Top","Bottom"],h=f.toLowerCase(),i={innerWidth:b.fn.innerWidth,innerHeight:b.fn.innerHeight,outerWidth:b.fn.outerWidth,outerHeight:b.fn.outerHeight};b.fn["inner"+f]=function(j){if(j===d)return i["inner"+f].call(this);return this.each(function(){b(this).css(h,a(this,j)+"px")})};b.fn["outer"+f]=function(j,n){if(typeof j!=="number")return i["outer"+f].call(this,j);return this.each(function(){b(this).css(h,
+a(this,j,true,n)+"px")})}});b.extend(b.expr[":"],{data:function(g,f,a){return!!b.data(g,a[3])},focusable:function(g){var f=g.nodeName.toLowerCase(),a=b.attr(g,"tabindex");if("area"===f){f=g.parentNode;a=f.name;if(!g.href||!a||f.nodeName.toLowerCase()!=="map")return false;g=b("img[usemap=#"+a+"]")[0];return!!g&&e(g)}return(/input|select|textarea|button|object/.test(f)?!g.disabled:"a"==f?g.href||!isNaN(a):!isNaN(a))&&e(g)},tabbable:function(g){var f=b.attr(g,"tabindex");return(isNaN(f)||f>=0)&&b(g).is(":focusable")}});
+b(function(){var g=document.body,f=g.appendChild(f=document.createElement("div"));b.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});b.support.minHeight=f.offsetHeight===100;b.support.selectstart="onselectstart"in f;g.removeChild(f).style.display="none"});b.extend(b.ui,{plugin:{add:function(g,f,a){g=b.ui[g].prototype;for(var c in a){g.plugins[c]=g.plugins[c]||[];g.plugins[c].push([f,a[c]])}},call:function(g,f,a){if((f=g.plugins[f])&&g.element[0].parentNode)for(var c=0;c<f.length;c++)g.options[f[c][0]]&&
+f[c][1].apply(g.element,a)}},contains:function(g,f){return document.compareDocumentPosition?g.compareDocumentPosition(f)&16:g!==f&&g.contains(f)},hasScroll:function(g,f){if(b(g).css("overflow")==="hidden")return false;f=f&&f==="left"?"scrollLeft":"scrollTop";var a=false;if(g[f]>0)return true;g[f]=1;a=g[f]>0;g[f]=0;return a},isOverAxis:function(g,f,a){return g>f&&g<f+a},isOver:function(g,f,a,c,h,i){return b.ui.isOverAxis(g,a,h)&&b.ui.isOverAxis(f,c,i)}})}})(jQuery);
+(function(b,d){if(b.cleanData){var e=b.cleanData;b.cleanData=function(f){for(var a=0,c;(c=f[a])!=null;a++)b(c).triggerHandler("remove");e(f)}}else{var g=b.fn.remove;b.fn.remove=function(f,a){return this.each(function(){if(!a)if(!f||b.filter(f,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return g.call(b(this),f,a)})}}b.widget=function(f,a,c){var h=f.split(".")[0],i;f=f.split(".")[1];i=h+"-"+f;if(!c){c=a;a=b.Widget}b.expr[":"][i]=function(j){return!!b.data(j,
+f)};b[h]=b[h]||{};b[h][f]=function(j,n){arguments.length&&this._createWidget(j,n)};a=new a;a.options=b.extend(true,{},a.options);b[h][f].prototype=b.extend(true,a,{namespace:h,widgetName:f,widgetEventPrefix:b[h][f].prototype.widgetEventPrefix||f,widgetBaseClass:i},c);b.widget.bridge(f,b[h][f])};b.widget.bridge=function(f,a){b.fn[f]=function(c){var h=typeof c==="string",i=Array.prototype.slice.call(arguments,1),j=this;c=!h&&i.length?b.extend.apply(null,[true,c].concat(i)):c;if(h&&c.charAt(0)==="_")return j;
+h?this.each(function(){var n=b.data(this,f),p=n&&b.isFunction(n[c])?n[c].apply(n,i):n;if(p!==n&&p!==d){j=p;return false}}):this.each(function(){var n=b.data(this,f);n?n.option(c||{})._init():b.data(this,f,new a(c,this))});return j}};b.Widget=function(f,a){arguments.length&&this._createWidget(f,a)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,a){b.data(a,this.widgetName,this);this.element=b(a);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),f);var c=this;this.element.bind("remove."+this.widgetName,function(){c.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(f,a){var c=f;if(arguments.length===0)return b.extend({},this.options);if(typeof f==="string"){if(a===d)return this.options[f];c={};c[f]=a}this._setOptions(c);return this},_setOptions:function(f){var a=this;b.each(f,function(c,h){a._setOption(c,h)});return this},_setOption:function(f,a){this.options[f]=a;if(f==="disabled")this.widget()[a?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",a);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(f,a,c){var h=this.options[f];a=b.Event(a);a.type=(f===this.widgetEventPrefix?f:this.widgetEventPrefix+f).toLowerCase();c=c||{};if(a.originalEvent){f=b.event.props.length;for(var i;f;){i=b.event.props[--f];a[i]=a.originalEvent[i]}}this.element.trigger(a,c);return!(b.isFunction(h)&&h.call(this.element[0],a,c)===false||a.isDefaultPrevented())}}})(jQuery);
+(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(d){d.originalEvent=
+d.originalEvent||{};if(!d.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(d);this._mouseDownEvent=d;var e=this,g=d.which==1,f=typeof this.options.cancel=="string"?b(d.target).parents().add(d.target).filter(this.options.cancel).length:false;if(!g||f||!this._mouseCapture(d))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=
+this._mouseStart(d)!==false;if(!this._mouseStarted){d.preventDefault();return true}}true===b.data(d.target,this.widgetName+".preventClickEvent")&&b.removeData(d.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(a){return e._mouseMove(a)};this._mouseUpDelegate=function(a){return e._mouseUp(a)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);d.preventDefault();return d.originalEvent.mouseHandled=
+true}},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button)return this._mouseUp(d);if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,d)!==false)?this._mouseDrag(d):this._mouseUp(d);return!this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);
+if(this._mouseStarted){this._mouseStarted=false;d.target==this._mouseDownEvent.target&&b.data(d.target,this.widgetName+".preventClickEvent",true);this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+(function(b){b.widget("ui.draggable",b.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(d){var e=
+this.options;if(this.helper||e.disabled||b(d.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(d);if(!this.handle)return false;return true},_mouseStart:function(d){var e=this.options;this.helper=this._createHelper(d);this._cacheHelperProportions();if(b.ui.ddmanager)b.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
+this.margins.top,left:this.offset.left-this.margins.left};b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt);e.containment&&this._setContainment();if(this._trigger("start",d)===false){this._clear();return false}this._cacheHelperProportions();
+b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,d);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(d,true);return true},_mouseDrag:function(d,e){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!e){e=this._uiHash();if(this._trigger("drag",d,e)===false){this._mouseUp({});return false}this.position=e.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||
+this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";b.ui.ddmanager&&b.ui.ddmanager.drag(this,d);return false},_mouseStop:function(d){var e=false;if(b.ui.ddmanager&&!this.options.dropBehaviour)e=b.ui.ddmanager.drop(this,d);if(this.dropped){e=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!e||this.options.revert=="valid"&&e||this.options.revert===true||b.isFunction(this.options.revert)&&
+this.options.revert.call(this.element,e)){var g=this;b(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){g._trigger("stop",d)!==false&&g._clear()})}else this._trigger("stop",d)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(d){var e=!this.options.handle||!b(this.options.handle,this.element).length?true:false;b(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
+d.target)e=true});return e},_createHelper:function(d){var e=this.options;d=b.isFunction(e.helper)?b(e.helper.apply(this.element[0],[d])):e.helper=="clone"?this.element.clone():this.element;d.parents("body").length||d.appendTo(e.appendTo=="parent"?this.element[0].parentNode:e.appendTo);d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(b.isArray(d))d={left:+d[0],top:+d[1]||
+0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],
+this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.element.position();return{top:d.top-
+(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),
+height:this.helper.outerHeight()}},_setContainment:function(){var d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[(d.containment=="document"?0:b(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(d.containment=="document"?0:b(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(d.containment=="document"?0:b(window).scrollLeft())+b(d.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(d.containment=="document"?0:b(window).scrollTop())+(b(d.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)&&d.containment.constructor!=Array){var e=b(d.containment)[0];if(e){d=b(d.containment).offset();var g=b(e).css("overflow")!="hidden";this.containment=[d.left+(parseInt(b(e).css("borderLeftWidth"),
+10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0),d.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0),d.left+(g?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,d.top+(g?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),
+10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom]}}else if(d.containment.constructor==Array)this.containment=d.containment},_convertPositionTo:function(d,e){if(!e)e=this.position;d=d=="absolute"?1:-1;var g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);return{top:e.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&
+b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop())*d),left:e.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:g.scrollLeft())*d)}},_generatePosition:function(d){var e=this.options,g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],
+this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName),a=d.pageX,c=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-this.offset.click.left<this.containment[0])a=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])c=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])a=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])c=
+this.containment[3]+this.offset.click.top}if(e.grid){c=this.originalPageY+Math.round((c-this.originalPageY)/e.grid[1])*e.grid[1];c=this.containment?!(c-this.offset.click.top<this.containment[1]||c-this.offset.click.top>this.containment[3])?c:!(c-this.offset.click.top<this.containment[1])?c-e.grid[1]:c+e.grid[1]:c;a=this.originalPageX+Math.round((a-this.originalPageX)/e.grid[0])*e.grid[0];a=this.containment?!(a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2])?
+a:!(a-this.offset.click.left<this.containment[0])?a-e.grid[0]:a+e.grid[0]:a}}return{top:c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+f?0:g.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(d,e,g){g=g||this._uiHash();b.ui.plugin.call(this,d,[e,g]);if(d=="drag")this.positionAbs=this._convertPositionTo("absolute");return b.Widget.prototype._trigger.call(this,d,e,g)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,
+offset:this.positionAbs}}});b.extend(b.ui.draggable,{version:"1.8.11"});b.ui.plugin.add("draggable","connectToSortable",{start:function(d,e){var g=b(this).data("draggable"),f=g.options,a=b.extend({},e,{item:g.element});g.sortables=[];b(f.connectToSortable).each(function(){var c=b.data(this,"sortable");if(c&&!c.options.disabled){g.sortables.push({instance:c,shouldRevert:c.options.revert});c.refreshPositions();c._trigger("activate",d,a)}})},stop:function(d,e){var g=b(this).data("draggable"),f=b.extend({},
+e,{item:g.element});b.each(g.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;g.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(d);this.instance.options.helper=this.instance.options._helper;g.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",d,f)}})},drag:function(d,e){var g=
+b(this).data("draggable"),f=this;b.each(g.sortables,function(){this.instance.positionAbs=g.positionAbs;this.instance.helperProportions=g.helperProportions;this.instance.offset.click=g.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=b(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return e.helper[0]};
+d.target=this.instance.currentItem[0];this.instance._mouseCapture(d,true);this.instance._mouseStart(d,true,true);this.instance.offset.click.top=g.offset.click.top;this.instance.offset.click.left=g.offset.click.left;this.instance.offset.parent.left-=g.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=g.offset.parent.top-this.instance.offset.parent.top;g._trigger("toSortable",d);g.dropped=this.instance.element;g.currentItem=g.element;this.instance.fromOutside=g}this.instance.currentItem&&
+this.instance._mouseDrag(d)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",d,this.instance._uiHash(this.instance));this.instance._mouseStop(d,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();g._trigger("fromSortable",d);g.dropped=false}})}});b.ui.plugin.add("draggable","cursor",
+{start:function(){var d=b("body"),e=b(this).data("draggable").options;if(d.css("cursor"))e._cursor=d.css("cursor");d.css("cursor",e.cursor)},stop:function(){var d=b(this).data("draggable").options;d._cursor&&b("body").css("cursor",d._cursor)}});b.ui.plugin.add("draggable","iframeFix",{start:function(){var d=b(this).data("draggable").options;b(d.iframeFix===true?"iframe":d.iframeFix).each(function(){b('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+
+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(b(this).offset()).appendTo("body")})},stop:function(){b("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});b.ui.plugin.add("draggable","opacity",{start:function(d,e){d=b(e.helper);e=b(this).data("draggable").options;if(d.css("opacity"))e._opacity=d.css("opacity");d.css("opacity",e.opacity)},stop:function(d,e){d=b(this).data("draggable").options;d._opacity&&b(e.helper).css("opacity",
+d._opacity)}});b.ui.plugin.add("draggable","scroll",{start:function(){var d=b(this).data("draggable");if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML")d.overflowOffset=d.scrollParent.offset()},drag:function(d){var e=b(this).data("draggable"),g=e.options,f=false;if(e.scrollParent[0]!=document&&e.scrollParent[0].tagName!="HTML"){if(!g.axis||g.axis!="x")if(e.overflowOffset.top+e.scrollParent[0].offsetHeight-d.pageY<g.scrollSensitivity)e.scrollParent[0].scrollTop=f=e.scrollParent[0].scrollTop+
+g.scrollSpeed;else if(d.pageY-e.overflowOffset.top<g.scrollSensitivity)e.scrollParent[0].scrollTop=f=e.scrollParent[0].scrollTop-g.scrollSpeed;if(!g.axis||g.axis!="y")if(e.overflowOffset.left+e.scrollParent[0].offsetWidth-d.pageX<g.scrollSensitivity)e.scrollParent[0].scrollLeft=f=e.scrollParent[0].scrollLeft+g.scrollSpeed;else if(d.pageX-e.overflowOffset.left<g.scrollSensitivity)e.scrollParent[0].scrollLeft=f=e.scrollParent[0].scrollLeft-g.scrollSpeed}else{if(!g.axis||g.axis!="x")if(d.pageY-b(document).scrollTop()<
+g.scrollSensitivity)f=b(document).scrollTop(b(document).scrollTop()-g.scrollSpeed);else if(b(window).height()-(d.pageY-b(document).scrollTop())<g.scrollSensitivity)f=b(document).scrollTop(b(document).scrollTop()+g.scrollSpeed);if(!g.axis||g.axis!="y")if(d.pageX-b(document).scrollLeft()<g.scrollSensitivity)f=b(document).scrollLeft(b(document).scrollLeft()-g.scrollSpeed);else if(b(window).width()-(d.pageX-b(document).scrollLeft())<g.scrollSensitivity)f=b(document).scrollLeft(b(document).scrollLeft()+
+g.scrollSpeed)}f!==false&&b.ui.ddmanager&&!g.dropBehaviour&&b.ui.ddmanager.prepareOffsets(e,d)}});b.ui.plugin.add("draggable","snap",{start:function(){var d=b(this).data("draggable"),e=d.options;d.snapElements=[];b(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var g=b(this),f=g.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})})},drag:function(d,e){for(var g=b(this).data("draggable"),
+f=g.options,a=f.snapTolerance,c=e.offset.left,h=c+g.helperProportions.width,i=e.offset.top,j=i+g.helperProportions.height,n=g.snapElements.length-1;n>=0;n--){var p=g.snapElements[n].left,l=p+g.snapElements[n].width,k=g.snapElements[n].top,m=k+g.snapElements[n].height;if(p-a<c&&c<l+a&&k-a<i&&i<m+a||p-a<c&&c<l+a&&k-a<j&&j<m+a||p-a<h&&h<l+a&&k-a<i&&i<m+a||p-a<h&&h<l+a&&k-a<j&&j<m+a){if(f.snapMode!="inner"){var o=Math.abs(k-j)<=a,q=Math.abs(m-i)<=a,s=Math.abs(p-h)<=a,r=Math.abs(l-c)<=a;if(o)e.position.top=
+g._convertPositionTo("relative",{top:k-g.helperProportions.height,left:0}).top-g.margins.top;if(q)e.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top;if(s)e.position.left=g._convertPositionTo("relative",{top:0,left:p-g.helperProportions.width}).left-g.margins.left;if(r)e.position.left=g._convertPositionTo("relative",{top:0,left:l}).left-g.margins.left}var u=o||q||s||r;if(f.snapMode!="outer"){o=Math.abs(k-i)<=a;q=Math.abs(m-j)<=a;s=Math.abs(p-c)<=a;r=Math.abs(l-h)<=a;if(o)e.position.top=
+g._convertPositionTo("relative",{top:k,left:0}).top-g.margins.top;if(q)e.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top;if(s)e.position.left=g._convertPositionTo("relative",{top:0,left:p}).left-g.margins.left;if(r)e.position.left=g._convertPositionTo("relative",{top:0,left:l-g.helperProportions.width}).left-g.margins.left}if(!g.snapElements[n].snapping&&(o||q||s||r||u))g.options.snap.snap&&g.options.snap.snap.call(g.element,d,b.extend(g._uiHash(),
+{snapItem:g.snapElements[n].item}));g.snapElements[n].snapping=o||q||s||r||u}else{g.snapElements[n].snapping&&g.options.snap.release&&g.options.snap.release.call(g.element,d,b.extend(g._uiHash(),{snapItem:g.snapElements[n].item}));g.snapElements[n].snapping=false}}}});b.ui.plugin.add("draggable","stack",{start:function(){var d=b(this).data("draggable").options;d=b.makeArray(b(d.stack)).sort(function(g,f){return(parseInt(b(g).css("zIndex"),10)||0)-(parseInt(b(f).css("zIndex"),10)||0)});if(d.length){var e=
+parseInt(d[0].style.zIndex)||0;b(d).each(function(g){this.style.zIndex=e+g});this[0].style.zIndex=e+d.length}}});b.ui.plugin.add("draggable","zIndex",{start:function(d,e){d=b(e.helper);e=b(this).data("draggable").options;if(d.css("zIndex"))e._zIndex=d.css("zIndex");d.css("zIndex",e.zIndex)},stop:function(d,e){d=b(this).data("draggable").options;d._zIndex&&b(e.helper).css("zIndex",d._zIndex)}})})(jQuery);
+(function(b){b.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var d=this.options,e=d.accept;this.isover=0;this.isout=1;this.accept=b.isFunction(e)?e:function(g){return g.is(e)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};b.ui.ddmanager.droppables[d.scope]=b.ui.ddmanager.droppables[d.scope]||[];b.ui.ddmanager.droppables[d.scope].push(this);
+d.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var d=b.ui.ddmanager.droppables[this.options.scope],e=0;e<d.length;e++)d[e]==this&&d.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(d,e){if(d=="accept")this.accept=b.isFunction(e)?e:function(g){return g.is(e)};b.Widget.prototype._setOption.apply(this,arguments)},_activate:function(d){var e=b.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);e&&this._trigger("activate",d,this.ui(e))},_deactivate:function(d){var e=b.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);e&&this._trigger("deactivate",d,this.ui(e))},_over:function(d){var e=b.ui.ddmanager.current;if(!(!e||(e.currentItem||e.element)[0]==this.element[0]))if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",d,this.ui(e))}},_out:function(d){var e=b.ui.ddmanager.current;if(!(!e||(e.currentItem||e.element)[0]==this.element[0]))if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",d,this.ui(e))}},_drop:function(d,e){var g=e||b.ui.ddmanager.current;if(!g||(g.currentItem||g.element)[0]==this.element[0])return false;var f=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var a=
+b.data(this,"droppable");if(a.options.greedy&&!a.options.disabled&&a.options.scope==g.options.scope&&a.accept.call(a.element[0],g.currentItem||g.element)&&b.ui.intersect(g,b.extend(a,{offset:a.element.offset()}),a.options.tolerance)){f=true;return false}});if(f)return false;if(this.accept.call(this.element[0],g.currentItem||g.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+d,this.ui(g));return this.element}return false},ui:function(d){return{draggable:d.currentItem||d.element,helper:d.helper,position:d.position,offset:d.positionAbs}}});b.extend(b.ui.droppable,{version:"1.8.11"});b.ui.intersect=function(d,e,g){if(!e.offset)return false;var f=(d.positionAbs||d.position.absolute).left,a=f+d.helperProportions.width,c=(d.positionAbs||d.position.absolute).top,h=c+d.helperProportions.height,i=e.offset.left,j=i+e.proportions.width,n=e.offset.top,p=n+e.proportions.height;
+switch(g){case "fit":return i<=f&&a<=j&&n<=c&&h<=p;case "intersect":return i<f+d.helperProportions.width/2&&a-d.helperProportions.width/2<j&&n<c+d.helperProportions.height/2&&h-d.helperProportions.height/2<p;case "pointer":return b.ui.isOver((d.positionAbs||d.position.absolute).top+(d.clickOffset||d.offset.click).top,(d.positionAbs||d.position.absolute).left+(d.clickOffset||d.offset.click).left,n,i,e.proportions.height,e.proportions.width);case "touch":return(c>=n&&c<=p||h>=n&&h<=p||c<n&&h>p)&&(f>=
+i&&f<=j||a>=i&&a<=j||f<i&&a>j);default:return false}};b.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(d,e){var g=b.ui.ddmanager.droppables[d.options.scope]||[],f=e?e.type:null,a=(d.currentItem||d.element).find(":data(droppable)").andSelf(),c=0;a:for(;c<g.length;c++)if(!(g[c].options.disabled||d&&!g[c].accept.call(g[c].element[0],d.currentItem||d.element))){for(var h=0;h<a.length;h++)if(a[h]==g[c].element[0]){g[c].proportions.height=0;continue a}g[c].visible=g[c].element.css("display")!=
+"none";if(g[c].visible){f=="mousedown"&&g[c]._activate.call(g[c],e);g[c].offset=g[c].element.offset();g[c].proportions={width:g[c].element[0].offsetWidth,height:g[c].element[0].offsetHeight}}}},drop:function(d,e){var g=false;b.each(b.ui.ddmanager.droppables[d.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&b.ui.intersect(d,this,this.options.tolerance))g=g||this._drop.call(this,e);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],d.currentItem||
+d.element)){this.isout=1;this.isover=0;this._deactivate.call(this,e)}}});return g},drag:function(d,e){d.options.refreshPositions&&b.ui.ddmanager.prepareOffsets(d,e);b.each(b.ui.ddmanager.droppables[d.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var g=b.ui.intersect(d,this,this.options.tolerance);if(g=!g&&this.isover==1?"isout":g&&this.isover==0?"isover":null){var f;if(this.options.greedy){var a=this.element.parents(":data(droppable):eq(0)");if(a.length){f=
+b.data(a[0],"droppable");f.greedyChild=g=="isover"?1:0}}if(f&&g=="isover"){f.isover=0;f.isout=1;f._out.call(f,e)}this[g]=1;this[g=="isout"?"isover":"isout"]=0;this[g=="isover"?"_over":"_out"].call(this,e);if(f&&g=="isout"){f.isout=0;f.isover=1;f._over.call(f,e)}}}})}}})(jQuery);
+(function(b){b.widget("ui.resizable",b.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var g=this,f=this.options;this.element.addClass("ui-resizable");b.extend(this,{_aspectRatio:!!f.aspectRatio,aspectRatio:f.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:f.helper||f.ghost||f.animate?f.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&b.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(b('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=f.handles||(!b(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var a=this.handles.split(",");this.handles={};for(var c=0;c<a.length;c++){var h=b.trim(a[c]),i=b('<div class="ui-resizable-handle '+("ui-resizable-"+h)+'"></div>');/sw|se|ne|nw/.test(h)&&i.css({zIndex:++f.zIndex});"se"==h&&i.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[h]=".ui-resizable-"+h;this.element.append(i)}}this._renderAxis=function(j){j=j||this.element;for(var n in this.handles){if(this.handles[n].constructor==
+String)this.handles[n]=b(this.handles[n],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var p=b(this.handles[n],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(n)?p.outerHeight():p.outerWidth();p=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");j.css(p,l);this._proportionallyResize()}b(this.handles[n])}};this._renderAxis(this.element);this._handles=b(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!g.resizing){if(this.className)var j=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);g.axis=j&&j[1]?j[1]:"se"}});if(f.autoHide){this._handles.hide();b(this.element).addClass("ui-resizable-autohide").hover(function(){b(this).removeClass("ui-resizable-autohide");g._handles.show()},function(){if(!g.resizing){b(this).addClass("ui-resizable-autohide");g._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var g=function(a){b(a).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){g(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);g(this.originalElement);return this},_mouseCapture:function(g){var f=false;for(var a in this.handles)if(b(this.handles[a])[0]==g.target)f=true;return!this.options.disabled&&f},_mouseStart:function(g){var f=this.options,a=this.element.position(),
+c=this.element;this.resizing=true;this.documentScroll={top:b(document).scrollTop(),left:b(document).scrollLeft()};if(c.is(".ui-draggable")||/absolute/.test(c.css("position")))c.css({position:"absolute",top:a.top,left:a.left});b.browser.opera&&/relative/.test(c.css("position"))&&c.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();a=d(this.helper.css("left"));var h=d(this.helper.css("top"));if(f.containment){a+=b(f.containment).scrollLeft()||0;h+=b(f.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:a,top:h};this.size=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalSize=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalPosition={left:a,top:h};this.sizeDiff={width:c.outerWidth()-c.width(),height:c.outerHeight()-c.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=typeof f.aspectRatio=="number"?f.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;f=b(".ui-resizable-"+this.axis).css("cursor");b("body").css("cursor",f=="auto"?this.axis+"-resize":f);c.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(g){var f=this.helper,a=this.originalMousePosition,c=this._change[this.axis];if(!c)return false;a=c.apply(this,[g,g.pageX-a.left||0,g.pageY-a.top||0]);if(this._aspectRatio||g.shiftKey)a=this._updateRatio(a,g);a=this._respectSize(a,g);this._propagate("resize",
+g);f.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(a);this._trigger("resize",g,this.ui());return false},_mouseStop:function(g){this.resizing=false;var f=this.options,a=this;if(this._helper){var c=this._proportionallyResizeElements,h=c.length&&/textarea/i.test(c[0].nodeName);c=h&&b.ui.hasScroll(c[0],"left")?0:a.sizeDiff.height;
+h=h?0:a.sizeDiff.width;h={width:a.helper.width()-h,height:a.helper.height()-c};c=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var i=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;f.animate||this.element.css(b.extend(h,{top:i,left:c}));a.helper.height(a.size.height);a.helper.width(a.size.width);this._helper&&!f.animate&&this._proportionallyResize()}b("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");
+this._propagate("stop",g);this._helper&&this.helper.remove();return false},_updateCache:function(g){this.offset=this.helper.offset();if(e(g.left))this.position.left=g.left;if(e(g.top))this.position.top=g.top;if(e(g.height))this.size.height=g.height;if(e(g.width))this.size.width=g.width},_updateRatio:function(g){var f=this.position,a=this.size,c=this.axis;if(g.height)g.width=a.height*this.aspectRatio;else if(g.width)g.height=a.width/this.aspectRatio;if(c=="sw"){g.left=f.left+(a.width-g.width);g.top=
+null}if(c=="nw"){g.top=f.top+(a.height-g.height);g.left=f.left+(a.width-g.width)}return g},_respectSize:function(g){var f=this.options,a=this.axis,c=e(g.width)&&f.maxWidth&&f.maxWidth<g.width,h=e(g.height)&&f.maxHeight&&f.maxHeight<g.height,i=e(g.width)&&f.minWidth&&f.minWidth>g.width,j=e(g.height)&&f.minHeight&&f.minHeight>g.height;if(i)g.width=f.minWidth;if(j)g.height=f.minHeight;if(c)g.width=f.maxWidth;if(h)g.height=f.maxHeight;var n=this.originalPosition.left+this.originalSize.width,p=this.position.top+
+this.size.height,l=/sw|nw|w/.test(a);a=/nw|ne|n/.test(a);if(i&&l)g.left=n-f.minWidth;if(c&&l)g.left=n-f.maxWidth;if(j&&a)g.top=p-f.minHeight;if(h&&a)g.top=p-f.maxHeight;if((f=!g.width&&!g.height)&&!g.left&&g.top)g.top=null;else if(f&&!g.top&&g.left)g.left=null;return g},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var g=this.helper||this.element,f=0;f<this._proportionallyResizeElements.length;f++){var a=this._proportionallyResizeElements[f];if(!this.borderDif){var c=
+[a.css("borderTopWidth"),a.css("borderRightWidth"),a.css("borderBottomWidth"),a.css("borderLeftWidth")],h=[a.css("paddingTop"),a.css("paddingRight"),a.css("paddingBottom"),a.css("paddingLeft")];this.borderDif=b.map(c,function(i,j){i=parseInt(i,10)||0;j=parseInt(h[j],10)||0;return i+j})}b.browser.msie&&(b(g).is(":hidden")||b(g).parents(":hidden").length)||a.css({height:g.height()-this.borderDif[0]-this.borderDif[2]||0,width:g.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var g=
+this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||b('<div style="overflow:hidden;"></div>');var f=b.browser.msie&&b.browser.version<7,a=f?1:0;f=f?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-a+"px",top:this.elementOffset.top-a+"px",zIndex:++g.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(g,
+f){return{width:this.originalSize.width+f}},w:function(g,f){return{left:this.originalPosition.left+f,width:this.originalSize.width-f}},n:function(g,f,a){return{top:this.originalPosition.top+a,height:this.originalSize.height-a}},s:function(g,f,a){return{height:this.originalSize.height+a}},se:function(g,f,a){return b.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,a]))},sw:function(g,f,a){return b.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,
+a]))},ne:function(g,f,a){return b.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,a]))},nw:function(g,f,a){return b.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,a]))}},_propagate:function(g,f){b.ui.plugin.call(this,g,[f,this.ui()]);g!="resize"&&this._trigger(g,f,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,
+originalPosition:this.originalPosition}}});b.extend(b.ui.resizable,{version:"1.8.11"});b.ui.plugin.add("resizable","alsoResize",{start:function(){var g=b(this).data("resizable").options,f=function(a){b(a).each(function(){var c=b(this);c.data("resizable-alsoresize",{width:parseInt(c.width(),10),height:parseInt(c.height(),10),left:parseInt(c.css("left"),10),top:parseInt(c.css("top"),10),position:c.css("position")})})};if(typeof g.alsoResize=="object"&&!g.alsoResize.parentNode)if(g.alsoResize.length){g.alsoResize=
+g.alsoResize[0];f(g.alsoResize)}else b.each(g.alsoResize,function(a){f(a)});else f(g.alsoResize)},resize:function(g,f){var a=b(this).data("resizable");g=a.options;var c=a.originalSize,h=a.originalPosition,i={height:a.size.height-c.height||0,width:a.size.width-c.width||0,top:a.position.top-h.top||0,left:a.position.left-h.left||0},j=function(n,p){b(n).each(function(){var l=b(this),k=b(this).data("resizable-alsoresize"),m={},o=p&&p.length?p:l.parents(f.originalElement[0]).length?["width","height"]:["width",
+"height","top","left"];b.each(o,function(q,s){if((q=(k[s]||0)+(i[s]||0))&&q>=0)m[s]=q||null});if(b.browser.opera&&/relative/.test(l.css("position"))){a._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(m)})};typeof g.alsoResize=="object"&&!g.alsoResize.nodeType?b.each(g.alsoResize,function(n,p){j(n,p)}):j(g.alsoResize)},stop:function(){var g=b(this).data("resizable"),f=g.options,a=function(c){b(c).each(function(){var h=b(this);h.css({position:h.data("resizable-alsoresize").position})})};
+if(g._revertToRelativePosition){g._revertToRelativePosition=false;typeof f.alsoResize=="object"&&!f.alsoResize.nodeType?b.each(f.alsoResize,function(c){a(c)}):a(f.alsoResize)}b(this).removeData("resizable-alsoresize")}});b.ui.plugin.add("resizable","animate",{stop:function(g){var f=b(this).data("resizable"),a=f.options,c=f._proportionallyResizeElements,h=c.length&&/textarea/i.test(c[0].nodeName),i=h&&b.ui.hasScroll(c[0],"left")?0:f.sizeDiff.height;h={width:f.size.width-(h?0:f.sizeDiff.width),height:f.size.height-
+i};i=parseInt(f.element.css("left"),10)+(f.position.left-f.originalPosition.left)||null;var j=parseInt(f.element.css("top"),10)+(f.position.top-f.originalPosition.top)||null;f.element.animate(b.extend(h,j&&i?{top:j,left:i}:{}),{duration:a.animateDuration,easing:a.animateEasing,step:function(){var n={width:parseInt(f.element.css("width"),10),height:parseInt(f.element.css("height"),10),top:parseInt(f.element.css("top"),10),left:parseInt(f.element.css("left"),10)};c&&c.length&&b(c[0]).css({width:n.width,
+height:n.height});f._updateCache(n);f._propagate("resize",g)}})}});b.ui.plugin.add("resizable","containment",{start:function(){var g=b(this).data("resizable"),f=g.element,a=g.options.containment;if(f=a instanceof b?a.get(0):/parent/.test(a)?f.parent().get(0):a){g.containerElement=b(f);if(/document/.test(a)||a==document){g.containerOffset={left:0,top:0};g.containerPosition={left:0,top:0};g.parentData={element:b(document),left:0,top:0,width:b(document).width(),height:b(document).height()||document.body.parentNode.scrollHeight}}else{var c=
+b(f),h=[];b(["Top","Right","Left","Bottom"]).each(function(n,p){h[n]=d(c.css("padding"+p))});g.containerOffset=c.offset();g.containerPosition=c.position();g.containerSize={height:c.innerHeight()-h[3],width:c.innerWidth()-h[1]};a=g.containerOffset;var i=g.containerSize.height,j=g.containerSize.width;j=b.ui.hasScroll(f,"left")?f.scrollWidth:j;i=b.ui.hasScroll(f)?f.scrollHeight:i;g.parentData={element:f,left:a.left,top:a.top,width:j,height:i}}}},resize:function(g){var f=b(this).data("resizable"),a=f.options,
+c=f.containerOffset,h=f.position;g=f._aspectRatio||g.shiftKey;var i={top:0,left:0},j=f.containerElement;if(j[0]!=document&&/static/.test(j.css("position")))i=c;if(h.left<(f._helper?c.left:0)){f.size.width+=f._helper?f.position.left-c.left:f.position.left-i.left;if(g)f.size.height=f.size.width/a.aspectRatio;f.position.left=a.helper?c.left:0}if(h.top<(f._helper?c.top:0)){f.size.height+=f._helper?f.position.top-c.top:f.position.top;if(g)f.size.width=f.size.height*a.aspectRatio;f.position.top=f._helper?
+c.top:0}f.offset.left=f.parentData.left+f.position.left;f.offset.top=f.parentData.top+f.position.top;a=Math.abs((f._helper?f.offset.left-i.left:f.offset.left-i.left)+f.sizeDiff.width);c=Math.abs((f._helper?f.offset.top-i.top:f.offset.top-c.top)+f.sizeDiff.height);h=f.containerElement.get(0)==f.element.parent().get(0);i=/relative|absolute/.test(f.containerElement.css("position"));if(h&&i)a-=f.parentData.left;if(a+f.size.width>=f.parentData.width){f.size.width=f.parentData.width-a;if(g)f.size.height=
+f.size.width/f.aspectRatio}if(c+f.size.height>=f.parentData.height){f.size.height=f.parentData.height-c;if(g)f.size.width=f.size.height*f.aspectRatio}},stop:function(){var g=b(this).data("resizable"),f=g.options,a=g.containerOffset,c=g.containerPosition,h=g.containerElement,i=b(g.helper),j=i.offset(),n=i.outerWidth()-g.sizeDiff.width;i=i.outerHeight()-g.sizeDiff.height;g._helper&&!f.animate&&/relative/.test(h.css("position"))&&b(this).css({left:j.left-c.left-a.left,width:n,height:i});g._helper&&!f.animate&&
+/static/.test(h.css("position"))&&b(this).css({left:j.left-c.left-a.left,width:n,height:i})}});b.ui.plugin.add("resizable","ghost",{start:function(){var g=b(this).data("resizable"),f=g.options,a=g.size;g.ghost=g.originalElement.clone();g.ghost.css({opacity:0.25,display:"block",position:"relative",height:a.height,width:a.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof f.ghost=="string"?f.ghost:"");g.ghost.appendTo(g.helper)},resize:function(){var g=b(this).data("resizable");
+g.ghost&&g.ghost.css({position:"relative",height:g.size.height,width:g.size.width})},stop:function(){var g=b(this).data("resizable");g.ghost&&g.helper&&g.helper.get(0).removeChild(g.ghost.get(0))}});b.ui.plugin.add("resizable","grid",{resize:function(){var g=b(this).data("resizable"),f=g.options,a=g.size,c=g.originalSize,h=g.originalPosition,i=g.axis;f.grid=typeof f.grid=="number"?[f.grid,f.grid]:f.grid;var j=Math.round((a.width-c.width)/(f.grid[0]||1))*(f.grid[0]||1);f=Math.round((a.height-c.height)/
+(f.grid[1]||1))*(f.grid[1]||1);if(/^(se|s|e)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f}else if(/^(ne)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f;g.position.top=h.top-f}else{if(/^(sw)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f}else{g.size.width=c.width+j;g.size.height=c.height+f;g.position.top=h.top-f}g.position.left=h.left-j}}});var d=function(g){return parseInt(g,10)||0},e=function(g){return!isNaN(parseInt(g,10))}})(jQuery);
+(function(b){b.widget("ui.selectable",b.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var d=this;this.element.addClass("ui-selectable");this.dragged=false;var e;this.refresh=function(){e=b(d.options.filter,d.element[0]);e.each(function(){var g=b(this),f=g.offset();b.data(this,"selectable-item",{element:this,$element:g,left:f.left,top:f.top,right:f.left+g.outerWidth(),bottom:f.top+g.outerHeight(),startselected:false,selected:g.hasClass("ui-selected"),
+selecting:g.hasClass("ui-selecting"),unselecting:g.hasClass("ui-unselecting")})})};this.refresh();this.selectees=e.addClass("ui-selectee");this._mouseInit();this.helper=b("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(d){var e=this;this.opos=[d.pageX,
+d.pageY];if(!this.options.disabled){var g=this.options;this.selectees=b(g.filter,this.element[0]);this._trigger("start",d);b(g.appendTo).append(this.helper);this.helper.css({left:d.clientX,top:d.clientY,width:0,height:0});g.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var f=b.data(this,"selectable-item");f.startselected=true;if(!d.metaKey){f.$element.removeClass("ui-selected");f.selected=false;f.$element.addClass("ui-unselecting");f.unselecting=true;e._trigger("unselecting",
+d,{unselecting:f.element})}});b(d.target).parents().andSelf().each(function(){var f=b.data(this,"selectable-item");if(f){var a=!d.metaKey||!f.$element.hasClass("ui-selected");f.$element.removeClass(a?"ui-unselecting":"ui-selected").addClass(a?"ui-selecting":"ui-unselecting");f.unselecting=!a;f.selecting=a;(f.selected=a)?e._trigger("selecting",d,{selecting:f.element}):e._trigger("unselecting",d,{unselecting:f.element});return false}})}},_mouseDrag:function(d){var e=this;this.dragged=true;if(!this.options.disabled){var g=
+this.options,f=this.opos[0],a=this.opos[1],c=d.pageX,h=d.pageY;if(f>c){var i=c;c=f;f=i}if(a>h){i=h;h=a;a=i}this.helper.css({left:f,top:a,width:c-f,height:h-a});this.selectees.each(function(){var j=b.data(this,"selectable-item");if(!(!j||j.element==e.element[0])){var n=false;if(g.tolerance=="touch")n=!(j.left>c||j.right<f||j.top>h||j.bottom<a);else if(g.tolerance=="fit")n=j.left>f&&j.right<c&&j.top>a&&j.bottom<h;if(n){if(j.selected){j.$element.removeClass("ui-selected");j.selected=false}if(j.unselecting){j.$element.removeClass("ui-unselecting");
+j.unselecting=false}if(!j.selecting){j.$element.addClass("ui-selecting");j.selecting=true;e._trigger("selecting",d,{selecting:j.element})}}else{if(j.selecting)if(d.metaKey&&j.startselected){j.$element.removeClass("ui-selecting");j.selecting=false;j.$element.addClass("ui-selected");j.selected=true}else{j.$element.removeClass("ui-selecting");j.selecting=false;if(j.startselected){j.$element.addClass("ui-unselecting");j.unselecting=true}e._trigger("unselecting",d,{unselecting:j.element})}if(j.selected)if(!d.metaKey&&
+!j.startselected){j.$element.removeClass("ui-selected");j.selected=false;j.$element.addClass("ui-unselecting");j.unselecting=true;e._trigger("unselecting",d,{unselecting:j.element})}}}});return false}},_mouseStop:function(d){var e=this;this.dragged=false;b(".ui-unselecting",this.element[0]).each(function(){var g=b.data(this,"selectable-item");g.$element.removeClass("ui-unselecting");g.unselecting=false;g.startselected=false;e._trigger("unselected",d,{unselected:g.element})});b(".ui-selecting",this.element[0]).each(function(){var g=
+b.data(this,"selectable-item");g.$element.removeClass("ui-selecting").addClass("ui-selected");g.selecting=false;g.selected=true;g.startselected=true;e._trigger("selected",d,{selected:g.element})});this._trigger("stop",d);this.helper.remove();return false}});b.extend(b.ui.selectable,{version:"1.8.11"})})(jQuery);
+(function(b){b.widget("ui.sortable",b.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var d=this.items.length-1;d>=0;d--)this.items[d].item.removeData("sortable-item");return this},_setOption:function(d,e){if(d==="disabled"){this.options[d]=
+e;this.widget()[e?"addClass":"removeClass"]("ui-sortable-disabled")}else b.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(d,e){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(d);var g=null,f=this;b(d.target).parents().each(function(){if(b.data(this,"sortable-item")==f){g=b(this);return false}});if(b.data(d.target,"sortable-item")==f)g=b(d.target);if(!g)return false;if(this.options.handle&&!e){var a=false;
+b(this.options.handle,g).find("*").andSelf().each(function(){if(this==d.target)a=true});if(!a)return false}this.currentItem=g;this._removeCurrentsFromItems();return true},_mouseStart:function(d,e,g){e=this.options;var f=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(d);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-
+this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();e.containment&&this._setContainment();if(e.cursor){if(b("body").css("cursor"))this._storedCursor=b("body").css("cursor");b("body").css("cursor",e.cursor)}if(e.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",e.opacity)}if(e.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",e.zIndex)}if(this.scrollParent[0]!=
+document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",d,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!g)for(g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",d,f._uiHash(this));if(b.ui.ddmanager)b.ui.ddmanager.current=this;b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,d);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(d);
+return true},_mouseDrag:function(d){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var e=this.options,g=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-d.pageY<e.scrollSensitivity)this.scrollParent[0].scrollTop=g=this.scrollParent[0].scrollTop+e.scrollSpeed;else if(d.pageY-this.overflowOffset.top<
+e.scrollSensitivity)this.scrollParent[0].scrollTop=g=this.scrollParent[0].scrollTop-e.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-d.pageX<e.scrollSensitivity)this.scrollParent[0].scrollLeft=g=this.scrollParent[0].scrollLeft+e.scrollSpeed;else if(d.pageX-this.overflowOffset.left<e.scrollSensitivity)this.scrollParent[0].scrollLeft=g=this.scrollParent[0].scrollLeft-e.scrollSpeed}else{if(d.pageY-b(document).scrollTop()<e.scrollSensitivity)g=b(document).scrollTop(b(document).scrollTop()-
+e.scrollSpeed);else if(b(window).height()-(d.pageY-b(document).scrollTop())<e.scrollSensitivity)g=b(document).scrollTop(b(document).scrollTop()+e.scrollSpeed);if(d.pageX-b(document).scrollLeft()<e.scrollSensitivity)g=b(document).scrollLeft(b(document).scrollLeft()-e.scrollSpeed);else if(b(window).width()-(d.pageX-b(document).scrollLeft())<e.scrollSensitivity)g=b(document).scrollLeft(b(document).scrollLeft()+e.scrollSpeed)}g!==false&&b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,
+d)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(e=this.items.length-1;e>=0;e--){g=this.items[e];var f=g.item[0],a=this._intersectsWithPointer(g);if(a)if(f!=this.currentItem[0]&&this.placeholder[a==1?"next":"prev"]()[0]!=f&&!b.ui.contains(this.placeholder[0],f)&&(this.options.type=="semi-dynamic"?!b.ui.contains(this.element[0],
+f):true)){this.direction=a==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(g))this._rearrange(d,g);else break;this._trigger("change",d,this._uiHash());break}}this._contactContainers(d);b.ui.ddmanager&&b.ui.ddmanager.drag(this,d);this._trigger("sort",d,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(d,e){if(d){b.ui.ddmanager&&!this.options.dropBehaviour&&b.ui.ddmanager.drop(this,d);if(this.options.revert){var g=this;e=g.placeholder.offset();
+g.reverting=true;b(this.helper).animate({left:e.left-this.offset.parent.left-g.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-g.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){g._clear(d)})}else this._clear(d,e);return false}},cancel:function(){var d=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):
+this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--){this.containers[e]._trigger("deactivate",null,d._uiHash(this));if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",null,d._uiHash(this));this.containers[e].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();b.extend(this,{helper:null,
+dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?b(this.domPosition.prev).after(this.currentItem):b(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(d){var e=this._getItemsAsjQuery(d&&d.connected),g=[];d=d||{};b(e).each(function(){var f=(b(d.item||this).attr(d.attribute||"id")||"").match(d.expression||/(.+)[-=_](.+)/);if(f)g.push((d.key||f[1]+"[]")+"="+(d.key&&d.expression?f[1]:f[2]))});!g.length&&d.key&&g.push(d.key+"=");return g.join("&")},
+toArray:function(d){var e=this._getItemsAsjQuery(d&&d.connected),g=[];d=d||{};e.each(function(){g.push(b(d.item||this).attr(d.attribute||"id")||"")});return g},_intersectsWith:function(d){var e=this.positionAbs.left,g=e+this.helperProportions.width,f=this.positionAbs.top,a=f+this.helperProportions.height,c=d.left,h=c+d.width,i=d.top,j=i+d.height,n=this.offset.click.top,p=this.offset.click.left;n=f+n>i&&f+n<j&&e+p>c&&e+p<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
+this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>d[this.floating?"width":"height"]?n:c<e+this.helperProportions.width/2&&g-this.helperProportions.width/2<h&&i<f+this.helperProportions.height/2&&a-this.helperProportions.height/2<j},_intersectsWithPointer:function(d){var e=b.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top,d.height);d=b.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left,d.width);e=e&&d;d=this._getDragVerticalDirection();
+var g=this._getDragHorizontalDirection();if(!e)return false;return this.floating?g&&g=="right"||d=="down"?2:1:d&&(d=="down"?2:1)},_intersectsWithSides:function(d){var e=b.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top+d.height/2,d.height);d=b.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left+d.width/2,d.width);var g=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:g&&(g=="down"&&e||g=="up"&&!e)},
+_getDragVerticalDirection:function(){var d=this.positionAbs.top-this.lastPositionAbs.top;return d!=0&&(d>0?"down":"up")},_getDragHorizontalDirection:function(){var d=this.positionAbs.left-this.lastPositionAbs.left;return d!=0&&(d>0?"right":"left")},refresh:function(d){this._refreshItems(d);this.refreshPositions();return this},_connectWith:function(){var d=this.options;return d.connectWith.constructor==String?[d.connectWith]:d.connectWith},_getItemsAsjQuery:function(d){var e=[],g=[],f=this._connectWith();
+if(f&&d)for(d=f.length-1;d>=0;d--)for(var a=b(f[d]),c=a.length-1;c>=0;c--){var h=b.data(a[c],"sortable");if(h&&h!=this&&!h.options.disabled)g.push([b.isFunction(h.options.items)?h.options.items.call(h.element):b(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}g.push([b.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):b(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
+this]);for(d=g.length-1;d>=0;d--)g[d][0].each(function(){e.push(this)});return b(e)},_removeCurrentsFromItems:function(){for(var d=this.currentItem.find(":data(sortable-item)"),e=0;e<this.items.length;e++)for(var g=0;g<d.length;g++)d[g]==this.items[e].item[0]&&this.items.splice(e,1)},_refreshItems:function(d){this.items=[];this.containers=[this];var e=this.items,g=[[b.isFunction(this.options.items)?this.options.items.call(this.element[0],d,{item:this.currentItem}):b(this.options.items,this.element),
+this]],f=this._connectWith();if(f)for(var a=f.length-1;a>=0;a--)for(var c=b(f[a]),h=c.length-1;h>=0;h--){var i=b.data(c[h],"sortable");if(i&&i!=this&&!i.options.disabled){g.push([b.isFunction(i.options.items)?i.options.items.call(i.element[0],d,{item:this.currentItem}):b(i.options.items,i.element),i]);this.containers.push(i)}}for(a=g.length-1;a>=0;a--){d=g[a][1];f=g[a][0];h=0;for(c=f.length;h<c;h++){i=b(f[h]);i.data("sortable-item",d);e.push({item:i,instance:d,width:0,height:0,left:0,top:0})}}},refreshPositions:function(d){if(this.offsetParent&&
+this.helper)this.offset.parent=this._getParentOffset();for(var e=this.items.length-1;e>=0;e--){var g=this.items[e],f=this.options.toleranceElement?b(this.options.toleranceElement,g.item):g.item;if(!d){g.width=f.outerWidth();g.height=f.outerHeight()}f=f.offset();g.left=f.left;g.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(e=this.containers.length-1;e>=0;e--){f=this.containers[e].element.offset();this.containers[e].containerCache.left=
+f.left;this.containers[e].containerCache.top=f.top;this.containers[e].containerCache.width=this.containers[e].element.outerWidth();this.containers[e].containerCache.height=this.containers[e].element.outerHeight()}return this},_createPlaceholder:function(d){var e=d||this,g=e.options;if(!g.placeholder||g.placeholder.constructor==String){var f=g.placeholder;g.placeholder={element:function(){var a=b(document.createElement(e.currentItem[0].nodeName)).addClass(f||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];
+if(!f)a.style.visibility="hidden";return a},update:function(a,c){if(!(f&&!g.forcePlaceholderSize)){c.height()||c.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10));c.width()||c.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10))}}}}e.placeholder=b(g.placeholder.element.call(e.element,e.currentItem));e.currentItem.after(e.placeholder);
+g.placeholder.update(e,e.placeholder)},_contactContainers:function(d){for(var e=null,g=null,f=this.containers.length-1;f>=0;f--)if(!b.ui.contains(this.currentItem[0],this.containers[f].element[0]))if(this._intersectsWith(this.containers[f].containerCache)){if(!(e&&b.ui.contains(this.containers[f].element[0],e.element[0]))){e=this.containers[f];g=f}}else if(this.containers[f].containerCache.over){this.containers[f]._trigger("out",d,this._uiHash(this));this.containers[f].containerCache.over=0}if(e)if(this.containers.length===
+1){this.containers[g]._trigger("over",d,this._uiHash(this));this.containers[g].containerCache.over=1}else if(this.currentContainer!=this.containers[g]){e=1E4;f=null;for(var a=this.positionAbs[this.containers[g].floating?"left":"top"],c=this.items.length-1;c>=0;c--)if(b.ui.contains(this.containers[g].element[0],this.items[c].item[0])){var h=this.items[c][this.containers[g].floating?"left":"top"];if(Math.abs(h-a)<e){e=Math.abs(h-a);f=this.items[c]}}if(f||this.options.dropOnEmpty){this.currentContainer=
+this.containers[g];f?this._rearrange(d,f,null,true):this._rearrange(d,null,this.containers[g].element,true);this._trigger("change",d,this._uiHash());this.containers[g]._trigger("change",d,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[g]._trigger("over",d,this._uiHash(this));this.containers[g].containerCache.over=1}}},_createHelper:function(d){var e=this.options;d=b.isFunction(e.helper)?b(e.helper.apply(this.element[0],[d,this.currentItem])):
+e.helper=="clone"?this.currentItem.clone():this.currentItem;d.parents("body").length||b(e.appendTo!="parent"?e.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]);if(d[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(d[0].style.width==""||e.forceHelperSize)d.width(this.currentItem.width());if(d[0].style.height==
+""||e.forceHelperSize)d.height(this.currentItem.height());return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(b.isArray(d))d={left:+d[0],top:+d[1]||0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
+this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
+10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.currentItem.position();return{top:d.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions=
+{width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,b(d.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b(d.containment=="document"?document:window).height()||
+document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)){var e=b(d.containment)[0];d=b(d.containment).offset();var g=b(e).css("overflow")!="hidden";this.containment=[d.left+(parseInt(b(e).css("borderLeftWidth"),10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0)-this.margins.top,d.left+(g?Math.max(e.scrollWidth,
+e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(g?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(d,e){if(!e)e=this.position;d=d=="absolute"?1:-1;var g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=
+document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);return{top:e.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop())*d),left:e.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+f?0:g.scrollLeft())*d)}},_generatePosition:function(d){var e=this.options,g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var a=d.pageX,c=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-
+this.offset.click.left<this.containment[0])a=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])c=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])a=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])c=this.containment[3]+this.offset.click.top}if(e.grid){c=this.originalPageY+Math.round((c-this.originalPageY)/e.grid[1])*e.grid[1];c=this.containment?!(c-this.offset.click.top<
+this.containment[1]||c-this.offset.click.top>this.containment[3])?c:!(c-this.offset.click.top<this.containment[1])?c-e.grid[1]:c+e.grid[1]:c;a=this.originalPageX+Math.round((a-this.originalPageX)/e.grid[0])*e.grid[0];a=this.containment?!(a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2])?a:!(a-this.offset.click.left<this.containment[0])?a-e.grid[0]:a+e.grid[0]:a}}return{top:c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&
+this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:g.scrollLeft())}},_rearrange:function(d,e,g,f){g?g[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?e.item[0]:e.item[0].nextSibling);this.counter=
+this.counter?++this.counter:1;var a=this,c=this.counter;window.setTimeout(function(){c==a.counter&&a.refreshPositions(!f)},0)},_clear:function(d,e){this.reverting=false;var g=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();
+this.fromOutside&&!e&&g.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!e)g.push(function(a){this._trigger("update",a,this._uiHash())});if(!b.ui.contains(this.element[0],this.currentItem[0])){e||g.push(function(a){this._trigger("remove",a,this._uiHash())});for(f=this.containers.length-1;f>=0;f--)if(b.ui.contains(this.containers[f].element[0],
+this.currentItem[0])&&!e){g.push(function(a){return function(c){a._trigger("receive",c,this._uiHash(this))}}.call(this,this.containers[f]));g.push(function(a){return function(c){a._trigger("update",c,this._uiHash(this))}}.call(this,this.containers[f]))}}for(f=this.containers.length-1;f>=0;f--){e||g.push(function(a){return function(c){a._trigger("deactivate",c,this._uiHash(this))}}.call(this,this.containers[f]));if(this.containers[f].containerCache.over){g.push(function(a){return function(c){a._trigger("out",
+c,this._uiHash(this))}}.call(this,this.containers[f]));this.containers[f].containerCache.over=0}}this._storedCursor&&b("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(f=0;f<g.length;f++)g[f].call(this,d);this._trigger("stop",d,this._uiHash())}return false}e||
+this._trigger("beforeStop",d,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!e){for(f=0;f<g.length;f++)g[f].call(this,d);this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){b.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(d){var e=d||this;return{helper:e.helper,placeholder:e.placeholder||b([]),position:e.position,
+originalPosition:e.originalPosition,offset:e.positionAbs,item:e.currentItem,sender:d?d.element:null}}});b.extend(b.ui.sortable,{version:"1.8.11"})})(jQuery);
+jQuery.effects||function(b,d){function e(l){var k;if(l&&l.constructor==Array&&l.length==3)return l;if(k=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(l))return[parseInt(k[1],10),parseInt(k[2],10),parseInt(k[3],10)];if(k=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(l))return[parseFloat(k[1])*2.55,parseFloat(k[2])*2.55,parseFloat(k[3])*2.55];if(k=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(l))return[parseInt(k[1],
+16),parseInt(k[2],16),parseInt(k[3],16)];if(k=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(l))return[parseInt(k[1]+k[1],16),parseInt(k[2]+k[2],16),parseInt(k[3]+k[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(l))return j.transparent;return j[b.trim(l).toLowerCase()]}function g(l,k){var m;do{m=b.curCSS(l,k);if(m!=""&&m!="transparent"||b.nodeName(l,"body"))break;k="backgroundColor"}while(l=l.parentNode);return e(m)}function f(){var l=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+k={},m,o;if(l&&l.length&&l[0]&&l[l[0]])for(var q=l.length;q--;){m=l[q];if(typeof l[m]=="string"){o=m.replace(/\-(\w)/g,function(s,r){return r.toUpperCase()});k[o]=l[m]}}else for(m in l)if(typeof l[m]==="string")k[m]=l[m];return k}function a(l){var k,m;for(k in l){m=l[k];if(m==null||b.isFunction(m)||k in p||/scrollbar/.test(k)||!/color/i.test(k)&&isNaN(parseFloat(m)))delete l[k]}return l}function c(l,k){var m={_:0},o;for(o in k)if(l[o]!=k[o])m[o]=k[o];return m}function h(l,k,m,o){if(typeof l=="object"){o=
+k;m=null;k=l;l=k.effect}if(b.isFunction(k)){o=k;m=null;k={}}if(typeof k=="number"||b.fx.speeds[k]){o=m;m=k;k={}}if(b.isFunction(m)){o=m;m=null}k=k||{};m=m||k.duration;m=b.fx.off?0:typeof m=="number"?m:m in b.fx.speeds?b.fx.speeds[m]:b.fx.speeds._default;o=o||k.complete;return[l,k,m,o]}function i(l){if(!l||typeof l==="number"||b.fx.speeds[l])return true;if(typeof l==="string"&&!b.effects[l])return true;return false}b.effects={};b.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(l,k){b.fx.step[k]=function(m){if(!m.colorInit){m.start=g(m.elem,k);m.end=e(m.end);m.colorInit=true}m.elem.style[k]="rgb("+Math.max(Math.min(parseInt(m.pos*(m.end[0]-m.start[0])+m.start[0],10),255),0)+","+Math.max(Math.min(parseInt(m.pos*(m.end[1]-m.start[1])+m.start[1],10),255),0)+","+Math.max(Math.min(parseInt(m.pos*(m.end[2]-m.start[2])+m.start[2],10),255),0)+")"}});var j={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},n=["add","remove","toggle"],p={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};b.effects.animateClass=function(l,k,m,
+o){if(b.isFunction(m)){o=m;m=null}return this.queue("fx",function(){var q=b(this),s=q.attr("style")||" ",r=a(f.call(this)),u,v=q.attr("className");b.each(n,function(w,y){l[y]&&q[y+"Class"](l[y])});u=a(f.call(this));q.attr("className",v);q.animate(c(r,u),k,m,function(){b.each(n,function(w,y){l[y]&&q[y+"Class"](l[y])});if(typeof q.attr("style")=="object"){q.attr("style").cssText="";q.attr("style").cssText=s}else q.attr("style",s);o&&o.apply(this,arguments)});r=b.queue(this);u=r.splice(r.length-1,1)[0];
+r.splice(1,0,u);b.dequeue(this)})};b.fn.extend({_addClass:b.fn.addClass,addClass:function(l,k,m,o){return k?b.effects.animateClass.apply(this,[{add:l},k,m,o]):this._addClass(l)},_removeClass:b.fn.removeClass,removeClass:function(l,k,m,o){return k?b.effects.animateClass.apply(this,[{remove:l},k,m,o]):this._removeClass(l)},_toggleClass:b.fn.toggleClass,toggleClass:function(l,k,m,o,q){return typeof k=="boolean"||k===d?m?b.effects.animateClass.apply(this,[k?{add:l}:{remove:l},m,o,q]):this._toggleClass(l,
+k):b.effects.animateClass.apply(this,[{toggle:l},k,m,o])},switchClass:function(l,k,m,o,q){return b.effects.animateClass.apply(this,[{add:k,remove:l},m,o,q])}});b.extend(b.effects,{version:"1.8.11",save:function(l,k){for(var m=0;m<k.length;m++)k[m]!==null&&l.data("ec.storage."+k[m],l[0].style[k[m]])},restore:function(l,k){for(var m=0;m<k.length;m++)k[m]!==null&&l.css(k[m],l.data("ec.storage."+k[m]))},setMode:function(l,k){if(k=="toggle")k=l.is(":hidden")?"show":"hide";return k},getBaseline:function(l,
+k){var m;switch(l[0]){case "top":m=0;break;case "middle":m=0.5;break;case "bottom":m=1;break;default:m=l[0]/k.height}switch(l[1]){case "left":l=0;break;case "center":l=0.5;break;case "right":l=1;break;default:l=l[1]/k.width}return{x:l,y:m}},createWrapper:function(l){if(l.parent().is(".ui-effects-wrapper"))return l.parent();var k={width:l.outerWidth(true),height:l.outerHeight(true),"float":l.css("float")},m=b("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
+border:"none",margin:0,padding:0});l.wrap(m);m=l.parent();if(l.css("position")=="static"){m.css({position:"relative"});l.css({position:"relative"})}else{b.extend(k,{position:l.css("position"),zIndex:l.css("z-index")});b.each(["top","left","bottom","right"],function(o,q){k[q]=l.css(q);if(isNaN(parseInt(k[q],10)))k[q]="auto"});l.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return m.css(k).show()},removeWrapper:function(l){if(l.parent().is(".ui-effects-wrapper"))return l.parent().replaceWith(l);
+return l},setTransition:function(l,k,m,o){o=o||{};b.each(k,function(q,s){unit=l.cssUnit(s);if(unit[0]>0)o[s]=unit[0]*m+unit[1]});return o}});b.fn.extend({effect:function(l){var k=h.apply(this,arguments),m={options:k[1],duration:k[2],callback:k[3]};k=m.options.mode;var o=b.effects[l];if(b.fx.off||!o)return k?this[k](m.duration,m.callback):this.each(function(){m.callback&&m.callback.call(this)});return o.call(this,m)},_show:b.fn.show,show:function(l){if(i(l))return this._show.apply(this,arguments);
+else{var k=h.apply(this,arguments);k[1].mode="show";return this.effect.apply(this,k)}},_hide:b.fn.hide,hide:function(l){if(i(l))return this._hide.apply(this,arguments);else{var k=h.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:b.fn.toggle,toggle:function(l){if(i(l)||typeof l==="boolean"||b.isFunction(l))return this.__toggle.apply(this,arguments);else{var k=h.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(l){var k=this.css(l),
+m=[];b.each(["em","px","%","pt"],function(o,q){if(k.indexOf(q)>0)m=[parseFloat(k),q]});return m}});b.easing.jswing=b.easing.swing;b.extend(b.easing,{def:"easeOutQuad",swing:function(l,k,m,o,q){return b.easing[b.easing.def](l,k,m,o,q)},easeInQuad:function(l,k,m,o,q){return o*(k/=q)*k+m},easeOutQuad:function(l,k,m,o,q){return-o*(k/=q)*(k-2)+m},easeInOutQuad:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k+m;return-o/2*(--k*(k-2)-1)+m},easeInCubic:function(l,k,m,o,q){return o*(k/=q)*k*k+m},easeOutCubic:function(l,
+k,m,o,q){return o*((k=k/q-1)*k*k+1)+m},easeInOutCubic:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k+m;return o/2*((k-=2)*k*k+2)+m},easeInQuart:function(l,k,m,o,q){return o*(k/=q)*k*k*k+m},easeOutQuart:function(l,k,m,o,q){return-o*((k=k/q-1)*k*k*k-1)+m},easeInOutQuart:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k*k+m;return-o/2*((k-=2)*k*k*k-2)+m},easeInQuint:function(l,k,m,o,q){return o*(k/=q)*k*k*k*k+m},easeOutQuint:function(l,k,m,o,q){return o*((k=k/q-1)*k*k*k*k+1)+m},easeInOutQuint:function(l,
+k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k*k*k+m;return o/2*((k-=2)*k*k*k*k+2)+m},easeInSine:function(l,k,m,o,q){return-o*Math.cos(k/q*(Math.PI/2))+o+m},easeOutSine:function(l,k,m,o,q){return o*Math.sin(k/q*(Math.PI/2))+m},easeInOutSine:function(l,k,m,o,q){return-o/2*(Math.cos(Math.PI*k/q)-1)+m},easeInExpo:function(l,k,m,o,q){return k==0?m:o*Math.pow(2,10*(k/q-1))+m},easeOutExpo:function(l,k,m,o,q){return k==q?m+o:o*(-Math.pow(2,-10*k/q)+1)+m},easeInOutExpo:function(l,k,m,o,q){if(k==0)return m;if(k==
+q)return m+o;if((k/=q/2)<1)return o/2*Math.pow(2,10*(k-1))+m;return o/2*(-Math.pow(2,-10*--k)+2)+m},easeInCirc:function(l,k,m,o,q){return-o*(Math.sqrt(1-(k/=q)*k)-1)+m},easeOutCirc:function(l,k,m,o,q){return o*Math.sqrt(1-(k=k/q-1)*k)+m},easeInOutCirc:function(l,k,m,o,q){if((k/=q/2)<1)return-o/2*(Math.sqrt(1-k*k)-1)+m;return o/2*(Math.sqrt(1-(k-=2)*k)+1)+m},easeInElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q)==1)return m+o;s||(s=q*0.3);if(r<Math.abs(o)){r=o;l=s/4}else l=
+s/(2*Math.PI)*Math.asin(o/r);return-(r*Math.pow(2,10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s))+m},easeOutElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q)==1)return m+o;s||(s=q*0.3);if(r<Math.abs(o)){r=o;l=s/4}else l=s/(2*Math.PI)*Math.asin(o/r);return r*Math.pow(2,-10*k)*Math.sin((k*q-l)*2*Math.PI/s)+o+m},easeInOutElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q/2)==2)return m+o;s||(s=q*0.3*1.5);if(r<Math.abs(o)){r=o;l=s/4}else l=s/(2*Math.PI)*Math.asin(o/
+r);if(k<1)return-0.5*r*Math.pow(2,10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s)+m;return r*Math.pow(2,-10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s)*0.5+o+m},easeInBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;return o*(k/=q)*k*((s+1)*k-s)+m},easeOutBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;return o*((k=k/q-1)*k*((s+1)*k+s)+1)+m},easeInOutBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;if((k/=q/2)<1)return o/2*k*k*(((s*=1.525)+1)*k-s)+m;return o/2*((k-=2)*k*(((s*=1.525)+1)*k+s)+2)+m},easeInBounce:function(l,
+k,m,o,q){return o-b.easing.easeOutBounce(l,q-k,0,o,q)+m},easeOutBounce:function(l,k,m,o,q){return(k/=q)<1/2.75?o*7.5625*k*k+m:k<2/2.75?o*(7.5625*(k-=1.5/2.75)*k+0.75)+m:k<2.5/2.75?o*(7.5625*(k-=2.25/2.75)*k+0.9375)+m:o*(7.5625*(k-=2.625/2.75)*k+0.984375)+m},easeInOutBounce:function(l,k,m,o,q){if(k<q/2)return b.easing.easeInBounce(l,k*2,0,o,q)*0.5+m;return b.easing.easeOutBounce(l,k*2-q,0,o,q)*0.5+o*0.5+m}})}(jQuery);
+(function(b){b.effects.blind=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"vertical";b.effects.save(e,g);e.show();var c=b.effects.createWrapper(e).css({overflow:"hidden"}),h=a=="vertical"?"height":"width";a=a=="vertical"?c.height():c.width();f=="show"&&c.css(h,0);var i={};i[h]=f=="show"?a:0;c.animate(i,d.duration,d.options.easing,function(){f=="hide"&&e.hide();b.effects.restore(e,
+g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()})})}})(jQuery);
+(function(b){b.effects.bounce=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"effect"),a=d.options.direction||"up",c=d.options.distance||20,h=d.options.times||5,i=d.duration||250;/show|hide/.test(f)&&g.push("opacity");b.effects.save(e,g);e.show();b.effects.createWrapper(e);var j=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";c=d.options.distance||(j=="top"?e.outerHeight({margin:true})/3:e.outerWidth({margin:true})/
+3);if(f=="show")e.css("opacity",0).css(j,a=="pos"?-c:c);if(f=="hide")c/=h*2;f!="hide"&&h--;if(f=="show"){var n={opacity:1};n[j]=(a=="pos"?"+=":"-=")+c;e.animate(n,i/2,d.options.easing);c/=2;h--}for(n=0;n<h;n++){var p={},l={};p[j]=(a=="pos"?"-=":"+=")+c;l[j]=(a=="pos"?"+=":"-=")+c;e.animate(p,i/2,d.options.easing).animate(l,i/2,d.options.easing);c=f=="hide"?c*2:c/2}if(f=="hide"){n={opacity:0};n[j]=(a=="pos"?"-=":"+=")+c;e.animate(n,i/2,d.options.easing,function(){e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);
+d.callback&&d.callback.apply(this,arguments)})}else{p={};l={};p[j]=(a=="pos"?"-=":"+=")+c;l[j]=(a=="pos"?"+=":"-=")+c;e.animate(p,i/2,d.options.easing).animate(l,i/2,d.options.easing,function(){b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments)})}e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);
+(function(b){b.effects.clip=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"vertical";b.effects.save(e,g);e.show();var c=b.effects.createWrapper(e).css({overflow:"hidden"});c=e[0].tagName=="IMG"?c:e;var h={size:a=="vertical"?"height":"width",position:a=="vertical"?"top":"left"};a=a=="vertical"?c.height():c.width();if(f=="show"){c.css(h.size,0);c.css(h.position,
+a/2)}var i={};i[h.size]=f=="show"?a:0;i[h.position]=f=="show"?0:a/2;c.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.drop=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","opacity"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"left";b.effects.save(e,g);e.show();b.effects.createWrapper(e);var c=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";var h=d.options.distance||(c=="top"?e.outerHeight({margin:true})/2:e.outerWidth({margin:true})/2);if(f=="show")e.css("opacity",0).css(c,a=="pos"?-h:h);var i={opacity:f==
+"show"?1:0};i[c]=(f=="show"?a=="pos"?"+=":"-=":a=="pos"?"-=":"+=")+h;e.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.explode=function(d){return this.queue(function(){var e=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3,g=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3;d.options.mode=d.options.mode=="toggle"?b(this).is(":visible")?"hide":"show":d.options.mode;var f=b(this).show().css("visibility","hidden"),a=f.offset();a.top-=parseInt(f.css("marginTop"),10)||0;a.left-=parseInt(f.css("marginLeft"),10)||0;for(var c=f.outerWidth(true),h=f.outerHeight(true),i=0;i<e;i++)for(var j=
+0;j<g;j++)f.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(c/g),top:-i*(h/e)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:c/g,height:h/e,left:a.left+j*(c/g)+(d.options.mode=="show"?(j-Math.floor(g/2))*(c/g):0),top:a.top+i*(h/e)+(d.options.mode=="show"?(i-Math.floor(e/2))*(h/e):0),opacity:d.options.mode=="show"?0:1}).animate({left:a.left+j*(c/g)+(d.options.mode=="show"?0:(j-Math.floor(g/2))*(c/g)),top:a.top+
+i*(h/e)+(d.options.mode=="show"?0:(i-Math.floor(e/2))*(h/e)),opacity:d.options.mode=="show"?1:0},d.duration||500);setTimeout(function(){d.options.mode=="show"?f.css({visibility:"visible"}):f.css({visibility:"visible"}).hide();d.callback&&d.callback.apply(f[0]);f.dequeue();b("div.ui-effects-explode").remove()},d.duration||500)})}})(jQuery);
+(function(b){b.effects.fade=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"hide");e.animate({opacity:g},{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.fold=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.size||15,c=!!d.options.horizFirst,h=d.duration?d.duration/2:b.fx.speeds._default/2;b.effects.save(e,g);e.show();var i=b.effects.createWrapper(e).css({overflow:"hidden"}),j=f=="show"!=c,n=j?["width","height"]:["height","width"];j=j?[i.width(),i.height()]:[i.height(),i.width()];var p=/([0-9]+)%/.exec(a);if(p)a=parseInt(p[1],
+10)/100*j[f=="hide"?0:1];if(f=="show")i.css(c?{height:0,width:a}:{height:a,width:0});c={};p={};c[n[0]]=f=="show"?j[0]:a;p[n[1]]=f=="show"?j[1]:0;i.animate(c,h,d.options.easing).animate(p,h,d.options.easing,function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()})})}})(jQuery);
+(function(b){b.effects.highlight=function(d){return this.queue(function(){var e=b(this),g=["backgroundImage","backgroundColor","opacity"],f=b.effects.setMode(e,d.options.mode||"show"),a={backgroundColor:e.css("backgroundColor")};if(f=="hide")a.opacity=0;b.effects.save(e,g);e.show().css({backgroundImage:"none",backgroundColor:d.options.color||"#ffff99"}).animate(a,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);f=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.pulsate=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"show");times=(d.options.times||5)*2-1;duration=d.duration?d.duration/2:b.fx.speeds._default/2;isVisible=e.is(":visible");animateTo=0;if(!isVisible){e.css("opacity",0).show();animateTo=1}if(g=="hide"&&isVisible||g=="show"&&!isVisible)times--;for(g=0;g<times;g++){e.animate({opacity:animateTo},duration,d.options.easing);animateTo=(animateTo+1)%2}e.animate({opacity:animateTo},duration,
+d.options.easing,function(){animateTo==0&&e.hide();d.callback&&d.callback.apply(this,arguments)});e.queue("fx",function(){e.dequeue()}).dequeue()})}})(jQuery);
+(function(b){b.effects.puff=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"hide"),f=parseInt(d.options.percent,10)||150,a=f/100,c={height:e.height(),width:e.width()};b.extend(d.options,{fade:true,mode:g,percent:g=="hide"?f:100,from:g=="hide"?c:{height:c.height*a,width:c.width*a}});e.effect("scale",d.options,d.duration,d.callback);e.dequeue()})};b.effects.scale=function(d){return this.queue(function(){var e=b(this),g=b.extend(true,{},d.options),f=b.effects.setMode(e,
+d.options.mode||"effect"),a=parseInt(d.options.percent,10)||(parseInt(d.options.percent,10)==0?0:f=="hide"?0:100),c=d.options.direction||"both",h=d.options.origin;if(f!="effect"){g.origin=h||["middle","center"];g.restore=true}h={height:e.height(),width:e.width()};e.from=d.options.from||(f=="show"?{height:0,width:0}:h);a={y:c!="horizontal"?a/100:1,x:c!="vertical"?a/100:1};e.to={height:h.height*a.y,width:h.width*a.x};if(d.options.fade){if(f=="show"){e.from.opacity=0;e.to.opacity=1}if(f=="hide"){e.from.opacity=
+1;e.to.opacity=0}}g.from=e.from;g.to=e.to;g.mode=f;e.effect("size",g,d.duration,d.callback);e.dequeue()})};b.effects.size=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","width","height","overflow","opacity"],f=["position","top","bottom","left","right","overflow","opacity"],a=["width","height","overflow"],c=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+j=b.effects.setMode(e,d.options.mode||"effect"),n=d.options.restore||false,p=d.options.scale||"both",l=d.options.origin,k={height:e.height(),width:e.width()};e.from=d.options.from||k;e.to=d.options.to||k;if(l){l=b.effects.getBaseline(l,k);e.from.top=(k.height-e.from.height)*l.y;e.from.left=(k.width-e.from.width)*l.x;e.to.top=(k.height-e.to.height)*l.y;e.to.left=(k.width-e.to.width)*l.x}var m={from:{y:e.from.height/k.height,x:e.from.width/k.width},to:{y:e.to.height/k.height,x:e.to.width/k.width}};
+if(p=="box"||p=="both"){if(m.from.y!=m.to.y){g=g.concat(h);e.from=b.effects.setTransition(e,h,m.from.y,e.from);e.to=b.effects.setTransition(e,h,m.to.y,e.to)}if(m.from.x!=m.to.x){g=g.concat(i);e.from=b.effects.setTransition(e,i,m.from.x,e.from);e.to=b.effects.setTransition(e,i,m.to.x,e.to)}}if(p=="content"||p=="both")if(m.from.y!=m.to.y){g=g.concat(c);e.from=b.effects.setTransition(e,c,m.from.y,e.from);e.to=b.effects.setTransition(e,c,m.to.y,e.to)}b.effects.save(e,n?g:f);e.show();b.effects.createWrapper(e);
+e.css("overflow","hidden").css(e.from);if(p=="content"||p=="both"){h=h.concat(["marginTop","marginBottom"]).concat(c);i=i.concat(["marginLeft","marginRight"]);a=g.concat(h).concat(i);e.find("*[width]").each(function(){child=b(this);n&&b.effects.save(child,a);var o={height:child.height(),width:child.width()};child.from={height:o.height*m.from.y,width:o.width*m.from.x};child.to={height:o.height*m.to.y,width:o.width*m.to.x};if(m.from.y!=m.to.y){child.from=b.effects.setTransition(child,h,m.from.y,child.from);
+child.to=b.effects.setTransition(child,h,m.to.y,child.to)}if(m.from.x!=m.to.x){child.from=b.effects.setTransition(child,i,m.from.x,child.from);child.to=b.effects.setTransition(child,i,m.to.x,child.to)}child.css(child.from);child.animate(child.to,d.duration,d.options.easing,function(){n&&b.effects.restore(child,a)})})}e.animate(e.to,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e.to.opacity===0&&e.css("opacity",e.from.opacity);j=="hide"&&e.hide();b.effects.restore(e,
+n?g:f);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.shake=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"];b.effects.setMode(e,d.options.mode||"effect");var f=d.options.direction||"left",a=d.options.distance||20,c=d.options.times||3,h=d.duration||d.options.duration||140;b.effects.save(e,g);e.show();b.effects.createWrapper(e);var i=f=="up"||f=="down"?"top":"left",j=f=="up"||f=="left"?"pos":"neg";f={};var n={},p={};f[i]=(j=="pos"?"-=":"+=")+a;n[i]=(j=="pos"?"+=":"-=")+a*2;p[i]=
+(j=="pos"?"-=":"+=")+a*2;e.animate(f,h,d.options.easing);for(a=1;a<c;a++)e.animate(n,h,d.options.easing).animate(p,h,d.options.easing);e.animate(n,h,d.options.easing).animate(f,h/2,d.options.easing,function(){b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments)});e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);
+(function(b){b.effects.slide=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"show"),a=d.options.direction||"left";b.effects.save(e,g);e.show();b.effects.createWrapper(e).css({overflow:"hidden"});var c=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";var h=d.options.distance||(c=="top"?e.outerHeight({margin:true}):e.outerWidth({margin:true}));if(f=="show")e.css(c,a=="pos"?isNaN(h)?"-"+h:-h:h);
+var i={};i[c]=(f=="show"?a=="pos"?"+=":"-=":a=="pos"?"-=":"+=")+h;e.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.transfer=function(d){return this.queue(function(){var e=b(this),g=b(d.options.to),f=g.offset();g={top:f.top,left:f.left,height:g.innerHeight(),width:g.innerWidth()};f=e.offset();var a=b('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(d.options.className).css({top:f.top,left:f.left,height:e.innerHeight(),width:e.innerWidth(),position:"absolute"}).animate(g,d.duration,d.options.easing,function(){a.remove();d.callback&&d.callback.apply(e[0],arguments);
+e.dequeue()})})}})(jQuery);
+(function(b){b.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var d=this,e=d.options;d.running=0;d.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");d.headers=
+d.element.find(e.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){e.disabled||b(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){e.disabled||b(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){e.disabled||b(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){e.disabled||b(this).removeClass("ui-state-focus")});d.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(e.navigation){var g=d.element.find("a").filter(e.navigationFilter).eq(0);if(g.length){var f=g.closest(".ui-accordion-header");d.active=f.length?f:g.closest(".ui-accordion-content").prev()}}d.active=d._findActive(d.active||e.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");d.active.next().addClass("ui-accordion-content-active");d._createIcons();d.resize();d.element.attr("role","tablist");d.headers.attr("role","tab").bind("keydown.accordion",
+function(a){return d._keydown(a)}).next().attr("role","tabpanel");d.headers.not(d.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();d.active.length?d.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):d.headers.eq(0).attr("tabIndex",0);b.browser.safari||d.headers.find("a").attr("tabIndex",-1);e.event&&d.headers.bind(e.event.split(" ").join(".accordion ")+".accordion",function(a){d._clickHandler.call(d,a,this);a.preventDefault()})},_createIcons:function(){var d=
+this.options;if(d.icons){b("<span></span>").addClass("ui-icon "+d.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(d.icons.header).toggleClass(d.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var d=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var e=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(d.autoHeight||d.fillHeight)e.css("height","");return b.Widget.prototype.destroy.call(this)},_setOption:function(d,e){b.Widget.prototype._setOption.apply(this,arguments);d=="active"&&this.activate(e);if(d=="icons"){this._destroyIcons();
+e&&this._createIcons()}if(d=="disabled")this.headers.add(this.headers.next())[e?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(d){if(!(this.options.disabled||d.altKey||d.ctrlKey)){var e=b.ui.keyCode,g=this.headers.length,f=this.headers.index(d.target),a=false;switch(d.keyCode){case e.RIGHT:case e.DOWN:a=this.headers[(f+1)%g];break;case e.LEFT:case e.UP:a=this.headers[(f-1+g)%g];break;case e.SPACE:case e.ENTER:this._clickHandler({target:d.target},d.target);
+d.preventDefault()}if(a){b(d.target).attr("tabIndex",-1);b(a).attr("tabIndex",0);a.focus();return false}return true}},resize:function(){var d=this.options,e;if(d.fillSpace){if(b.browser.msie){var g=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}e=this.element.parent().height();b.browser.msie&&this.element.parent().css("overflow",g);this.headers.each(function(){e-=b(this).outerHeight(true)});this.headers.next().each(function(){b(this).height(Math.max(0,e-b(this).innerHeight()+
+b(this).height()))}).css("overflow","auto")}else if(d.autoHeight){e=0;this.headers.next().each(function(){e=Math.max(e,b(this).height("").height())}).height(e)}return this},activate:function(d){this.options.active=d;d=this._findActive(d)[0];this._clickHandler({target:d},d);return this},_findActive:function(d){return d?typeof d==="number"?this.headers.filter(":eq("+d+")"):this.headers.not(this.headers.not(d)):d===false?b([]):this.headers.filter(":eq(0)")},_clickHandler:function(d,e){var g=this.options;
+if(!g.disabled)if(d.target){d=b(d.currentTarget||e);e=d[0]===this.active[0];g.active=g.collapsible&&e?false:this.headers.index(d);if(!(this.running||!g.collapsible&&e)){var f=this.active;i=d.next();c=this.active.next();h={options:g,newHeader:e&&g.collapsible?b([]):d,oldHeader:this.active,newContent:e&&g.collapsible?b([]):i,oldContent:c};var a=this.headers.index(this.active[0])>this.headers.index(d[0]);this.active=e?b([]):d;this._toggle(i,c,h,e,a);f.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(g.icons.headerSelected).addClass(g.icons.header);
+if(!e){d.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(g.icons.header).addClass(g.icons.headerSelected);d.next().addClass("ui-accordion-content-active")}}}else if(g.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(g.icons.headerSelected).addClass(g.icons.header);this.active.next().addClass("ui-accordion-content-active");var c=this.active.next(),
+h={options:g,newHeader:b([]),oldHeader:g.active,newContent:b([]),oldContent:c},i=this.active=b([]);this._toggle(i,c,h)}},_toggle:function(d,e,g,f,a){var c=this,h=c.options;c.toShow=d;c.toHide=e;c.data=g;var i=function(){if(c)return c._completed.apply(c,arguments)};c._trigger("changestart",null,c.data);c.running=e.size()===0?d.size():e.size();if(h.animated){g={};g=h.collapsible&&f?{toShow:b([]),toHide:e,complete:i,down:a,autoHeight:h.autoHeight||h.fillSpace}:{toShow:d,toHide:e,complete:i,down:a,autoHeight:h.autoHeight||
+h.fillSpace};if(!h.proxied)h.proxied=h.animated;if(!h.proxiedDuration)h.proxiedDuration=h.duration;h.animated=b.isFunction(h.proxied)?h.proxied(g):h.proxied;h.duration=b.isFunction(h.proxiedDuration)?h.proxiedDuration(g):h.proxiedDuration;f=b.ui.accordion.animations;var j=h.duration,n=h.animated;if(n&&!f[n]&&!b.easing[n])n="slide";f[n]||(f[n]=function(p){this.slide(p,{easing:n,duration:j||700})});f[n](g)}else{if(h.collapsible&&f)d.toggle();else{e.hide();d.show()}i(true)}e.prev().attr({"aria-expanded":"false",
+"aria-selected":"false",tabIndex:-1}).blur();d.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(d){this.running=d?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});b.extend(b.ui.accordion,{version:"1.8.11",
+animations:{slide:function(d,e){d=b.extend({easing:"swing",duration:300},d,e);if(d.toHide.size())if(d.toShow.size()){var g=d.toShow.css("overflow"),f=0,a={},c={},h;e=d.toShow;h=e[0].style.width;e.width(parseInt(e.parent().width(),10)-parseInt(e.css("paddingLeft"),10)-parseInt(e.css("paddingRight"),10)-(parseInt(e.css("borderLeftWidth"),10)||0)-(parseInt(e.css("borderRightWidth"),10)||0));b.each(["height","paddingTop","paddingBottom"],function(i,j){c[j]="hide";i=(""+b.css(d.toShow[0],j)).match(/^([\d+-.]+)(.*)$/);
+a[j]={value:i[1],unit:i[2]||"px"}});d.toShow.css({height:0,overflow:"hidden"}).show();d.toHide.filter(":hidden").each(d.complete).end().filter(":visible").animate(c,{step:function(i,j){if(j.prop=="height")f=j.end-j.start===0?0:(j.now-j.start)/(j.end-j.start);d.toShow[0].style[j.prop]=f*a[j.prop].value+a[j.prop].unit},duration:d.duration,easing:d.easing,complete:function(){d.autoHeight||d.toShow.css("height","");d.toShow.css({width:h,overflow:g});d.complete()}})}else d.toHide.animate({height:"hide",
+paddingTop:"hide",paddingBottom:"hide"},d);else d.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},d)},bounceslide:function(d){this.slide(d,{easing:d.down?"easeOutBounce":"swing",duration:d.down?1E3:200})}}})})(jQuery);
+(function(b){var d=0;b.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var e=this,g=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(a){if(!(e.options.disabled||e.element.attr("readonly"))){f=
+false;var c=b.ui.keyCode;switch(a.keyCode){case c.PAGE_UP:e._move("previousPage",a);break;case c.PAGE_DOWN:e._move("nextPage",a);break;case c.UP:e._move("previous",a);a.preventDefault();break;case c.DOWN:e._move("next",a);a.preventDefault();break;case c.ENTER:case c.NUMPAD_ENTER:if(e.menu.active){f=true;a.preventDefault()}case c.TAB:if(!e.menu.active)return;e.menu.select(a);break;case c.ESCAPE:e.element.val(e.term);e.close(a);break;default:clearTimeout(e.searching);e.searching=setTimeout(function(){if(e.term!=
+e.element.val()){e.selectedItem=null;e.search(null,a)}},e.options.delay);break}}}).bind("keypress.autocomplete",function(a){if(f){f=false;a.preventDefault()}}).bind("focus.autocomplete",function(){if(!e.options.disabled){e.selectedItem=null;e.previous=e.element.val()}}).bind("blur.autocomplete",function(a){if(!e.options.disabled){clearTimeout(e.searching);e.closing=setTimeout(function(){e.close(a);e._change(a)},150)}});this._initSource();this.response=function(){return e._response.apply(e,arguments)};
+this.menu=b("<ul></ul>").addClass("ui-autocomplete").appendTo(b(this.options.appendTo||"body",g)[0]).mousedown(function(a){var c=e.menu.element[0];b(a.target).closest(".ui-menu-item").length||setTimeout(function(){b(document).one("mousedown",function(h){h.target!==e.element[0]&&h.target!==c&&!b.ui.contains(c,h.target)&&e.close()})},1);setTimeout(function(){clearTimeout(e.closing)},13)}).menu({focus:function(a,c){c=c.item.data("item.autocomplete");false!==e._trigger("focus",a,{item:c})&&/^key/.test(a.originalEvent.type)&&
+e.element.val(c.value)},selected:function(a,c){var h=c.item.data("item.autocomplete"),i=e.previous;if(e.element[0]!==g.activeElement){e.element.focus();e.previous=i;setTimeout(function(){e.previous=i;e.selectedItem=h},1)}false!==e._trigger("select",a,{item:h})&&e.element.val(h.value);e.term=e.element.val();e.close(a);e.selectedItem=h},blur:function(){e.menu.element.is(":visible")&&e.element.val()!==e.term&&e.element.val(e.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
+b.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();b.Widget.prototype.destroy.call(this)},_setOption:function(e,g){b.Widget.prototype._setOption.apply(this,arguments);e==="source"&&this._initSource();if(e==="appendTo")this.menu.element.appendTo(b(g||"body",this.element[0].ownerDocument)[0]);e==="disabled"&&
+g&&this.xhr&&this.xhr.abort()},_initSource:function(){var e=this,g,f;if(b.isArray(this.options.source)){g=this.options.source;this.source=function(a,c){c(b.ui.autocomplete.filter(g,a.term))}}else if(typeof this.options.source==="string"){f=this.options.source;this.source=function(a,c){e.xhr&&e.xhr.abort();e.xhr=b.ajax({url:f,data:a,dataType:"json",autocompleteRequest:++d,success:function(h){this.autocompleteRequest===d&&c(h)},error:function(){this.autocompleteRequest===d&&c([])}})}}else this.source=
+this.options.source},search:function(e,g){e=e!=null?e:this.element.val();this.term=this.element.val();if(e.length<this.options.minLength)return this.close(g);clearTimeout(this.closing);if(this._trigger("search",g)!==false)return this._search(e)},_search:function(e){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:e},this.response)},_response:function(e){if(!this.options.disabled&&e&&e.length){e=this._normalize(e);this._suggest(e);this._trigger("open")}else this.close();
+this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(e){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",e)}},_change:function(e){this.previous!==this.element.val()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(e){if(e.length&&e[0].label&&e[0].value)return e;return b.map(e,function(g){if(typeof g==="string")return{label:g,value:g};return b.extend({label:g.label||
+g.value,value:g.value||g.label},g)})},_suggest:function(e){var g=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(g,e);this.menu.deactivate();this.menu.refresh();g.show();this._resizeMenu();g.position(b.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new b.Event("mouseover"))},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(e,g){var f=this;
+b.each(g,function(a,c){f._renderItem(e,c)})},_renderItem:function(e,g){return b("<li></li>").data("item.autocomplete",g).append(b("<a></a>").text(g.label)).appendTo(e)},_move:function(e,g){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(e)||this.menu.last()&&/^next/.test(e)){this.element.val(this.term);this.menu.deactivate()}else this.menu[e](g);else this.search(null,g)},widget:function(){return this.menu.element}});b.extend(b.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(e,g){var f=new RegExp(b.ui.autocomplete.escapeRegex(g),"i");return b.grep(e,function(a){return f.test(a.label||a.value||a)})}})})(jQuery);
+(function(b){b.widget("ui.menu",{_create:function(){var d=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(e){if(b(e.target).closest(".ui-menu-item a").length){e.preventDefault();d.select(e)}});this.refresh()},refresh:function(){var d=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(e){d.activate(e,b(this).parent())}).mouseleave(function(){d.deactivate()})},activate:function(d,e){this.deactivate();if(this.hasScroll()){var g=e.offset().top-this.element.offset().top,f=this.element.attr("scrollTop"),a=this.element.height();if(g<0)this.element.attr("scrollTop",f+g);else g>=a&&this.element.attr("scrollTop",f+g-a+e.height())}this.active=e.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",d,{item:e})},
+deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(d){this.move("next",".ui-menu-item:first",d)},previous:function(d){this.move("prev",".ui-menu-item:last",d)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(d,e,g){if(this.active){d=this.active[d+"All"](".ui-menu-item").eq(0);
+d.length?this.activate(g,d):this.activate(g,this.element.children(e))}else this.activate(g,this.element.children(e))},nextPage:function(d){if(this.hasScroll())if(!this.active||this.last())this.activate(d,this.element.children(".ui-menu-item:first"));else{var e=this.active.offset().top,g=this.element.height(),f=this.element.children(".ui-menu-item").filter(function(){var a=b(this).offset().top-e-g+b(this).height();return a<10&&a>-10});f.length||(f=this.element.children(".ui-menu-item:last"));this.activate(d,
+f)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(d){if(this.hasScroll())if(!this.active||this.first())this.activate(d,this.element.children(".ui-menu-item:last"));else{var e=this.active.offset().top,g=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var f=b(this).offset().top-e+g-b(this).height();return f<10&&f>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
+this.activate(d,result)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(d){this._trigger("selected",d,{item:this.active})}})})(jQuery);
+(function(b){var d,e=function(f){b(":ui-button",f.target.form).each(function(){var a=b(this).data("button");setTimeout(function(){a.refresh()},1)})},g=function(f){var a=f.name,c=f.form,h=b([]);if(a)h=c?b(c).find("[name='"+a+"']"):b("[name='"+a+"']",f.ownerDocument).filter(function(){return!this.form});return h};b.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
+e);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var f=this,a=this.options,c=this.type==="checkbox"||this.type==="radio",h="ui-state-hover"+(!c?" ui-state-active":"");if(a.label===null)a.label=this.buttonElement.html();if(this.element.is(":disabled"))a.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
+function(){if(!a.disabled){b(this).addClass("ui-state-hover");this===d&&b(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){a.disabled||b(this).removeClass(h)}).bind("focus.button",function(){b(this).addClass("ui-state-focus")}).bind("blur.button",function(){b(this).removeClass("ui-state-focus")});c&&this.element.bind("change.button",function(){f.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(a.disabled)return false;b(this).toggleClass("ui-state-active");
+f.buttonElement.attr("aria-pressed",f.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(a.disabled)return false;b(this).addClass("ui-state-active");f.buttonElement.attr("aria-pressed",true);var i=f.element[0];g(i).not(i).map(function(){return b(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(a.disabled)return false;b(this).addClass("ui-state-active");
+d=this;b(document).one("mouseup",function(){d=null})}).bind("mouseup.button",function(){if(a.disabled)return false;b(this).removeClass("ui-state-active")}).bind("keydown.button",function(i){if(a.disabled)return false;if(i.keyCode==b.ui.keyCode.SPACE||i.keyCode==b.ui.keyCode.ENTER)b(this).addClass("ui-state-active")}).bind("keyup.button",function(){b(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(i){i.keyCode===b.ui.keyCode.SPACE&&b(this).click()})}this._setOption("disabled",
+a.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){var f=this.element.parents().filter(":last"),a="label[for="+this.element.attr("id")+"]";this.buttonElement=f.find(a);if(!this.buttonElement.length){f=f.length?f.siblings():this.element.siblings();this.buttonElement=f.filter(a);if(!this.buttonElement.length)this.buttonElement=f.find(a)}this.element.addClass("ui-helper-hidden-accessible");
+(f=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",f)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());
+this.hasTitle||this.buttonElement.removeAttr("title");b.Widget.prototype.destroy.call(this)},_setOption:function(f,a){b.Widget.prototype._setOption.apply(this,arguments);if(f==="disabled")a?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var f=this.element.is(":disabled");f!==this.options.disabled&&this._setOption("disabled",f);if(this.type==="radio")g(this.element[0]).each(function(){b(this).is(":checked")?b(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):b(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var f=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+a=b("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(f.empty()).text(),c=this.options.icons,h=c.primary&&c.secondary,i=[];if(c.primary||c.secondary){if(this.options.text)i.push("ui-button-text-icon"+(h?"s":c.primary?"-primary":"-secondary"));c.primary&&f.prepend("<span class='ui-button-icon-primary ui-icon "+c.primary+"'></span>");c.secondary&&f.append("<span class='ui-button-icon-secondary ui-icon "+c.secondary+"'></span>");if(!this.options.text){i.push(h?"ui-button-icons-only":
+"ui-button-icon-only");this.hasTitle||f.attr("title",a)}}else i.push("ui-button-text-only");f.addClass(i.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(f,a){f==="disabled"&&this.buttons.button("option",f,a);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
+destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");b.Widget.prototype.destroy.call(this)}})})(jQuery);
+(function(b,d){function e(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};b.extend(this._defaults,this.regional[""]);this.dpDiv=b('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function g(a,c){b.extend(a,c);for(var h in c)if(c[h]==
+null||c[h]==d)a[h]=c[h];return a}b.extend(b.ui,{datepicker:{version:"1.8.11"}});var f=(new Date).getTime();b.extend(e.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){g(this._defaults,a||{});return this},_attachDatepicker:function(a,c){var h=null;for(var i in this._defaults){var j=a.getAttribute("date:"+i);if(j){h=h||{};try{h[i]=eval(j)}catch(n){h[i]=j}}}i=a.nodeName.toLowerCase();
+j=i=="div"||i=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var p=this._newInst(b(a),j);p.settings=b.extend({},c||{},h||{});if(i=="input")this._connectDatepicker(a,p);else j&&this._inlineDatepicker(a,p)},_newInst:function(a,c){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:c,dpDiv:!c?this.dpDiv:b('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
+_connectDatepicker:function(a,c){var h=b(a);c.append=b([]);c.trigger=b([]);if(!h.hasClass(this.markerClassName)){this._attachments(h,c);h.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(i,j,n){c.settings[j]=n}).bind("getData.datepicker",function(i,j){return this._get(c,j)});this._autoSize(c);b.data(a,"datepicker",c)}},_attachments:function(a,c){var h=this._get(c,"appendText"),i=this._get(c,"isRTL");c.append&&
+c.append.remove();if(h){c.append=b('<span class="'+this._appendClass+'">'+h+"</span>");a[i?"before":"after"](c.append)}a.unbind("focus",this._showDatepicker);c.trigger&&c.trigger.remove();h=this._get(c,"showOn");if(h=="focus"||h=="both")a.focus(this._showDatepicker);if(h=="button"||h=="both"){h=this._get(c,"buttonText");var j=this._get(c,"buttonImage");c.trigger=b(this._get(c,"buttonImageOnly")?b("<img/>").addClass(this._triggerClass).attr({src:j,alt:h,title:h}):b('<button type="button"></button>').addClass(this._triggerClass).html(j==
+""?h:b("<img/>").attr({src:j,alt:h,title:h})));a[i?"before":"after"](c.trigger);c.trigger.click(function(){b.datepicker._datepickerShowing&&b.datepicker._lastInput==a[0]?b.datepicker._hideDatepicker():b.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var c=new Date(2009,11,20),h=this._get(a,"dateFormat");if(h.match(/[DM]/)){var i=function(j){for(var n=0,p=0,l=0;l<j.length;l++)if(j[l].length>n){n=j[l].length;p=l}return p};c.setMonth(i(this._get(a,
+h.match(/MM/)?"monthNames":"monthNamesShort")));c.setDate(i(this._get(a,h.match(/DD/)?"dayNames":"dayNamesShort"))+20-c.getDay())}a.input.attr("size",this._formatDate(a,c).length)}},_inlineDatepicker:function(a,c){var h=b(a);if(!h.hasClass(this.markerClassName)){h.addClass(this.markerClassName).append(c.dpDiv).bind("setData.datepicker",function(i,j,n){c.settings[j]=n}).bind("getData.datepicker",function(i,j){return this._get(c,j)});b.data(a,"datepicker",c);this._setDate(c,this._getDefaultDate(c),
+true);this._updateDatepicker(c);this._updateAlternate(c);c.dpDiv.show()}},_dialogDatepicker:function(a,c,h,i,j){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=b('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);b("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};b.data(this._dialogInput[0],"datepicker",a)}g(a.settings,i||{});
+c=c&&c.constructor==Date?this._formatDate(a,c):c;this._dialogInput.val(c);this._pos=j?j.length?j:[j.pageX,j.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=h;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);
+this._showDatepicker(this._dialogInput[0]);b.blockUI&&b.blockUI(this.dpDiv);b.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();b.removeData(a,"datepicker");if(i=="input"){h.append.remove();h.trigger.remove();c.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",
+this._doKeyUp)}else if(i=="div"||i=="span")c.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();if(i=="input"){a.disabled=false;h.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(i=="div"||i=="span")c.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=b.map(this._disabledInputs,
+function(j){return j==a?null:j})}},_disableDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();if(i=="input"){a.disabled=true;h.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(i=="div"||i=="span")c.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=b.map(this._disabledInputs,function(j){return j==a?null:
+j});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var c=0;c<this._disabledInputs.length;c++)if(this._disabledInputs[c]==a)return true;return false},_getInst:function(a){try{return b.data(a,"datepicker")}catch(c){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,c,h){var i=this._getInst(a);if(arguments.length==2&&typeof c=="string")return c=="defaults"?b.extend({},b.datepicker._defaults):i?c=="all"?b.extend({},
+i.settings):this._get(i,c):null;var j=c||{};if(typeof c=="string"){j={};j[c]=h}if(i){this._curInst==i&&this._hideDatepicker();var n=this._getDateDatepicker(a,true),p=this._getMinMaxDate(i,"min"),l=this._getMinMaxDate(i,"max");g(i.settings,j);if(p!==null&&j.dateFormat!==d&&j.minDate===d)i.settings.minDate=this._formatDate(i,p);if(l!==null&&j.dateFormat!==d&&j.maxDate===d)i.settings.maxDate=this._formatDate(i,l);this._attachments(b(a),i);this._autoSize(i);this._setDateDatepicker(a,n);this._updateDatepicker(i)}},
+_changeDatepicker:function(a,c,h){this._optionDatepicker(a,c,h)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,c){if(a=this._getInst(a)){this._setDate(a,c);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,c){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,c);return a?this._getDate(a):null},_doKeyDown:function(a){var c=b.datepicker._getInst(a.target),h=true,i=c.dpDiv.is(".ui-datepicker-rtl");
+c._keyEvent=true;if(b.datepicker._datepickerShowing)switch(a.keyCode){case 9:b.datepicker._hideDatepicker();h=false;break;case 13:h=b("td."+b.datepicker._dayOverClass+":not(."+b.datepicker._currentClass+")",c.dpDiv);h[0]?b.datepicker._selectDay(a.target,c.selectedMonth,c.selectedYear,h[0]):b.datepicker._hideDatepicker();return false;case 27:b.datepicker._hideDatepicker();break;case 33:b.datepicker._adjustDate(a.target,a.ctrlKey?-b.datepicker._get(c,"stepBigMonths"):-b.datepicker._get(c,"stepMonths"),
+"M");break;case 34:b.datepicker._adjustDate(a.target,a.ctrlKey?+b.datepicker._get(c,"stepBigMonths"):+b.datepicker._get(c,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)b.datepicker._clearDate(a.target);h=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)b.datepicker._gotoToday(a.target);h=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,i?+1:-1,"D");h=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)b.datepicker._adjustDate(a.target,a.ctrlKey?
+-b.datepicker._get(c,"stepBigMonths"):-b.datepicker._get(c,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,-7,"D");h=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,i?-1:+1,"D");h=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)b.datepicker._adjustDate(a.target,a.ctrlKey?+b.datepicker._get(c,"stepBigMonths"):+b.datepicker._get(c,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,
++7,"D");h=a.ctrlKey||a.metaKey;break;default:h=false}else if(a.keyCode==36&&a.ctrlKey)b.datepicker._showDatepicker(this);else h=false;if(h){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var c=b.datepicker._getInst(a.target);if(b.datepicker._get(c,"constrainInput")){c=b.datepicker._possibleChars(b.datepicker._get(c,"dateFormat"));var h=String.fromCharCode(a.charCode==d?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||h<" "||!c||c.indexOf(h)>-1}},_doKeyUp:function(a){a=b.datepicker._getInst(a.target);
+if(a.input.val()!=a.lastVal)try{if(b.datepicker.parseDate(b.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,b.datepicker._getFormatConfig(a))){b.datepicker._setDateFromField(a);b.datepicker._updateAlternate(a);b.datepicker._updateDatepicker(a)}}catch(c){b.datepicker.log(c)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=b("input",a.parentNode)[0];if(!(b.datepicker._isDisabledDatepicker(a)||b.datepicker._lastInput==a)){var c=b.datepicker._getInst(a);
+b.datepicker._curInst&&b.datepicker._curInst!=c&&b.datepicker._curInst.dpDiv.stop(true,true);var h=b.datepicker._get(c,"beforeShow");g(c.settings,h?h.apply(a,[a,c]):{});c.lastVal=null;b.datepicker._lastInput=a;b.datepicker._setDateFromField(c);if(b.datepicker._inDialog)a.value="";if(!b.datepicker._pos){b.datepicker._pos=b.datepicker._findPos(a);b.datepicker._pos[1]+=a.offsetHeight}var i=false;b(a).parents().each(function(){i|=b(this).css("position")=="fixed";return!i});if(i&&b.browser.opera){b.datepicker._pos[0]-=
+document.documentElement.scrollLeft;b.datepicker._pos[1]-=document.documentElement.scrollTop}h={left:b.datepicker._pos[0],top:b.datepicker._pos[1]};b.datepicker._pos=null;c.dpDiv.empty();c.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});b.datepicker._updateDatepicker(c);h=b.datepicker._checkOffset(c,h,i);c.dpDiv.css({position:b.datepicker._inDialog&&b.blockUI?"static":i?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"});if(!c.inline){h=b.datepicker._get(c,"showAnim");
+var j=b.datepicker._get(c,"duration"),n=function(){b.datepicker._datepickerShowing=true;var p=c.dpDiv.find("iframe.ui-datepicker-cover");if(p.length){var l=b.datepicker._getBorders(c.dpDiv);p.css({left:-l[0],top:-l[1],width:c.dpDiv.outerWidth(),height:c.dpDiv.outerHeight()})}};c.dpDiv.zIndex(b(a).zIndex()+1);b.effects&&b.effects[h]?c.dpDiv.show(h,b.datepicker._get(c,"showOptions"),j,n):c.dpDiv[h||"show"](h?j:null,n);if(!h||!j)n();c.input.is(":visible")&&!c.input.is(":disabled")&&c.input.focus();b.datepicker._curInst=
+c}}},_updateDatepicker:function(a){var c=this,h=b.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var i=a.dpDiv.find("iframe.ui-datepicker-cover");i.length&&i.css({left:-h[0],top:-h[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){b(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&b(this).removeClass("ui-datepicker-prev-hover");
+this.className.indexOf("ui-datepicker-next")!=-1&&b(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!c._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){b(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");b(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&b(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&b(this).addClass("ui-datepicker-next-hover")}}).end().find("."+
+this._dayOverClass+" a").trigger("mouseover").end();h=this._getNumberOfMonths(a);i=h[1];i>1?a.dpDiv.addClass("ui-datepicker-multi-"+i).css("width",17*i+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(h[0]!=1||h[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==b.datepicker._curInst&&b.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&
+a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var j=a.yearshtml;setTimeout(function(){j===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);j=a.yearshtml=null},0)}},_getBorders:function(a){var c=function(h){return{thin:1,medium:2,thick:3}[h]||h};return[parseFloat(c(a.css("border-left-width"))),parseFloat(c(a.css("border-top-width")))]},_checkOffset:function(a,c,h){var i=a.dpDiv.outerWidth(),j=a.dpDiv.outerHeight(),n=a.input?a.input.outerWidth():
+0,p=a.input?a.input.outerHeight():0,l=document.documentElement.clientWidth+b(document).scrollLeft(),k=document.documentElement.clientHeight+b(document).scrollTop();c.left-=this._get(a,"isRTL")?i-n:0;c.left-=h&&c.left==a.input.offset().left?b(document).scrollLeft():0;c.top-=h&&c.top==a.input.offset().top+p?b(document).scrollTop():0;c.left-=Math.min(c.left,c.left+i>l&&l>i?Math.abs(c.left+i-l):0);c.top-=Math.min(c.top,c.top+j>k&&k>j?Math.abs(j+p):0);return c},_findPos:function(a){for(var c=this._get(this._getInst(a),
+"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||b.expr.filters.hidden(a));)a=a[c?"previousSibling":"nextSibling"];a=b(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var c=this._curInst;if(!(!c||a&&c!=b.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(c,"showAnim");var h=this._get(c,"duration"),i=function(){b.datepicker._tidyDialog(c);this._curInst=null};b.effects&&b.effects[a]?c.dpDiv.hide(a,b.datepicker._get(c,"showOptions"),h,i):c.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?
+"fadeOut":"hide"](a?h:null,i);a||i();if(a=this._get(c,"onClose"))a.apply(c.input?c.input[0]:null,[c.input?c.input.val():"",c]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(b.blockUI){b.unblockUI();b("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(b.datepicker._curInst){a=
+b(a.target);a[0].id!=b.datepicker._mainDivId&&a.parents("#"+b.datepicker._mainDivId).length==0&&!a.hasClass(b.datepicker.markerClassName)&&!a.hasClass(b.datepicker._triggerClass)&&b.datepicker._datepickerShowing&&!(b.datepicker._inDialog&&b.blockUI)&&b.datepicker._hideDatepicker()}},_adjustDate:function(a,c,h){a=b(a);var i=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(i,c+(h=="M"?this._get(i,"showCurrentAtPos"):0),h);this._updateDatepicker(i)}},_gotoToday:function(a){a=
+b(a);var c=this._getInst(a[0]);if(this._get(c,"gotoCurrent")&&c.currentDay){c.selectedDay=c.currentDay;c.drawMonth=c.selectedMonth=c.currentMonth;c.drawYear=c.selectedYear=c.currentYear}else{var h=new Date;c.selectedDay=h.getDate();c.drawMonth=c.selectedMonth=h.getMonth();c.drawYear=c.selectedYear=h.getFullYear()}this._notifyChange(c);this._adjustDate(a)},_selectMonthYear:function(a,c,h){a=b(a);var i=this._getInst(a[0]);i._selectingMonthYear=false;i["selected"+(h=="M"?"Month":"Year")]=i["draw"+(h==
+"M"?"Month":"Year")]=parseInt(c.options[c.selectedIndex].value,10);this._notifyChange(i);this._adjustDate(a)},_clickMonthYear:function(a){var c=this._getInst(b(a)[0]);c.input&&c._selectingMonthYear&&setTimeout(function(){c.input.focus()},0);c._selectingMonthYear=!c._selectingMonthYear},_selectDay:function(a,c,h,i){var j=b(a);if(!(b(i).hasClass(this._unselectableClass)||this._isDisabledDatepicker(j[0]))){j=this._getInst(j[0]);j.selectedDay=j.currentDay=b("a",i).html();j.selectedMonth=j.currentMonth=
+c;j.selectedYear=j.currentYear=h;this._selectDate(a,this._formatDate(j,j.currentDay,j.currentMonth,j.currentYear))}},_clearDate:function(a){a=b(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,c){a=this._getInst(b(a)[0]);c=c!=null?c:this._formatDate(a);a.input&&a.input.val(c);this._updateAlternate(a);var h=this._get(a,"onSelect");if(h)h.apply(a.input?a.input[0]:null,[c,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();
+this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var c=this._get(a,"altField");if(c){var h=this._get(a,"altFormat")||this._get(a,"dateFormat"),i=this._getDate(a),j=this.formatDate(h,i,this._getFormatConfig(a));b(c).each(function(){b(this).val(j)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var c=a.getTime();a.setMonth(0);
+a.setDate(1);return Math.floor(Math.round((c-a)/864E5)/7)+1},parseDate:function(a,c,h){if(a==null||c==null)throw"Invalid arguments";c=typeof c=="object"?c.toString():c+"";if(c=="")return null;var i=(h?h.shortYearCutoff:null)||this._defaults.shortYearCutoff;i=typeof i!="string"?i:(new Date).getFullYear()%100+parseInt(i,10);for(var j=(h?h.dayNamesShort:null)||this._defaults.dayNamesShort,n=(h?h.dayNames:null)||this._defaults.dayNames,p=(h?h.monthNamesShort:null)||this._defaults.monthNamesShort,l=(h?
+h.monthNames:null)||this._defaults.monthNames,k=h=-1,m=-1,o=-1,q=false,s=function(x){(x=y+1<a.length&&a.charAt(y+1)==x)&&y++;return x},r=function(x){var C=s(x);x=new RegExp("^\\d{1,"+(x=="@"?14:x=="!"?20:x=="y"&&C?4:x=="o"?3:2)+"}");x=c.substring(w).match(x);if(!x)throw"Missing number at position "+w;w+=x[0].length;return parseInt(x[0],10)},u=function(x,C,J){x=s(x)?J:C;for(C=0;C<x.length;C++)if(c.substr(w,x[C].length).toLowerCase()==x[C].toLowerCase()){w+=x[C].length;return C+1}throw"Unknown name at position "+
+w;},v=function(){if(c.charAt(w)!=a.charAt(y))throw"Unexpected literal at position "+w;w++},w=0,y=0;y<a.length;y++)if(q)if(a.charAt(y)=="'"&&!s("'"))q=false;else v();else switch(a.charAt(y)){case "d":m=r("d");break;case "D":u("D",j,n);break;case "o":o=r("o");break;case "m":k=r("m");break;case "M":k=u("M",p,l);break;case "y":h=r("y");break;case "@":var B=new Date(r("@"));h=B.getFullYear();k=B.getMonth()+1;m=B.getDate();break;case "!":B=new Date((r("!")-this._ticksTo1970)/1E4);h=B.getFullYear();k=B.getMonth()+
+1;m=B.getDate();break;case "'":if(s("'"))v();else q=true;break;default:v()}if(h==-1)h=(new Date).getFullYear();else if(h<100)h+=(new Date).getFullYear()-(new Date).getFullYear()%100+(h<=i?0:-100);if(o>-1){k=1;m=o;do{i=this._getDaysInMonth(h,k-1);if(m<=i)break;k++;m-=i}while(1)}B=this._daylightSavingAdjust(new Date(h,k-1,m));if(B.getFullYear()!=h||B.getMonth()+1!=k||B.getDate()!=m)throw"Invalid date";return B},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",
+RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,c,h){if(!c)return"";var i=(h?h.dayNamesShort:null)||this._defaults.dayNamesShort,j=(h?h.dayNames:null)||this._defaults.dayNames,n=(h?h.monthNamesShort:null)||this._defaults.monthNamesShort;h=(h?h.monthNames:null)||this._defaults.monthNames;var p=function(s){(s=q+1<a.length&&
+a.charAt(q+1)==s)&&q++;return s},l=function(s,r,u){r=""+r;if(p(s))for(;r.length<u;)r="0"+r;return r},k=function(s,r,u,v){return p(s)?v[r]:u[r]},m="",o=false;if(c)for(var q=0;q<a.length;q++)if(o)if(a.charAt(q)=="'"&&!p("'"))o=false;else m+=a.charAt(q);else switch(a.charAt(q)){case "d":m+=l("d",c.getDate(),2);break;case "D":m+=k("D",c.getDay(),i,j);break;case "o":m+=l("o",(c.getTime()-(new Date(c.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":m+=l("m",c.getMonth()+1,2);break;case "M":m+=k("M",
+c.getMonth(),n,h);break;case "y":m+=p("y")?c.getFullYear():(c.getYear()%100<10?"0":"")+c.getYear()%100;break;case "@":m+=c.getTime();break;case "!":m+=c.getTime()*1E4+this._ticksTo1970;break;case "'":if(p("'"))m+="'";else o=true;break;default:m+=a.charAt(q)}return m},_possibleChars:function(a){for(var c="",h=false,i=function(n){(n=j+1<a.length&&a.charAt(j+1)==n)&&j++;return n},j=0;j<a.length;j++)if(h)if(a.charAt(j)=="'"&&!i("'"))h=false;else c+=a.charAt(j);else switch(a.charAt(j)){case "d":case "m":case "y":case "@":c+=
+"0123456789";break;case "D":case "M":return null;case "'":if(i("'"))c+="'";else h=true;break;default:c+=a.charAt(j)}return c},_get:function(a,c){return a.settings[c]!==d?a.settings[c]:this._defaults[c]},_setDateFromField:function(a,c){if(a.input.val()!=a.lastVal){var h=this._get(a,"dateFormat"),i=a.lastVal=a.input?a.input.val():null,j,n;j=n=this._getDefaultDate(a);var p=this._getFormatConfig(a);try{j=this.parseDate(h,i,p)||n}catch(l){this.log(l);i=c?"":i}a.selectedDay=j.getDate();a.drawMonth=a.selectedMonth=
+j.getMonth();a.drawYear=a.selectedYear=j.getFullYear();a.currentDay=i?j.getDate():0;a.currentMonth=i?j.getMonth():0;a.currentYear=i?j.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,c,h){var i=function(n){var p=new Date;p.setDate(p.getDate()+n);return p},j=function(n){try{return b.datepicker.parseDate(b.datepicker._get(a,"dateFormat"),n,b.datepicker._getFormatConfig(a))}catch(p){}var l=
+(n.toLowerCase().match(/^c/)?b.datepicker._getDate(a):null)||new Date,k=l.getFullYear(),m=l.getMonth();l=l.getDate();for(var o=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,q=o.exec(n);q;){switch(q[2]||"d"){case "d":case "D":l+=parseInt(q[1],10);break;case "w":case "W":l+=parseInt(q[1],10)*7;break;case "m":case "M":m+=parseInt(q[1],10);l=Math.min(l,b.datepicker._getDaysInMonth(k,m));break;case "y":case "Y":k+=parseInt(q[1],10);l=Math.min(l,b.datepicker._getDaysInMonth(k,m));break}q=o.exec(n)}return new Date(k,
+m,l)};if(c=(c=c==null||c===""?h:typeof c=="string"?j(c):typeof c=="number"?isNaN(c)?h:i(c):new Date(c.getTime()))&&c.toString()=="Invalid Date"?h:c){c.setHours(0);c.setMinutes(0);c.setSeconds(0);c.setMilliseconds(0)}return this._daylightSavingAdjust(c)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,c,h){var i=!c,j=a.selectedMonth,n=a.selectedYear;c=this._restrictMinMax(a,this._determineDate(a,c,new Date));a.selectedDay=
+a.currentDay=c.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=c.getMonth();a.drawYear=a.selectedYear=a.currentYear=c.getFullYear();if((j!=a.selectedMonth||n!=a.selectedYear)&&!h)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(i?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var c=new Date;c=this._daylightSavingAdjust(new Date(c.getFullYear(),
+c.getMonth(),c.getDate()));var h=this._get(a,"isRTL"),i=this._get(a,"showButtonPanel"),j=this._get(a,"hideIfNoPrevNext"),n=this._get(a,"navigationAsDateFormat"),p=this._getNumberOfMonths(a),l=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),m=p[0]!=1||p[1]!=1,o=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),q=this._getMinMaxDate(a,"min"),s=this._getMinMaxDate(a,"max");l=a.drawMonth-l;var r=a.drawYear;if(l<0){l+=12;r--}if(s){var u=
+this._daylightSavingAdjust(new Date(s.getFullYear(),s.getMonth()-p[0]*p[1]+1,s.getDate()));for(u=q&&u<q?q:u;this._daylightSavingAdjust(new Date(r,l,1))>u;){l--;if(l<0){l=11;r--}}}a.drawMonth=l;a.drawYear=r;u=this._get(a,"prevText");u=!n?u:this.formatDate(u,this._daylightSavingAdjust(new Date(r,l-k,1)),this._getFormatConfig(a));u=this._canAdjustMonth(a,-1,r,l)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+u+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(h?"e":"w")+'">'+u+"</span></a>":j?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+u+'"><span class="ui-icon ui-icon-circle-triangle-'+(h?"e":"w")+'">'+u+"</span></a>";var v=this._get(a,"nextText");v=!n?v:this.formatDate(v,this._daylightSavingAdjust(new Date(r,l+k,1)),this._getFormatConfig(a));j=this._canAdjustMonth(a,+1,r,l)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+v+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(h?"w":"e")+'">'+v+"</span></a>":j?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+v+'"><span class="ui-icon ui-icon-circle-triangle-'+(h?"w":"e")+'">'+v+"</span></a>";k=this._get(a,"currentText");v=this._get(a,"gotoCurrent")&&a.currentDay?o:c;k=!n?k:this.formatDate(k,v,this._getFormatConfig(a));n=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+f+'.datepicker._hideDatepicker();">'+this._get(a,
+"closeText")+"</button>":"";i=i?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(h?n:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(h?"":n)+"</div>":"";n=parseInt(this._get(a,"firstDay"),10);n=isNaN(n)?0:n;k=this._get(a,"showWeek");v=this._get(a,"dayNames");this._get(a,"dayNamesShort");var w=this._get(a,"dayNamesMin"),y=
+this._get(a,"monthNames"),B=this._get(a,"monthNamesShort"),x=this._get(a,"beforeShowDay"),C=this._get(a,"showOtherMonths"),J=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),K="",G=0;G<p[0];G++){for(var N="",H=0;H<p[1];H++){var O=this._daylightSavingAdjust(new Date(r,l,a.selectedDay)),A=" ui-corner-all",D="";if(m){D+='<div class="ui-datepicker-group';if(p[1]>1)switch(H){case 0:D+=" ui-datepicker-group-first";A=" ui-corner-"+(h?"right":"left");break;case p[1]-
+1:D+=" ui-datepicker-group-last";A=" ui-corner-"+(h?"left":"right");break;default:D+=" ui-datepicker-group-middle";A="";break}D+='">'}D+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+A+'">'+(/all|left/.test(A)&&G==0?h?j:u:"")+(/all|right/.test(A)&&G==0?h?u:j:"")+this._generateMonthYearHeader(a,l,r,q,s,G>0||H>0,y,B)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var E=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(A=0;A<7;A++){var z=
+(A+n)%7;E+="<th"+((A+n+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+v[z]+'">'+w[z]+"</span></th>"}D+=E+"</tr></thead><tbody>";E=this._getDaysInMonth(r,l);if(r==a.selectedYear&&l==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,E);A=(this._getFirstDayOfMonth(r,l)-n+7)%7;E=m?6:Math.ceil((A+E)/7);z=this._daylightSavingAdjust(new Date(r,l,1-A));for(var P=0;P<E;P++){D+="<tr>";var Q=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(z)+"</td>";for(A=0;A<7;A++){var I=
+x?x.apply(a.input?a.input[0]:null,[z]):[true,""],F=z.getMonth()!=l,L=F&&!J||!I[0]||q&&z<q||s&&z>s;Q+='<td class="'+((A+n+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(z.getTime()==O.getTime()&&l==a.selectedMonth&&a._keyEvent||M.getTime()==z.getTime()&&M.getTime()==O.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!C?"":" "+I[1]+(z.getTime()==o.getTime()?" "+this._currentClass:"")+(z.getTime()==c.getTime()?" ui-datepicker-today":
+""))+'"'+((!F||C)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+f+".datepicker._selectDay('#"+a.id+"',"+z.getMonth()+","+z.getFullYear()+', this);return false;"')+">"+(F&&!C?"&#xa0;":L?'<span class="ui-state-default">'+z.getDate()+"</span>":'<a class="ui-state-default'+(z.getTime()==c.getTime()?" ui-state-highlight":"")+(z.getTime()==o.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+z.getDate()+"</a>")+"</td>";z.setDate(z.getDate()+1);z=this._daylightSavingAdjust(z)}D+=
+Q+"</tr>"}l++;if(l>11){l=0;r++}D+="</tbody></table>"+(m?"</div>"+(p[0]>0&&H==p[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");N+=D}K+=N}K+=i+(b.browser.msie&&parseInt(b.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return K},_generateMonthYearHeader:function(a,c,h,i,j,n,p,l){var k=this._get(a,"changeMonth"),m=this._get(a,"changeYear"),o=this._get(a,"showMonthAfterYear"),q='<div class="ui-datepicker-title">',
+s="";if(n||!k)s+='<span class="ui-datepicker-month">'+p[c]+"</span>";else{p=i&&i.getFullYear()==h;var r=j&&j.getFullYear()==h;s+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+f+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+f+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var u=0;u<12;u++)if((!p||u>=i.getMonth())&&(!r||u<=j.getMonth()))s+='<option value="'+u+'"'+(u==c?' selected="selected"':"")+">"+l[u]+"</option>";s+="</select>"}o||(q+=s+(n||!(k&&
+m)?"&#xa0;":""));a.yearshtml="";if(n||!m)q+='<span class="ui-datepicker-year">'+h+"</span>";else{l=this._get(a,"yearRange").split(":");var v=(new Date).getFullYear();p=function(w){w=w.match(/c[+-].*/)?h+parseInt(w.substring(1),10):w.match(/[+-].*/)?v+parseInt(w,10):parseInt(w,10);return isNaN(w)?v:w};c=p(l[0]);l=Math.max(c,p(l[1]||""));c=i?Math.max(c,i.getFullYear()):c;l=j?Math.min(l,j.getFullYear()):l;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+f+".datepicker._selectMonthYear('#"+
+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+f+".datepicker._clickMonthYear('#"+a.id+"');\">";c<=l;c++)a.yearshtml+='<option value="'+c+'"'+(c==h?' selected="selected"':"")+">"+c+"</option>";a.yearshtml+="</select>";if(b.browser.mozilla)q+='<select class="ui-datepicker-year"><option value="'+h+'" selected="selected">'+h+"</option></select>";else{q+=a.yearshtml;a.yearshtml=null}}q+=this._get(a,"yearSuffix");if(o)q+=(n||!(k&&m)?"&#xa0;":"")+s;q+="</div>";return q},_adjustInstDate:function(a,c,h){var i=
+a.drawYear+(h=="Y"?c:0),j=a.drawMonth+(h=="M"?c:0);c=Math.min(a.selectedDay,this._getDaysInMonth(i,j))+(h=="D"?c:0);i=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(i,j,c)));a.selectedDay=i.getDate();a.drawMonth=a.selectedMonth=i.getMonth();a.drawYear=a.selectedYear=i.getFullYear();if(h=="M"||h=="Y")this._notifyChange(a)},_restrictMinMax:function(a,c){var h=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");c=h&&c<h?h:c;return c=a&&c>a?a:c},_notifyChange:function(a){var c=this._get(a,
+"onChangeMonthYear");if(c)c.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,c){return this._determineDate(a,this._get(a,c+"Date"),null)},_getDaysInMonth:function(a,c){return 32-this._daylightSavingAdjust(new Date(a,c,32)).getDate()},_getFirstDayOfMonth:function(a,c){return(new Date(a,c,1)).getDay()},_canAdjustMonth:function(a,c,h,i){var j=this._getNumberOfMonths(a);
+h=this._daylightSavingAdjust(new Date(h,i+(c<0?c:j[0]*j[1]),1));c<0&&h.setDate(this._getDaysInMonth(h.getFullYear(),h.getMonth()));return this._isInRange(a,h)},_isInRange:function(a,c){var h=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!h||c.getTime()>=h.getTime())&&(!a||c.getTime()<=a.getTime())},_getFormatConfig:function(a){var c=this._get(a,"shortYearCutoff");c=typeof c!="string"?c:(new Date).getFullYear()%100+parseInt(c,10);return{shortYearCutoff:c,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,c,h,i){if(!c){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}c=c?typeof c=="object"?c:this._daylightSavingAdjust(new Date(i,h,c)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),c,this._getFormatConfig(a))}});b.fn.datepicker=
+function(a){if(!this.length)return this;if(!b.datepicker.initialized){b(document).mousedown(b.datepicker._checkExternalClick).find("body").append(b.datepicker.dpDiv);b.datepicker.initialized=true}var c=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this[0]].concat(c));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,
+[this[0]].concat(c));return this.each(function(){typeof a=="string"?b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this].concat(c)):b.datepicker._attachDatepicker(this,a)})};b.datepicker=new e;b.datepicker.initialized=false;b.datepicker.uuid=(new Date).getTime();b.datepicker.version="1.8.11";window["DP_jQuery_"+f]=b})(jQuery);
+(function(b,d){var e={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},g={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};b.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(f){var a=b(this).css(f).offset().top;a<0&&
+b(this).css("top",f.top-a)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var f=this,a=f.options,c=a.title||"&#160;",h=b.ui.dialog.getTitleId(f.element),i=(f.uiDialog=b("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+a.dialogClass).css({zIndex:a.zIndex}).attr("tabIndex",
+-1).css("outline",0).keydown(function(p){if(a.closeOnEscape&&p.keyCode&&p.keyCode===b.ui.keyCode.ESCAPE){f.close(p);p.preventDefault()}}).attr({role:"dialog","aria-labelledby":h}).mousedown(function(p){f.moveToTop(false,p)});f.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(i);var j=(f.uiDialogTitlebar=b("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(i),n=b('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",
+"button").hover(function(){n.addClass("ui-state-hover")},function(){n.removeClass("ui-state-hover")}).focus(function(){n.addClass("ui-state-focus")}).blur(function(){n.removeClass("ui-state-focus")}).click(function(p){f.close(p);return false}).appendTo(j);(f.uiDialogTitlebarCloseText=b("<span></span>")).addClass("ui-icon ui-icon-closethick").text(a.closeText).appendTo(n);b("<span></span>").addClass("ui-dialog-title").attr("id",h).html(c).prependTo(j);if(b.isFunction(a.beforeclose)&&!b.isFunction(a.beforeClose))a.beforeClose=
+a.beforeclose;j.find("*").add(j).disableSelection();a.draggable&&b.fn.draggable&&f._makeDraggable();a.resizable&&b.fn.resizable&&f._makeResizable();f._createButtons(a.buttons);f._isOpen=false;b.fn.bgiframe&&i.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var f=this;f.overlay&&f.overlay.destroy();f.uiDialog.hide();f.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");f.uiDialog.remove();f.originalTitle&&
+f.element.attr("title",f.originalTitle);return f},widget:function(){return this.uiDialog},close:function(f){var a=this,c,h;if(false!==a._trigger("beforeClose",f)){a.overlay&&a.overlay.destroy();a.uiDialog.unbind("keypress.ui-dialog");a._isOpen=false;if(a.options.hide)a.uiDialog.hide(a.options.hide,function(){a._trigger("close",f)});else{a.uiDialog.hide();a._trigger("close",f)}b.ui.dialog.overlay.resize();if(a.options.modal){c=0;b(".ui-dialog").each(function(){if(this!==a.uiDialog[0]){h=b(this).css("z-index");
+isNaN(h)||(c=Math.max(c,h))}});b.ui.dialog.maxZ=c}return a}},isOpen:function(){return this._isOpen},moveToTop:function(f,a){var c=this,h=c.options;if(h.modal&&!f||!h.stack&&!h.modal)return c._trigger("focus",a);if(h.zIndex>b.ui.dialog.maxZ)b.ui.dialog.maxZ=h.zIndex;if(c.overlay){b.ui.dialog.maxZ+=1;c.overlay.$el.css("z-index",b.ui.dialog.overlay.maxZ=b.ui.dialog.maxZ)}f={scrollTop:c.element.attr("scrollTop"),scrollLeft:c.element.attr("scrollLeft")};b.ui.dialog.maxZ+=1;c.uiDialog.css("z-index",b.ui.dialog.maxZ);
+c.element.attr(f);c._trigger("focus",a);return c},open:function(){if(!this._isOpen){var f=this,a=f.options,c=f.uiDialog;f.overlay=a.modal?new b.ui.dialog.overlay(f):null;f._size();f._position(a.position);c.show(a.show);f.moveToTop(true);a.modal&&c.bind("keypress.ui-dialog",function(h){if(h.keyCode===b.ui.keyCode.TAB){var i=b(":tabbable",this),j=i.filter(":first");i=i.filter(":last");if(h.target===i[0]&&!h.shiftKey){j.focus(1);return false}else if(h.target===j[0]&&h.shiftKey){i.focus(1);return false}}});
+b(f.element.find(":tabbable").get().concat(c.find(".ui-dialog-buttonpane :tabbable").get().concat(c.get()))).eq(0).focus();f._isOpen=true;f._trigger("open");return f}},_createButtons:function(f){var a=this,c=false,h=b("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),i=b("<div></div>").addClass("ui-dialog-buttonset").appendTo(h);a.uiDialog.find(".ui-dialog-buttonpane").remove();typeof f==="object"&&f!==null&&b.each(f,function(){return!(c=true)});if(c){b.each(f,function(j,
+n){n=b.isFunction(n)?{click:n,text:j}:n;j=b('<button type="button"></button>').attr(n,true).unbind("click").click(function(){n.click.apply(a.element[0],arguments)}).appendTo(i);b.fn.button&&j.button()});h.appendTo(a.uiDialog)}},_makeDraggable:function(){function f(j){return{position:j.position,offset:j.offset}}var a=this,c=a.options,h=b(document),i;a.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(j,n){i=
+c.height==="auto"?"auto":b(this).height();b(this).height(b(this).height()).addClass("ui-dialog-dragging");a._trigger("dragStart",j,f(n))},drag:function(j,n){a._trigger("drag",j,f(n))},stop:function(j,n){c.position=[n.position.left-h.scrollLeft(),n.position.top-h.scrollTop()];b(this).removeClass("ui-dialog-dragging").height(i);a._trigger("dragStop",j,f(n));b.ui.dialog.overlay.resize()}})},_makeResizable:function(f){function a(j){return{originalPosition:j.originalPosition,originalSize:j.originalSize,
+position:j.position,size:j.size}}f=f===d?this.options.resizable:f;var c=this,h=c.options,i=c.uiDialog.css("position");f=typeof f==="string"?f:"n,e,s,w,se,sw,ne,nw";c.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:c.element,maxWidth:h.maxWidth,maxHeight:h.maxHeight,minWidth:h.minWidth,minHeight:c._minHeight(),handles:f,start:function(j,n){b(this).addClass("ui-dialog-resizing");c._trigger("resizeStart",j,a(n))},resize:function(j,n){c._trigger("resize",j,a(n))},stop:function(j,
+n){b(this).removeClass("ui-dialog-resizing");h.height=b(this).height();h.width=b(this).width();c._trigger("resizeStop",j,a(n));b.ui.dialog.overlay.resize()}}).css("position",i).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var f=this.options;return f.height==="auto"?f.minHeight:Math.min(f.minHeight,f.height)},_position:function(f){var a=[],c=[0,0],h;if(f){if(typeof f==="string"||typeof f==="object"&&"0"in f){a=f.split?f.split(" "):[f[0],f[1]];if(a.length===
+1)a[1]=a[0];b.each(["left","top"],function(i,j){if(+a[i]===a[i]){c[i]=a[i];a[i]=j}});f={my:a.join(" "),at:a.join(" "),offset:c.join(" ")}}f=b.extend({},b.ui.dialog.prototype.options.position,f)}else f=b.ui.dialog.prototype.options.position;(h=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(b.extend({of:window},f));h||this.uiDialog.hide()},_setOptions:function(f){var a=this,c={},h=false;b.each(f,function(i,j){a._setOption(i,j);if(i in e)h=true;if(i in
+g)c[i]=j});h&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",c)},_setOption:function(f,a){var c=this,h=c.uiDialog;switch(f){case "beforeclose":f="beforeClose";break;case "buttons":c._createButtons(a);break;case "closeText":c.uiDialogTitlebarCloseText.text(""+a);break;case "dialogClass":h.removeClass(c.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+a);break;case "disabled":a?h.addClass("ui-dialog-disabled"):h.removeClass("ui-dialog-disabled");
+break;case "draggable":var i=h.is(":data(draggable)");i&&!a&&h.draggable("destroy");!i&&a&&c._makeDraggable();break;case "position":c._position(a);break;case "resizable":(i=h.is(":data(resizable)"))&&!a&&h.resizable("destroy");i&&typeof a==="string"&&h.resizable("option","handles",a);!i&&a!==false&&c._makeResizable(a);break;case "title":b(".ui-dialog-title",c.uiDialogTitlebar).html(""+(a||"&#160;"));break}b.Widget.prototype._setOption.apply(c,arguments)},_size:function(){var f=this.options,a,c,h=
+this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(f.minWidth>f.width)f.width=f.minWidth;a=this.uiDialog.css({height:"auto",width:f.width}).height();c=Math.max(0,f.minHeight-a);if(f.height==="auto")if(b.support.minHeight)this.element.css({minHeight:c,height:"auto"});else{this.uiDialog.show();f=this.element.css("height","auto").height();h||this.uiDialog.hide();this.element.height(Math.max(f,c))}else this.element.height(Math.max(f.height-a,0));this.uiDialog.is(":data(resizable)")&&
+this.uiDialog.resizable("option","minHeight",this._minHeight())}});b.extend(b.ui.dialog,{version:"1.8.11",uuid:0,maxZ:0,getTitleId:function(f){f=f.attr("id");if(!f){this.uuid+=1;f=this.uuid}return"ui-dialog-title-"+f},overlay:function(f){this.$el=b.ui.dialog.overlay.create(f)}});b.extend(b.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:b.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(f){return f+".dialog-overlay"}).join(" "),create:function(f){if(this.instances.length===
+0){setTimeout(function(){b.ui.dialog.overlay.instances.length&&b(document).bind(b.ui.dialog.overlay.events,function(c){if(b(c.target).zIndex()<b.ui.dialog.overlay.maxZ)return false})},1);b(document).bind("keydown.dialog-overlay",function(c){if(f.options.closeOnEscape&&c.keyCode&&c.keyCode===b.ui.keyCode.ESCAPE){f.close(c);c.preventDefault()}});b(window).bind("resize.dialog-overlay",b.ui.dialog.overlay.resize)}var a=(this.oldInstances.pop()||b("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});b.fn.bgiframe&&a.bgiframe();this.instances.push(a);return a},destroy:function(f){var a=b.inArray(f,this.instances);a!=-1&&this.oldInstances.push(this.instances.splice(a,1)[0]);this.instances.length===0&&b([document,window]).unbind(".dialog-overlay");f.remove();var c=0;b.each(this.instances,function(){c=Math.max(c,this.css("z-index"))});this.maxZ=c},height:function(){var f,a;if(b.browser.msie&&b.browser.version<7){f=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+a=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return f<a?b(window).height()+"px":f+"px"}else return b(document).height()+"px"},width:function(){var f,a;if(b.browser.msie&&b.browser.version<7){f=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);a=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return f<a?b(window).width()+"px":f+"px"}else return b(document).width()+"px"},resize:function(){var f=b([]);b.each(b.ui.dialog.overlay.instances,
+function(){f=f.add(this)});f.css({width:0,height:0}).css({width:b.ui.dialog.overlay.width(),height:b.ui.dialog.overlay.height()})}});b.extend(b.ui.dialog.overlay.prototype,{destroy:function(){b.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+(function(b){b.ui=b.ui||{};var d=/left|center|right/,e=/top|center|bottom/,g=b.fn.position,f=b.fn.offset;b.fn.position=function(a){if(!a||!a.of)return g.apply(this,arguments);a=b.extend({},a);var c=b(a.of),h=c[0],i=(a.collision||"flip").split(" "),j=a.offset?a.offset.split(" "):[0,0],n,p,l;if(h.nodeType===9){n=c.width();p=c.height();l={top:0,left:0}}else if(h.setTimeout){n=c.width();p=c.height();l={top:c.scrollTop(),left:c.scrollLeft()}}else if(h.preventDefault){a.at="left top";n=p=0;l={top:a.of.pageY,
+left:a.of.pageX}}else{n=c.outerWidth();p=c.outerHeight();l=c.offset()}b.each(["my","at"],function(){var k=(a[this]||"").split(" ");if(k.length===1)k=d.test(k[0])?k.concat(["center"]):e.test(k[0])?["center"].concat(k):["center","center"];k[0]=d.test(k[0])?k[0]:"center";k[1]=e.test(k[1])?k[1]:"center";a[this]=k});if(i.length===1)i[1]=i[0];j[0]=parseInt(j[0],10)||0;if(j.length===1)j[1]=j[0];j[1]=parseInt(j[1],10)||0;if(a.at[0]==="right")l.left+=n;else if(a.at[0]==="center")l.left+=n/2;if(a.at[1]==="bottom")l.top+=
+p;else if(a.at[1]==="center")l.top+=p/2;l.left+=j[0];l.top+=j[1];return this.each(function(){var k=b(this),m=k.outerWidth(),o=k.outerHeight(),q=parseInt(b.curCSS(this,"marginLeft",true))||0,s=parseInt(b.curCSS(this,"marginTop",true))||0,r=m+q+(parseInt(b.curCSS(this,"marginRight",true))||0),u=o+s+(parseInt(b.curCSS(this,"marginBottom",true))||0),v=b.extend({},l),w;if(a.my[0]==="right")v.left-=m;else if(a.my[0]==="center")v.left-=m/2;if(a.my[1]==="bottom")v.top-=o;else if(a.my[1]==="center")v.top-=
+o/2;v.left=Math.round(v.left);v.top=Math.round(v.top);w={left:v.left-q,top:v.top-s};b.each(["left","top"],function(y,B){b.ui.position[i[y]]&&b.ui.position[i[y]][B](v,{targetWidth:n,targetHeight:p,elemWidth:m,elemHeight:o,collisionPosition:w,collisionWidth:r,collisionHeight:u,offset:j,my:a.my,at:a.at})});b.fn.bgiframe&&k.bgiframe();k.offset(b.extend(v,{using:a.using}))})};b.ui.position={fit:{left:function(a,c){var h=b(window);h=c.collisionPosition.left+c.collisionWidth-h.width()-h.scrollLeft();a.left=
+h>0?a.left-h:Math.max(a.left-c.collisionPosition.left,a.left)},top:function(a,c){var h=b(window);h=c.collisionPosition.top+c.collisionHeight-h.height()-h.scrollTop();a.top=h>0?a.top-h:Math.max(a.top-c.collisionPosition.top,a.top)}},flip:{left:function(a,c){if(c.at[0]!=="center"){var h=b(window);h=c.collisionPosition.left+c.collisionWidth-h.width()-h.scrollLeft();var i=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,j=c.at[0]==="left"?c.targetWidth:-c.targetWidth,n=-2*c.offset[0];a.left+=
+c.collisionPosition.left<0?i+j+n:h>0?i+j+n:0}},top:function(a,c){if(c.at[1]!=="center"){var h=b(window);h=c.collisionPosition.top+c.collisionHeight-h.height()-h.scrollTop();var i=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,j=c.at[1]==="top"?c.targetHeight:-c.targetHeight,n=-2*c.offset[1];a.top+=c.collisionPosition.top<0?i+j+n:h>0?i+j+n:0}}}};if(!b.offset.setOffset){b.offset.setOffset=function(a,c){if(/static/.test(b.curCSS(a,"position")))a.style.position="relative";var h=b(a),
+i=h.offset(),j=parseInt(b.curCSS(a,"top",true),10)||0,n=parseInt(b.curCSS(a,"left",true),10)||0;i={top:c.top-i.top+j,left:c.left-i.left+n};"using"in c?c.using.call(a,i):h.css(i)};b.fn.offset=function(a){var c=this[0];if(!c||!c.ownerDocument)return null;if(a)return this.each(function(){b.offset.setOffset(this,a)});return f.call(this)}}})(jQuery);
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(e){if(e===d)return this._value();this._setOption("value",e);return this},_setOption:function(e,g){if(e==="value"){this.options.value=g;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var e=this.options.value;if(typeof e!=="number")e=0;return Math.min(this.options.max,Math.max(this.min,e))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var e=this.value(),g=this._percentage();if(this.oldValue!==e){this.oldValue=e;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",e===this.options.max).width(g.toFixed(0)+"%");this.element.attr("aria-valuenow",e)}});b.extend(b.ui.progressbar,{version:"1.8.11"})})(jQuery);
+(function(b){b.widget("ui.slider",b.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var d=this,e=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");e.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
+this.range=b([]);if(e.range){if(e.range===true){this.range=b("<div></div>");if(!e.values)e.values=[this._valueMin(),this._valueMin()];if(e.values.length&&e.values.length!==2)e.values=[e.values[0],e.values[0]]}else this.range=b("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(e.range==="min"||e.range==="max")this.range.addClass("ui-slider-range-"+e.range);this.range.addClass("ui-widget-header")}b(".ui-slider-handle",this.element).length===0&&b("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
+if(e.values&&e.values.length)for(;b(".ui-slider-handle",this.element).length<e.values.length;)b("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=b(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){e.disabled||b(this).addClass("ui-state-hover")},function(){b(this).removeClass("ui-state-hover")}).focus(function(){if(e.disabled)b(this).blur();
+else{b(".ui-slider .ui-state-focus").removeClass("ui-state-focus");b(this).addClass("ui-state-focus")}}).blur(function(){b(this).removeClass("ui-state-focus")});this.handles.each(function(g){b(this).data("index.ui-slider-handle",g)});this.handles.keydown(function(g){var f=true,a=b(this).data("index.ui-slider-handle"),c,h,i;if(!d.options.disabled){switch(g.keyCode){case b.ui.keyCode.HOME:case b.ui.keyCode.END:case b.ui.keyCode.PAGE_UP:case b.ui.keyCode.PAGE_DOWN:case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:f=
+false;if(!d._keySliding){d._keySliding=true;b(this).addClass("ui-state-active");c=d._start(g,a);if(c===false)return}break}i=d.options.step;c=d.options.values&&d.options.values.length?(h=d.values(a)):(h=d.value());switch(g.keyCode){case b.ui.keyCode.HOME:h=d._valueMin();break;case b.ui.keyCode.END:h=d._valueMax();break;case b.ui.keyCode.PAGE_UP:h=d._trimAlignValue(c+(d._valueMax()-d._valueMin())/5);break;case b.ui.keyCode.PAGE_DOWN:h=d._trimAlignValue(c-(d._valueMax()-d._valueMin())/5);break;case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:if(c===
+d._valueMax())return;h=d._trimAlignValue(c+i);break;case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:if(c===d._valueMin())return;h=d._trimAlignValue(c-i);break}d._slide(g,a,h);return f}}).keyup(function(g){var f=b(this).data("index.ui-slider-handle");if(d._keySliding){d._keySliding=false;d._stop(g,f);d._change(g,f);b(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");
+this._mouseDestroy();return this},_mouseCapture:function(d){var e=this.options,g,f,a,c,h;if(e.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();g=this._normValueFromMouse({x:d.pageX,y:d.pageY});f=this._valueMax()-this._valueMin()+1;c=this;this.handles.each(function(i){var j=Math.abs(g-c.values(i));if(f>j){f=j;a=b(this);h=i}});if(e.range===true&&this.values(1)===e.min){h+=1;a=b(this.handles[h])}if(this._start(d,
+h)===false)return false;this._mouseSliding=true;c._handleIndex=h;a.addClass("ui-state-active").focus();e=a.offset();this._clickOffset=!b(d.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:d.pageX-e.left-a.width()/2,top:d.pageY-e.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(d,h,g);return this._animateOff=true},_mouseStart:function(){return true},
+_mouseDrag:function(d){var e=this._normValueFromMouse({x:d.pageX,y:d.pageY});this._slide(d,this._handleIndex,e);return false},_mouseStop:function(d){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(d,this._handleIndex);this._change(d,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(d){var e;
+if(this.orientation==="horizontal"){e=this.elementSize.width;d=d.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{e=this.elementSize.height;d=d.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}e=d/e;if(e>1)e=1;if(e<0)e=0;if(this.orientation==="vertical")e=1-e;d=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+e*d)},_start:function(d,e){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=
+this.values(e);g.values=this.values()}return this._trigger("start",d,g)},_slide:function(d,e,g){var f;if(this.options.values&&this.options.values.length){f=this.values(e?0:1);if(this.options.values.length===2&&this.options.range===true&&(e===0&&g>f||e===1&&g<f))g=f;if(g!==this.values(e)){f=this.values();f[e]=g;d=this._trigger("slide",d,{handle:this.handles[e],value:g,values:f});this.values(e?0:1);d!==false&&this.values(e,g,true)}}else if(g!==this.value()){d=this._trigger("slide",d,{handle:this.handles[e],
+value:g});d!==false&&this.value(g)}},_stop:function(d,e){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=this.values(e);g.values=this.values()}this._trigger("stop",d,g)},_change:function(d,e){if(!this._keySliding&&!this._mouseSliding){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=this.values(e);g.values=this.values()}this._trigger("change",d,g)}},value:function(d){if(arguments.length){this.options.value=
+this._trimAlignValue(d);this._refreshValue();this._change(null,0)}return this._value()},values:function(d,e){var g,f,a;if(arguments.length>1){this.options.values[d]=this._trimAlignValue(e);this._refreshValue();this._change(null,d)}if(arguments.length)if(b.isArray(arguments[0])){g=this.options.values;f=arguments[0];for(a=0;a<g.length;a+=1){g[a]=this._trimAlignValue(f[a]);this._change(null,a)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(d):this.value();
+else return this._values()},_setOption:function(d,e){var g,f=0;if(b.isArray(this.options.values))f=this.options.values.length;b.Widget.prototype._setOption.apply(this,arguments);switch(d){case "disabled":if(e){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(g=0;g<f;g+=1)this._change(null,g);this._animateOff=false;break}},_value:function(){var d=this.options.value;return d=this._trimAlignValue(d)},_values:function(d){var e,g;if(arguments.length){e=this.options.values[d];
+return e=this._trimAlignValue(e)}else{e=this.options.values.slice();for(g=0;g<e.length;g+=1)e[g]=this._trimAlignValue(e[g]);return e}},_trimAlignValue:function(d){if(d<=this._valueMin())return this._valueMin();if(d>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,g=(d-this._valueMin())%e;alignValue=d-g;if(Math.abs(g)*2>=e)alignValue+=g>0?e:-e;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var d=this.options.range,e=this.options,g=this,f=!this._animateOff?e.animate:false,a,c={},h,i,j,n;if(this.options.values&&this.options.values.length)this.handles.each(function(p){a=(g.values(p)-g._valueMin())/(g._valueMax()-g._valueMin())*100;c[g.orientation==="horizontal"?"left":"bottom"]=a+"%";b(this).stop(1,1)[f?"animate":"css"](c,e.animate);if(g.options.range===true)if(g.orientation==="horizontal"){if(p===0)g.range.stop(1,1)[f?"animate":"css"]({left:a+"%"},e.animate);
+if(p===1)g.range[f?"animate":"css"]({width:a-h+"%"},{queue:false,duration:e.animate})}else{if(p===0)g.range.stop(1,1)[f?"animate":"css"]({bottom:a+"%"},e.animate);if(p===1)g.range[f?"animate":"css"]({height:a-h+"%"},{queue:false,duration:e.animate})}h=a});else{i=this.value();j=this._valueMin();n=this._valueMax();a=n!==j?(i-j)/(n-j)*100:0;c[g.orientation==="horizontal"?"left":"bottom"]=a+"%";this.handle.stop(1,1)[f?"animate":"css"](c,e.animate);if(d==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[f?"animate":"css"]({width:a+"%"},e.animate);if(d==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-a+"%"},{queue:false,duration:e.animate});if(d==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:a+"%"},e.animate);if(d==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-a+"%"},{queue:false,duration:e.animate})}}});b.extend(b.ui.slider,{version:"1.8.11"})})(jQuery);
+(function(b,d){function e(){return++f}function g(){return++a}var f=0,a=0;b.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(c,h){if(c=="selected")this.options.collapsible&&
+h==this.options.selected||this.select(h);else{this.options[c]=h;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+g());return b.cookie.apply(null,[c].concat(b.makeArray(arguments)))},_ui:function(c,h){return{tab:c,panel:h,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c=
+b(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function h(r,u){r.css("display","");!b.support.opacity&&u.opacity&&r[0].style.removeAttribute("filter")}var i=this,j=this.options,n=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=b(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return b("a",this)[0]});this.panels=b([]);this.anchors.each(function(r,u){var v=b(u).attr("href"),w=v.split("#")[0],y;if(w&&(w===location.toString().split("#")[0]||
+(y=b("base")[0])&&w===y.href)){v=u.hash;u.href=v}if(n.test(v))i.panels=i.panels.add(i.element.find(i._sanitizeSelector(v)));else if(v&&v!=="#"){b.data(u,"href.tabs",v);b.data(u,"load.tabs",v.replace(/#.*$/,""));v=i._tabId(u);u.href="#"+v;u=i.element.find("#"+v);if(!u.length){u=b(j.panelTemplate).attr("id",v).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(i.panels[r-1]||i.list);u.data("destroy.tabs",true)}i.panels=i.panels.add(u)}else j.disabled.push(r)});if(c){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(j.selected===d){location.hash&&this.anchors.each(function(r,u){if(u.hash==location.hash){j.selected=r;return false}});if(typeof j.selected!=="number"&&j.cookie)j.selected=parseInt(i._cookie(),10);if(typeof j.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)j.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));j.selected=j.selected||(this.lis.length?0:-1)}else if(j.selected===null)j.selected=-1;j.selected=j.selected>=0&&this.anchors[j.selected]||j.selected<0?j.selected:0;j.disabled=b.unique(j.disabled.concat(b.map(this.lis.filter(".ui-state-disabled"),function(r){return i.lis.index(r)}))).sort();b.inArray(j.selected,j.disabled)!=-1&&j.disabled.splice(b.inArray(j.selected,j.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(j.selected>=0&&this.anchors.length){i.element.find(i._sanitizeSelector(i.anchors[j.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(j.selected).addClass("ui-tabs-selected ui-state-active");i.element.queue("tabs",function(){i._trigger("show",null,i._ui(i.anchors[j.selected],i.element.find(i._sanitizeSelector(i.anchors[j.selected].hash))[0]))});this.load(j.selected)}b(window).bind("unload",function(){i.lis.add(i.anchors).unbind(".tabs");i.lis=i.anchors=i.panels=null})}else j.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[j.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");j.cookie&&this._cookie(j.selected,j.cookie);c=0;for(var p;p=this.lis[c];c++)b(p)[b.inArray(c,j.disabled)!=-1&&!b(p).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");j.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(j.event!=="mouseover"){var l=function(r,u){u.is(":not(.ui-state-disabled)")&&u.addClass("ui-state-"+r)},k=function(r,u){u.removeClass("ui-state-"+
+r)};this.lis.bind("mouseover.tabs",function(){l("hover",b(this))});this.lis.bind("mouseout.tabs",function(){k("hover",b(this))});this.anchors.bind("focus.tabs",function(){l("focus",b(this).closest("li"))});this.anchors.bind("blur.tabs",function(){k("focus",b(this).closest("li"))})}var m,o;if(j.fx)if(b.isArray(j.fx)){m=j.fx[0];o=j.fx[1]}else m=o=j.fx;var q=o?function(r,u){b(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){h(u,o);i._trigger("show",null,i._ui(r,u[0]))})}:function(r,u){b(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.removeClass("ui-tabs-hide");i._trigger("show",null,i._ui(r,u[0]))},s=m?function(r,u){u.animate(m,m.duration||"normal",function(){i.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");h(u,m);i.element.dequeue("tabs")})}:function(r,u){i.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");i.element.dequeue("tabs")};
+this.anchors.bind(j.event+".tabs",function(){var r=this,u=b(r).closest("li"),v=i.panels.filter(":not(.ui-tabs-hide)"),w=i.element.find(i._sanitizeSelector(r.hash));if(u.hasClass("ui-tabs-selected")&&!j.collapsible||u.hasClass("ui-state-disabled")||u.hasClass("ui-state-processing")||i.panels.filter(":animated").length||i._trigger("select",null,i._ui(this,w[0]))===false){this.blur();return false}j.selected=i.anchors.index(this);i.abort();if(j.collapsible)if(u.hasClass("ui-tabs-selected")){j.selected=
+-1;j.cookie&&i._cookie(j.selected,j.cookie);i.element.queue("tabs",function(){s(r,v)}).dequeue("tabs");this.blur();return false}else if(!v.length){j.cookie&&i._cookie(j.selected,j.cookie);i.element.queue("tabs",function(){q(r,w)});i.load(i.anchors.index(this));this.blur();return false}j.cookie&&i._cookie(j.selected,j.cookie);if(w.length){v.length&&i.element.queue("tabs",function(){s(r,v)});i.element.queue("tabs",function(){q(r,w)});i.load(i.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+b.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));return c},destroy:function(){var c=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var h=
+b.data(this,"href.tabs");if(h)this.href=h;var i=b(this).unbind(".tabs");b.each(["href","load","cache"],function(j,n){i.removeData(n+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){b.data(this,"destroy.tabs")?b(this).remove():b(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,
+h,i){if(i===d)i=this.anchors.length;var j=this,n=this.options;h=b(n.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,h));c=!c.indexOf("#")?c.replace("#",""):this._tabId(b("a",h)[0]);h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var p=j.element.find("#"+c);p.length||(p=b(n.panelTemplate).attr("id",c).data("destroy.tabs",true));p.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(i>=this.lis.length){h.appendTo(this.list);p.appendTo(this.list[0].parentNode)}else{h.insertBefore(this.lis[i]);
+p.insertBefore(this.panels[i])}n.disabled=b.map(n.disabled,function(l){return l>=i?++l:l});this._tabify();if(this.anchors.length==1){n.selected=0;h.addClass("ui-tabs-selected ui-state-active");p.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){j._trigger("show",null,j._ui(j.anchors[0],j.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[i],this.panels[i]));return this},remove:function(c){c=this._getIndex(c);var h=this.options,i=this.lis.eq(c).remove(),j=this.panels.eq(c).remove();
+if(i.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1<this.anchors.length?1:-1));h.disabled=b.map(b.grep(h.disabled,function(n){return n!=c}),function(n){return n>=c?--n:n});this._tabify();this._trigger("remove",null,this._ui(i.find("a")[0],j[0]));return this},enable:function(c){c=this._getIndex(c);var h=this.options;if(b.inArray(c,h.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");h.disabled=b.grep(h.disabled,function(i){return i!=c});this._trigger("enable",null,
+this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){c=this._getIndex(c);var h=this.options;if(c!=h.selected){this.lis.eq(c).addClass("ui-state-disabled");h.disabled.push(c);h.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this},select:function(c){c=this._getIndex(c);if(c==-1)if(this.options.collapsible&&this.options.selected!=-1)c=this.options.selected;else return this;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},
+load:function(c){c=this._getIndex(c);var h=this,i=this.options,j=this.anchors.eq(c)[0],n=b.data(j,"load.tabs");this.abort();if(!n||this.element.queue("tabs").length!==0&&b.data(j,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing");if(i.spinner){var p=b("span",j);p.data("label.tabs",p.html()).html(i.spinner)}this.xhr=b.ajax(b.extend({},i.ajaxOptions,{url:n,success:function(l,k){h.element.find(h._sanitizeSelector(j.hash)).html(l);h._cleanup();i.cache&&b.data(j,
+"cache.tabs",true);h._trigger("load",null,h._ui(h.anchors[c],h.panels[c]));try{i.ajaxOptions.success(l,k)}catch(m){}},error:function(l,k){h._cleanup();h._trigger("load",null,h._ui(h.anchors[c],h.panels[c]));try{i.ajaxOptions.error(l,k,c,j)}catch(m){}}}));h.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(c,h){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",h);return this},length:function(){return this.anchors.length}});b.extend(b.ui.tabs,{version:"1.8.11"});b.extend(b.ui.tabs.prototype,{rotation:null,rotate:function(c,h){var i=this,j=this.options,n=i._rotate||(i._rotate=function(p){clearTimeout(i.rotation);i.rotation=setTimeout(function(){var l=j.selected;i.select(++l<i.anchors.length?l:0)},c);p&&p.stopPropagation()});h=i._unrotate||(i._unrotate=!h?function(p){p.clientX&&
 i.rotate(null)}:function(){t=j.selected;n()});if(c){this.element.bind("tabsshow",n);this.anchors.bind(j.event+".tabs",h);n()}else{clearTimeout(i.rotation);this.element.unbind("tabsshow",n);this.anchors.unbind(j.event+".tabs",h);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
\ No newline at end of file
index 8bb81aade663282d05a384f422f97c8728a17c04..d226cca5cc8dd33ecef10f6b937ecc0bc50c6fb0 100644 (file)
-/**\r
- * Class and function collection for WCF\r
- * \r
- * @author     Tim Düsterhus, Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-\r
-/**\r
- * Initialize WCF namespace\r
- */\r
-var WCF = {};\r
-\r
-/**\r
- * Extends jQuery with additional methods.\r
- */\r
-$.extend(true, {\r
-       /**\r
-        * Escapes an ID to work with jQuery selectors.\r
-        *\r
-        * @see         http://docs.jquery.com/Frequently_Asked_Questions#How_do_I_select_an_element_by_an_ID_that_has_characters_used_in_CSS_notation.3F\r
-        * @param       string          id\r
-        * @return      string\r
-        */\r
-       wcfEscapeID: function(id) {\r
-               return id.replace(/(:|\.)/g, '\\$1');\r
-       },\r
-       \r
-       /**\r
-        * Returns true if given ID exists within DOM.\r
-        * \r
-        * @param       string          id\r
-        * @return      boolean\r
-        */\r
-       wcfIsset: function(id) {\r
-               return !!$('#' + $.wcfEscapeID(id)).length;\r
-       }\r
-});\r
-\r
-/**\r
- * Extends jQuery's chainable methods.\r
- */\r
-$.fn.extend({\r
-       /**\r
-        * Returns tag name of current jQuery element.\r
-        * \r
-        * @returns     string\r
-        */\r
-       getTagName: function() {\r
-               return this.get(0).tagName.toLowerCase();\r
-       },\r
-       \r
-       /**\r
-        * Returns the dimensions for current element.\r
-        * \r
-        * @see         http://api.jquery.com/hidden-selector/\r
-        * @param       string          type\r
-        * @return      object\r
-        */\r
-       getDimensions: function(type) {\r
-               var dimensions = css = {};\r
-               var wasHidden = false;\r
-               \r
-               // show element to retrieve dimensions and restore them later\r
-               if (this.is(':hidden')) {\r
-                       css = {\r
-                               display: this.css('display'),\r
-                               visibility: this.css('visibility')\r
-                       };\r
-                       \r
-                       wasHidden = true;\r
-                       \r
-                       this.css({\r
-                               display: 'block',\r
-                               visibility: 'hidden'\r
-                       });\r
-               }\r
-               \r
-               switch (type) {\r
-                       case 'inner':\r
-                               dimensions = {\r
-                                       height: this.innerHeight(),\r
-                                       width: this.innerWidth()\r
-                               };\r
-                       break;\r
-                       \r
-                       case 'outer':\r
-                               dimensions = {\r
-                                       height: this.outerHeight(),\r
-                                       width: this.outerWidth()\r
-                               };\r
-                       break;\r
-                       \r
-                       default:\r
-                               dimensions = {\r
-                                       height: this.height(),\r
-                                       width: this.width()\r
-                               };\r
-                       break;\r
-               }\r
-               \r
-               // restore previous settings\r
-               if (wasHidden) {\r
-                       this.css(css);\r
-               }\r
-               \r
-               return dimensions;\r
-       },\r
-       \r
-       /**\r
-        * Returns the offsets for current element, defaults to position\r
-        * relative to document.\r
-        * \r
-        * @see         http://api.jquery.com/hidden-selector/\r
-        * @param       string          type\r
-        * @return      object\r
-        */\r
-       getOffsets: function(type) {\r
-               var offsets = css = {};\r
-               var wasHidden = false;\r
-               \r
-               // show element to retrieve dimensions and restore them later\r
-               if (this.is(':hidden')) {\r
-                       css = {\r
-                               display: this.css('display'),\r
-                               visibility: this.css('visibility')\r
-                       };\r
-                       \r
-                       wasHidden = true;\r
-                       \r
-                       this.css({\r
-                               display: 'block',\r
-                               visibility: 'hidden'\r
-                       });\r
-               }\r
-               \r
-               switch (type) {\r
-                       case 'offset':\r
-                               offsets = this.offset();\r
-                       break;\r
-                       \r
-                       case 'position':\r
-                       default:\r
-                               offsets = this.position();\r
-                       break;\r
-               }\r
-               \r
-               // restore previous settings\r
-               if (wasHidden) {\r
-                       this.css(css);\r
-               }\r
-               \r
-               return offsets;\r
-       },\r
-       \r
-       /**\r
-        * Changes element's position to 'absolute' or 'fixed' while maintaining it's\r
-        * current position relative to viewport. Optionally removes element from\r
-        * current DOM-node and moving it into body-element (useful for drag & drop)\r
-        * \r
-        * @param       boolean         rebase\r
-        * @return      object\r
-        */\r
-       makePositioned: function(position, rebase) {\r
-               if (position != 'absolute' && position != 'fixed') {\r
-                       position = 'absolute';\r
-               }\r
-               \r
-               var $currentPosition = this.getOffsets('position');\r
-               this.css({\r
-                       position: position,\r
-                       left: $currentPosition.left,\r
-                       margin: 0,\r
-                       top: $currentPosition.top\r
-               });\r
-               \r
-               if (rebase) {\r
-                       this.remove().appentTo('body');\r
-               }\r
-               \r
-               return this;\r
-       },\r
-       \r
-       /**\r
-        * Disables a form element.\r
-        * \r
-        * @return jQuery\r
-        */\r
-       disable: function() {\r
-               return this.attr('disabled', 'disabled');\r
-       },\r
-       \r
-       /**\r
-        * Enables a form element.\r
-        * \r
-        * @return      jQuery\r
-        */\r
-       enable: function() {\r
-               return this.removeAttr('disabled');\r
-       },\r
-       \r
-       /**\r
-        * Applies a grow-effect by resizing element while moving the\r
-        * element appropriately\r
-        * \r
-        * @param       object          data\r
-        * @param       object          options\r
-        * @return      jQuery\r
-        */\r
-       wcfGrow: function(data, options) {\r
-               // create temporarily element to determine dimensions\r
-               var $tempElementID = WCF.getRandomID();\r
-               $('body').append('<div id="' + $tempElementID + '" class="wcfDimensions">' + data.content + '</div>');\r
-               var $tempElement = $('#' + $tempElementID);\r
-               \r
-               // get content dimensions\r
-               var $dimensions = $tempElement.getDimensions();\r
-               \r
-               // remove temporarily element\r
-               $tempElement.empty().remove();\r
-               \r
-               // move parent element, used if applying effect on dialogs\r
-               if (!data.parent) {\r
-                       data.parent = this;\r
-               }\r
-               \r
-               // calculate values for grow-effect\r
-               var $borderHeight = parseInt(data.parent.css('borderTopWidth')) + parseInt(data.parent.css('borderBottomWidth'));\r
-               var $borderWidth = parseInt(data.parent.css('borderLeftWidth')) + parseInt(data.parent.css('borderRightWidth'));\r
-               \r
-               var $windowDimensions = $(window).getDimensions();\r
-               var $leftOffset = Math.round(($windowDimensions.width - ($dimensions.width + $borderWidth)) / 2);\r
-               var $topOffset = Math.round(($windowDimensions.height - ($dimensions.height + $borderHeight)) / 2);\r
-               \r
-               data.parent.makePositioned('fixed', false);\r
-               data.parent.animate({\r
-                       left: $leftOffset + 'px',\r
-                       top: $topOffset + 'px'\r
-               }, options);\r
-               \r
-               return this.animate({\r
-                       height: $dimensions.height,\r
-                       width: $dimensions.width\r
-               }, options);\r
-       },\r
-       \r
-       /**\r
-        * Shows an element by sliding and fading it into viewport.\r
-        * \r
-        * @param       string          direction\r
-        * @param       object          callback\r
-        * @returns     jQuery\r
-        */\r
-       wcfDropIn: function(direction, callback) {\r
-               if (!direction) direction = 'up';\r
-               \r
-               return this.show(WCF.getEffect(this.getTagName(), 'drop'), { direction: direction }, 600, callback);\r
-       },\r
-       \r
-       /**\r
-        * Hides an element by sliding and fading it out the viewport.\r
-        * \r
-        * @param       string          direction\r
-        * @param       object          callback\r
-        * @returns     jQuery\r
-        */\r
-       wcfDropOut: function(direction, callback) {\r
-               if (!direction) direction = 'down';\r
-               \r
-               return this.hide(WCF.getEffect(this.getTagName(), 'drop'), { direction: direction }, 600, callback);\r
-       },\r
-       \r
-       /**\r
-        * Shows an element by blinding it up.\r
-        * \r
-        * @param       string          direction\r
-        * @param       object          callback\r
-        * @returns     jQuery\r
-        */\r
-       wcfBlindIn: function(direction, callback) {\r
-               if (!direction) direction = 'vertical';\r
-               \r
-               return this.show(WCF.getEffect(this.getTagName(), 'blind'), { direction: direction }, 200, callback);\r
-       },\r
-       \r
-       /**\r
-        * Hides an element by blinding it down.\r
-        * \r
-        * @param       string          direction\r
-        * @param       object          callback\r
-        * @returns     jQuery\r
-        */\r
-       wcfBlindOut: function(direction, callback) {\r
-               if (!direction) direction = 'vertical';\r
-               \r
-               return this.hide(WCF.getEffect(this.getTagName(), 'blind'), { direction: direction }, 200, callback);\r
-       },\r
-       \r
-       /**\r
-        * Highlights an element.\r
-        * \r
-        * @param       object          options\r
-        * @param       object          callback\r
-        * @returns     jQuery\r
-        */\r
-       wcfHighlight: function(options, callback) {\r
-               return this.effect('highlight', options, 600, callback);\r
-       }\r
-});\r
-\r
-/**\r
- * WoltLab Community Framework core methods\r
- */\r
-$.extend(WCF, {\r
-       /**\r
-        * Counter for dynamic element id's\r
-        *\r
-        * @var integer\r
-        */\r
-       _idCounter: 0,\r
-       \r
-       /**\r
-        * Shows a modal dialog with a built-in AJAX-loader.\r
-        * \r
-        * @param       string          dialogID\r
-        * @param       boolean         resetDialog\r
-        */\r
-       showAJAXDialog: function(dialogID, resetDialog) {\r
-               if (!dialogID) {\r
-                       dialogID = this.getRandomID();\r
-               }\r
-               \r
-               if (!$.wcfIsset(dialogID)) {\r
-                       $('body').append($('<div id="' + dialogID + '"></div>'));\r
-               }\r
-               \r
-               var dialog = $('#' + $.wcfEscapeID(dialogID));\r
-               \r
-               if (resetDialog) {\r
-                       dialog.empty();\r
-               }\r
-               \r
-               dialog.addClass('overlayLoading');\r
-               \r
-               var dialogOptions = arguments[2] || {};\r
-               dialog.wcfAJAXDialog(dialogOptions);\r
-       },\r
-       \r
-       /**\r
-        * Shows a modal dialog.\r
-        * @param       string          dialogID\r
-        */\r
-       showDialog: function(dialogID) {\r
-               // we cannot work with a non-existant dialog, if you wish to\r
-               // load content via AJAX, see showAJAXDialog() instead\r
-               if (!$.wcfIsset(dialogID)) return;\r
-               \r
-               var $dialog = $('#' + $.wcfEscapeID(dialogID));\r
-               \r
-               var dialogOptions = arguments[2] || {};\r
-               $dialog.wcfDialog(dialogOptions);\r
-       },\r
-       \r
-       /**\r
-        * Returns a dynamically created id.\r
-        * \r
-        * @see         https://github.com/sstephenson/prototype/blob/master/src/prototype/dom/dom.js#L1789\r
-        * @return      string\r
-        */\r
-       getRandomID: function() {\r
-               var $elementID = '';\r
-               \r
-               do {\r
-                       $elementID = 'wcf' + this._idCounter++;\r
-               }\r
-               while ($.wcfIsset($elementID));\r
-               \r
-               return $elementID;\r
-       },\r
-       \r
-       /**\r
-        * Wrapper for $.inArray which returns boolean value instead of\r
-        * index value, similar to PHP's in_array().\r
-        * \r
-        * @param       mixed           needle\r
-        * @param       array           haystack\r
-        * @return      boolean\r
-        */\r
-       inArray: function(needle, haystack) {\r
-               return ($.inArray(needle, haystack) != -1);\r
-       },\r
-       \r
-       /**\r
-        * Adjusts effect for partially supported elements.\r
-        * \r
-        * @param       object          object\r
-        * @param       string          effect\r
-        * @return      string\r
-        */\r
-       getEffect: function(tagName, effect) {\r
-               // most effects are not properly supported on table rows, use highlight instead\r
-               if (tagName == 'tr') {\r
-                       return 'highlight';\r
-               }\r
-               \r
-               return effect;\r
-       }\r
-});\r
-\r
-/**\r
- * Provides a simple call for periodical executed functions. Based upon\r
- * ideas by Prototype's PeriodicalExecuter.\r
- * \r
- * @see                https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/periodical_executer.js\r
- * @param      function                callback\r
- * @param      integer                 delay\r
- */\r
-WCF.PeriodicalExecuter = function(callback, delay) { this.init(callback, delay); };\r
-WCF.PeriodicalExecuter.prototype = {\r
-       /**\r
-        * Initializes a periodical executer.\r
-        * \r
-        * @param       function                callback\r
-        * @param       integer                 delay\r
-        */\r
-       init: function(callback, delay) {\r
-               this.callback = callback;\r
-               this.delay = delay;\r
-               this.loop = true;\r
-               \r
-               this.intervalID = setInterval($.proxy(this._execute, this), this.delay);\r
-       },\r
-       \r
-       /**\r
-        * Executes callback.\r
-        */\r
-       _execute: function() {\r
-               this.callback(this);\r
-               \r
-               if (!this.loop) {\r
-                       clearInterval(this.intervalID);\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Terminates loop.\r
-        */\r
-       stop: function() {\r
-               this.loop = false;\r
-       }\r
-};\r
-\r
-/**\r
- * Namespace for AJAXProxies\r
- */\r
-WCF.Action = {};\r
-\r
-/**\r
- * Basic implementation for AJAX-based proxyies\r
- * \r
- * @param      object          options\r
- */\r
-WCF.Action.Proxy = function(options) { this.init(options); };\r
-WCF.Action.Proxy.prototype = {\r
-       /**\r
-        * Initializes AJAXProxy.\r
-        * \r
-        * @param       object          options\r
-        */\r
-       init: function(options) {\r
-               // initialize default values\r
-               this.options = $.extend(true, {\r
-                       autoSend: false,\r
-                       data: { },\r
-                       after: null,\r
-                       init: null,\r
-                       failure: null,\r
-                       success: null,\r
-                       type: 'POST',\r
-                       url: 'index.php?action=AJAXProxy&t=' + SECURITY_TOKEN + SID_ARG_2ND\r
-               }, options);\r
-               \r
-               this.confirmationDialog = null;\r
-               this.loading = null;\r
-               \r
-               // send request immediately after initialization\r
-               if (this.options.autoSend) {\r
-                       this.sendRequest();\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Sends an AJAX request.\r
-        */\r
-       sendRequest: function() {\r
-               this._init();\r
-               \r
-               $.ajax({\r
-                       data: this.options.data,\r
-                       dataType: 'json',\r
-                       type: this.options.type,\r
-                       url: this.options.url,\r
-                       success: $.proxy(this._success, this),\r
-                       error: $.proxy(this._failure, this)\r
-               });\r
-       },\r
-       \r
-       /**\r
-        * Fires before request is send, displays global loading status.\r
-        */\r
-       _init: function() {\r
-               if ($.isFunction(this.options.init)) {\r
-                       this.options.init();\r
-               }\r
-               \r
-               $('<div id="actionProxyLoading" style="display: none;">Loading …</div>').appendTo($('body'));\r
-               this.loading = $('#actionProxyLoading');\r
-               this.loading.wcfDropIn();\r
-       },\r
-       \r
-       /**\r
-        * Handles AJAX errors.\r
-        * \r
-        * @param       object          jqXHR\r
-        * @param       string          textStatus\r
-        * @param       string          errorThrown\r
-        */\r
-       _failure: function(jqXHR, textStatus, errorThrown) {\r
-               try {\r
-                       var data = $.parseJSON(jqXHR.responseText);\r
-                       \r
-                       // call child method if applicable\r
-                       if ($.isFunction(this.options.failure)) {\r
-                               this.options.failure(jqXHR, textStatus, errorThrown, data);\r
-                       }\r
-                       \r
-                       var $randomID = WCF.getRandomID();\r
-                       $('<div id="' + $randomID + '" title="HTTP/1.0 ' + jqXHR.status + ' ' + errorThrown + '"><p>Der Server antwortete: ' + data.message + '.</p></div>').wcfDialog();\r
-               }\r
-               // failed to parse JSON\r
-               catch (e) {\r
-                       var $randomID = WCF.getRandomID();\r
-                       $('<div id="' + $randomID + '" title="HTTP/1.0 ' + jqXHR.status + ' ' + errorThrown + '"><p>Der Server antwortete: ' + jqXHR.responseText + '.</p></div>').wcfDialog();\r
-               }\r
-               \r
-               this._after();\r
-       },\r
-       \r
-       /**\r
-        * Handles successful AJAX requests.\r
-        * \r
-        * @param       object          data\r
-        * @param       string          textStatus\r
-        * @param       object          jqXHR\r
-        */\r
-       _success: function(data, textStatus, jqXHR) {\r
-               // call child method if applicable\r
-               if ($.isFunction(this.options.success)) {\r
-                       this.options.success(data, textStatus, jqXHR);\r
-               }\r
-               \r
-               this._after();\r
-       },\r
-       \r
-       /**\r
-        * Fires after an AJAX request, hides global loading status.\r
-        */\r
-       _after: function() {\r
-               if ($.isFunction(this.options.after)) {\r
-                       this.options.after();\r
-               }\r
-               \r
-               this.loading.wcfDropOut('up');\r
-       },\r
-       \r
-       /**\r
-        * Sets options, MUST be used to set parameters before sending request\r
-        * if calling from child classes.\r
-        * \r
-        * @param       string          optionName\r
-        * @param       mixed           optionData\r
-        */\r
-       setOption: function(optionName, optionData) {\r
-               this.options[optionName] = optionData;\r
-       }\r
-};\r
-\r
-/**\r
- * Basic implementation for simple proxy access using bound elements.\r
- * \r
- * @param      object          options\r
- * @param      object          callbacks\r
- */\r
-WCF.Action.SimpleProxy = function(options, callbacks) { this.init(options, callbacks); };\r
-WCF.Action.SimpleProxy.prototype = {\r
-       /**\r
-        * Initializes SimpleProxy.\r
-        * \r
-        * @param       object          options\r
-        * @param       object          callbacks\r
-        */\r
-       init: function(options, callbacks) {\r
-               /**\r
-                * action-specific options\r
-                */\r
-               this.options = $.extend(true, {\r
-                       action: '',\r
-                       className: '',\r
-                       elements: null,\r
-                       eventName: 'click'\r
-               }, options);\r
-               \r
-               /**\r
-                * proxy-specific options\r
-                */\r
-               this.callbacks = $.extend(true, {\r
-                       after: null,\r
-                       failure: null,\r
-                       init: null,\r
-                       success: null\r
-               }, callbacks);\r
-               \r
-               if (!this.options.elements) return;\r
-               \r
-               // initialize proxy\r
-               this.proxy = new WCF.Action.Proxy(this.callbacks);\r
-               \r
-               // bind event listener\r
-               this.options.elements.each($.proxy(function(index, element) {\r
-                       $(element).bind(this.options.eventName, $.proxy(this._handleEvent, this));\r
-               }, this));\r
-       },\r
-       \r
-       /**\r
-        * Handles event actions.\r
-        * \r
-        * @param       object          event\r
-        */\r
-       _handleEvent: function(event) {\r
-               this.proxy.setOption('data', {\r
-                       actionName: this.options.action,\r
-                       className: this.options.className,\r
-                       objectIDs: [ $(event.target).data('objectID') ]\r
-               });\r
-               \r
-               this.proxy.sendRequest();\r
-       }\r
-};\r
-\r
-/**\r
- * Basic implementation for AJAXProxy-based deletion.\r
- * \r
- * @param      string          className\r
- * @param      jQuery          containerList\r
- */\r
-WCF.Action.Delete = function(className, containerList) { this.init(className, containerList); };\r
-WCF.Action.Delete.prototype = {\r
-       /**\r
-        * Initializes 'delete'-Proxy.\r
-        * \r
-        * @param       string          className\r
-        * @param       jQuery          containerList\r
-        */\r
-       init: function(className, containerList) {\r
-               if (!containerList.length) return;\r
-               this.containerList = containerList;\r
-               this.className = className;\r
-               \r
-               // initialize proxy\r
-               var options = {\r
-                       success: $.proxy(this._success, this)\r
-               };\r
-               this.proxy = new WCF.Action.Proxy(options);\r
-               \r
-               // bind event listener\r
-               this.containerList.each($.proxy(function(index, container) {\r
-                       $(container).find('.deleteButton').bind('click', $.proxy(this._click, this));\r
-               }, this));\r
-       },\r
-       \r
-       /**\r
-        * Sends AJAX request.\r
-        * \r
-        * @param       object          event\r
-        */\r
-       _click: function(event) {\r
-               var $target = $(event.target);\r
-               \r
-               if ($target.data('confirmMessage')) {\r
-                       if (confirm($target.data('confirmMessage'))) {\r
-                               this._sendRequest($target);\r
-                       }\r
-               }\r
-               else {\r
-                       this._sendRequest($target);\r
-               }\r
-               \r
-       },\r
-       \r
-       _sendRequest: function(object) {\r
-               this.proxy.setOption('data', {\r
-                       actionName: 'delete',\r
-                       className: this.className,\r
-                       objectIDs: [ $(object).data('objectID') ]\r
-               });\r
-               \r
-               this.proxy.sendRequest();\r
-       },\r
-       \r
-       /**\r
-        * Deletes items from containers.\r
-        * \r
-        * @param       object          data\r
-        * @param       string          textStatus\r
-        * @param       object          jqXHR\r
-        */\r
-       _success: function(data, textStatus, jqXHR) {\r
-               // remove items\r
-               this.containerList.each(function(index, container) {\r
-                       var $objectID = $(container).find('.deleteButton').data('objectID');\r
-                       if (WCF.inArray($objectID, data.objectIDs)) {\r
-                               $(container).wcfBlindOut('up', function() {\r
-                                       $(container).empty().remove();\r
-                               }, container);\r
-                       }\r
-               });\r
-       }\r
-};\r
-\r
-/**\r
- * Basic implementation for AJAXProxy-based toggle actions.\r
- * \r
- * @param      string          className\r
- * @param      jQuery          containerList\r
- */\r
-WCF.Action.Toggle = function(className, containerList) { this.init(className, containerList); };\r
-WCF.Action.Toggle.prototype = {\r
-       /**\r
-        * Initializes 'toggle'-Proxy\r
-        * \r
-        * @param       string          className\r
-        * @param       jQuery          containerList\r
-        */\r
-       init: function(className, containerList) {\r
-               if (!containerList.length) return;\r
-               this.containerList = containerList;\r
-               this.className = className;\r
-               \r
-               // initialize proxy\r
-               var options = {\r
-                       success: $.proxy(this._success, this)\r
-               };\r
-               this.proxy = new WCF.Action.Proxy(options);\r
-               \r
-               // bind event listener\r
-               this.containerList.each($.proxy(function(index, container) {\r
-                       $(container).find('.toggleButton').bind('click', $.proxy(this._click, this));\r
-               }, this));\r
-       },\r
-       \r
-       /**\r
-        * Sends AJAX request.\r
-        * \r
-        * @param       object          event\r
-        */\r
-       _click: function(event) {\r
-               this.proxy.setOption('data', {\r
-                       actionName: 'toggle',\r
-                       className: this.className,\r
-                       objectIDs: [ $(event.target).data('objectID') ]\r
-               });\r
-               \r
-               this.proxy.sendRequest();\r
-       },\r
-       \r
-       /**\r
-        * Toggles status icons.\r
-        * \r
-        * @param       object          data\r
-        * @param       string          textStatus\r
-        * @param       object          jqXHR\r
-        */\r
-       _success: function(data, textStatus, jqXHR) {\r
-               // remove items\r
-               this.containerList.each(function(index, container) {\r
-                       var $toggleButton = $(container).find('.toggleButton');\r
-                       if (WCF.inArray($toggleButton.data('objectID'), data.objectIDs)) {\r
-                               $(container).wcfHighlight();\r
-                               \r
-                               // toggle icon source\r
-                               $toggleButton.attr('src', function() {\r
-                                       if (this.src.match(/enabled(S|M|L)\.png$/)) {\r
-                                               return this.src.replace(/enabled(S|M|L)\.png$/, 'disabled$1\.png');\r
-                                       }\r
-                                       else {\r
-                                               return this.src.replace(/disabled(S|M|L)\.png$/, 'enabled$1\.png');\r
-                                       }\r
-                               });\r
-                               // toogle icon title\r
-                               $toggleButton.attr('title', function() {\r
-                                       if (this.src.match(/enabled(S|M|L)\.png$/)) {\r
-                                               return $(this).data('disableMessage');\r
-                                       }\r
-                                       else {\r
-                                               return $(this).data('enableMessage');\r
-                                       }\r
-                               });\r
-                       }\r
-               });\r
-       }\r
-};\r
-\r
-/**\r
- * Namespace for date-related functions.\r
- */\r
-WCF.Date = {};\r
-\r
-/**\r
- * Provides utility functions for date operations.\r
- */\r
-WCF.Date.Util = {\r
-       /**\r
-        * Returns UTC timestamp, if date is not given, current time will be used.\r
-        * \r
-        * @param       Date            date\r
-        * @return      integer\r
-        */\r
-       gmdate: function(date) {\r
-               var $date = (date) ? date : new Date();\r
-               \r
-               return Math.round(Date.UTC(\r
-                       $date.getUTCFullYear(),\r
-                       $date.getUTCMonth(),\r
-                       $date.getUTCDay(),\r
-                       $date.getUTCHours(),\r
-                       $date.getUTCMinutes(),\r
-                       $date.getUTCSeconds()\r
-               ) / 1000);\r
-       },\r
-       \r
-       /**\r
-        * Returns a Date object with precise offset (including timezone and local timezone).\r
-        * Parameter timestamp must be in miliseconds!\r
-        * \r
-        * @param       integer         timestamp\r
-        * @param       integer         offset\r
-        * @return      Date\r
-        */\r
-       getTimezoneDate: function(timestamp, offset) {\r
-               var $date = new Date(timestamp);\r
-               var $localOffset = $date.getTimezoneOffset() * -1 * 60000;\r
-               \r
-               return new Date((timestamp - $localOffset - offset));\r
-       }\r
-};\r
-\r
-/**\r
- * Handles relative time designations.\r
- */\r
-WCF.Date.Time = function() { this.init(); };\r
-WCF.Date.Time.prototype = {\r
-       /**\r
-        * Initializes relative datetimes.\r
-        */\r
-       init: function() {\r
-               // initialize variables\r
-               this.elements = $('time.datetime');\r
-               this.timestamp = 0;\r
-               \r
-               // calculate relative datetime on init\r
-               this._refresh();\r
-               \r
-               // re-calculate relative datetime every minute\r
-               new WCF.PeriodicalExecuter($.proxy(this._refresh, this), 60000);\r
-       },\r
-       \r
-       /**\r
-        * Refreshes relative datetime for each element.\r
-        */\r
-       _refresh: function() {\r
-               // TESTING ONLY!\r
-               var $date = new Date();\r
-               this.timestamp = ($date.getTime() - $date.getMilliseconds()) / 1000;\r
-               // TESTING ONLY!\r
-               \r
-               this.elements.each($.proxy(this._refreshElement, this));\r
-       },\r
-       \r
-       /**\r
-        * Refreshes relative datetime for current element.\r
-        * \r
-        * @param       integer         index\r
-        * @param       object          element\r
-        */\r
-       _refreshElement: function(index, element) {\r
-               if (!$(element).attr('title')) {\r
-                       $(element).attr('title', $(element).text());\r
-               }\r
-               \r
-               var $timestamp = $(element).data('timestamp');\r
-               var $date = $(element).data('date');\r
-               var $time = $(element).data('time');\r
-               var $offset = $(element).data('offset');\r
-               \r
-               // timestamp is less than 60 minutes ago (display 1 hour ago rather than 60 minutes ago)\r
-               if (this.timestamp < ($timestamp + 3540)) {\r
-                       var $minutes = Math.round((this.timestamp - $timestamp) / 60);\r
-                       $(element).text(eval(WCF.Language.get('wcf.global.date.relative.minutes')));\r
-               }\r
-               // timestamp is less than 24 hours ago\r
-               else if (this.timestamp < ($timestamp + 86400)) {\r
-                       var $hours = Math.round((this.timestamp - $timestamp) / 3600);\r
-                       $(element).text(eval(WCF.Language.get('wcf.global.date.relative.hours')));\r
-               }\r
-               // timestamp is less than a week ago\r
-               else if (this.timestamp < ($timestamp + 604800)) {\r
-                       var $days = Math.round((this.timestamp - $timestamp) / 86400);\r
-                       var $string = eval(WCF.Language.get('wcf.global.date.relative.pastDays'));\r
-               \r
-                       // get day of week\r
-                       var $dateObj = WCF.Date.Util.getTimezoneDate(($timestamp * 1000), $offset);\r
-                       var $dow = $dateObj.getDay();\r
-                       \r
-                       $(element).text($string.replace(/\%day\%/, WCF.Language.get('__days')[$dow]).replace(/\%time\%/, $time));\r
-               }\r
-               // timestamp is between ~700 million years BC and last week\r
-               else {\r
-                       var $string = WCF.Language.get('wcf.global.date.dateTimeFormat');\r
-                       $(element).text($string.replace(/\%date\%/, $date).replace(/\%time\%/, $time));\r
-               }\r
-       }\r
-};\r
-\r
-/**\r
- * Hash-like dictionary. Based upon idead from Prototype's hash\r
- * \r
- * @see        https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/hash.js\r
- */\r
-WCF.Dictionary = function() { this.init(); };\r
-WCF.Dictionary.prototype = {\r
-       /**\r
-        * Initializes a new dictionary.\r
-        */\r
-       init: function() {\r
-               this.variables = { };\r
-       },\r
-       \r
-       /**\r
-        * Adds an entry.\r
-        * \r
-        * @param       string          key\r
-        * @param       mixed           value\r
-        */\r
-       add: function(key, value) {\r
-               this.variables[key] = value;\r
-       },\r
-       \r
-       /**\r
-        * Adds a traditional object to current dataset.\r
-        * \r
-        * @param       object          object\r
-        */\r
-       addObject: function(object) {\r
-               for (var $key in object) {\r
-                       this.add($key, object[$key]);\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Adds a dictionary to current dataset.\r
-        * \r
-        * @param       object          dictionary\r
-        */\r
-       addDictionary: function(dictionary) {\r
-               dictionary.each($.proxy(function(pair) {\r
-                       this.add(pair.key, pair.value);\r
-               }, this));\r
-       },\r
-       \r
-       /**\r
-        * Retrieves the value of an entry or returns null if key is not found.\r
-        * \r
-        * @param       string          key\r
-        * @returns     mixed\r
-        */\r
-       get: function(key) {\r
-               if (this.isset(key)) {\r
-                       return this.variables[key];\r
-               }\r
-               \r
-               return null;\r
-       },\r
-       \r
-       /**\r
-        * Returns true if given key is a valid entry.\r
-        * \r
-        * @param       string          key\r
-        */\r
-       isset: function(key) {\r
-               return this.variables.hasOwnProperty(key);\r
-       },\r
-       \r
-       /**\r
-        * Removes an entry.\r
-        * \r
-        * @param       string          key\r
-        */\r
-       remove: function(key) {\r
-               delete this.variables[key];\r
-       },\r
-       \r
-       /**\r
-        * Iterates through dictionary.\r
-        * \r
-        * Usage:\r
-        *      var $hash = new WCF.Dictionary();\r
-        *      $hash.add('foo', 'bar');\r
-        *      $hash.each(function(pair) {\r
-        *              // alerts:      foo = bar\r
-        *              alert(pair.key + ' = ' + pair.value);\r
-        *      });\r
-        * \r
-        * @param       function        callback\r
-        */\r
-       each: function(callback) {\r
-               if (!$.isFunction(callback)) {\r
-                       return;\r
-               }\r
-               \r
-               for (var $key in this.variables) {\r
-                       var $value = this.variables[$key];\r
-                       var $pair = {\r
-                               key: $key,\r
-                               value: $value\r
-                       };\r
-                       \r
-                       callback($pair);\r
-               }\r
-       }\r
-};\r
-\r
-/**\r
- * Global language storage.\r
- * \r
- * @see        WCF.Dictionary\r
- */\r
-WCF.Language = {\r
-       _variables: new WCF.Dictionary(),\r
-       \r
-       /**\r
-        * @see WCF.Dictionary.addObject()\r
-        */\r
-       add: function(key, value) {\r
-               this._variables.add(key, value);\r
-       },\r
-       \r
-       /**\r
-        * @see WCF.Dictionary.addObject()\r
-        */\r
-       addObject: function(object) {\r
-               this._variables.addObject(object);\r
-       },\r
-       \r
-       /**\r
-        * Retrieves a variable.\r
-        * \r
-        * @param       string          key\r
-        * @return      mixed\r
-        */\r
-       get: function(key) {\r
-               return this._variables.get(key);\r
-       }\r
-};\r
-\r
-/**\r
- * String utilities.\r
- */\r
-WCF.String = {\r
-       /**\r
-        * Escapes special HTML-characters within a string\r
-        * \r
-        * @param       string  string\r
-        * @return      string\r
-        */\r
-       escapeHTML: function (string) {\r
-               return string.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\r
-       },\r
-       \r
-       /**\r
-        * Escapes a String to work with RegExp.\r
-        *\r
-        * @see         https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/regexp.js#L25\r
-        * @param       string  string\r
-        * @return      string\r
-        */\r
-       escapeRegExp: function(string) {\r
-               return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');\r
-       },\r
-       \r
-       /**\r
-        * Makes a string's first character uppercase\r
-        * \r
-        * @param       string          string\r
-        * @return      string\r
-        */\r
-       ucfirst: function(string) {\r
-               return string.substring(0, 1).toUpperCase() + string.substring(1);\r
-       },\r
-       \r
-       /**\r
-        * Adds thousands separators to a given number.\r
-        * \r
-        * @param       mixed           number\r
-        * @return      string\r
-        */\r
-       addThousandsSeparator: function(number) {\r
-               var $numberString = String(number);\r
-               if (number >= 1000 || number <= -1000) {\r
-                       var $negative = false;\r
-                       if (number <= -1000) {\r
-                               $negative = true;\r
-                               $numberString = $numberString.substring(1);\r
-                       }\r
-                       var $separator = WCF.Language.get('wcf.global.thousandsSeparator');\r
-                       \r
-                       if ($separator != null && $separator != '') {\r
-                               var $numElements = new Array();\r
-                               var $firstPart = $numberString.length % 3\r
-                               if ($firstPart == 0) $firstPart = 3;\r
-                               for (var $i = 0; $i < Math.ceil($numberString.length / 3); $i++) {\r
-                                       if ($i == 0) $numElements.push($numberString.substring(0, $firstPart));\r
-                                       else {\r
-                                               var $start = (($i - 1) * 3) + $firstPart\r
-                                               $numElements.push($numberString.substring($start, $start + 3));\r
-                                       }\r
-                               }\r
-                               $numberString = (($negative) ? ('-') : ('')) + $numElements.join($separator);\r
-                       }\r
-               }\r
-               \r
-               return $numberString;\r
-       }\r
-};\r
-\r
-/**\r
- * Basic implementation for WCF TabMenus. Use the data attributes 'active' to specify the\r
- * tab which should be shown on init. Furthermore you may specify a 'store' data-attribute\r
- * which will be filled with the currently selected tab.\r
- */\r
-WCF.TabMenu = {\r
-       /**\r
-        * Initializes all TabMenus\r
-        */\r
-       init: function() {\r
-               $('.tabMenuContainer').each(function(index, tabMenu) {\r
-                       if (!$(tabMenu).attr('id')) {\r
-                               var $randomID = WCF.getRandomID();\r
-                               $(tabMenu).attr('id', $randomID);\r
-                       }\r
-                       \r
-                       // init jQuery UI TabMenu\r
-                       $(tabMenu).wcfTabs({\r
-                               select: function(event, ui) {\r
-                                       var $panel = $(ui.panel);\r
-                                       var $container = $panel.closest('.tabMenuContainer');\r
-                                       \r
-                                       // store currently selected item\r
-                                       if ($container.data('store')) {\r
-                                               if ($.wcfIsset($container.data('store'))) {\r
-                                                       $('#' + $container.data('store')).attr('value', $panel.attr('id'));\r
-                                               }\r
-                                       }\r
-                               }\r
-                       });\r
-                       \r
-                       // display active item on init\r
-                       if ($(tabMenu).data('active')) {\r
-                               $(tabMenu).find('.tabMenuContent').each(function(index, tabMenuItem) {\r
-                                       if ($(tabMenuItem).attr('id') == $(tabMenu).data('active')) {\r
-                                               $(tabMenu).wcfTabs('select', index);\r
-                                       }\r
-                               });\r
-                       }\r
-               });\r
-       }\r
-};\r
-\r
-/**\r
- * Templates that may be fetched more than once with different variables. Based upon ideas from Prototype's template\r
- * \r
- * Usage:\r
- *     var myTemplate = new WCF.Template('{$hello} World');\r
- *     myTemplate.fetch({ hello: 'Hi' }); // Hi World\r
- *     myTemplate.fetch({ hello: 'Hello' }); // Hello World\r
- *     \r
- *     my2ndTemplate = new WCF.Template('{@$html}{$html}');\r
- *     my2ndTemplate.fetch({ html: '<b>Test</b>' }); // <b>Test</b>&lt;b&gt;Test&lt;/b&gt;\r
- * \r
- *     var my3rdTemplate = new WCF.Template('You can use {literal}{$variable}{/literal}-Tags here');\r
- *     my3rdTemplate.fetch({ variable: 'Not shown' }); // You can use {$variable}-Tags here\r
- * \r
- * \r
- * @param      template                template-content\r
- * @see                https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/template.js\r
- */\r
-WCF.Template = function(template) { this.init(template); };\r
-WCF.Template.prototype = {\r
-       /**\r
-        * Template-content\r
-        * \r
-        * @var string\r
-        */\r
-       _template: '',\r
-       \r
-       /**\r
-        * Saved literal-tags\r
-        * \r
-        * @var WCF.Dictionary\r
-        */\r
-       _literals: new WCF.Dictionary(),\r
-       \r
-       /**\r
-        * Prepares template\r
-        * \r
-        * @param       $template               template-content\r
-        */\r
-       init: function($template) {\r
-               this._template = $template;\r
-               \r
-               // save literal-tags\r
-               this._template = this._template.replace(/\{literal\}(.*?)\{\/literal\}/g, $.proxy(function ($match) {\r
-                       // hopefully no one uses this string in one of his templates\r
-                       var id = '@@@@@@@@@@@'+Math.random()+'@@@@@@@@@@@';\r
-                       this._literals.add(id, $match.replace(/\{\/?literal\}/g, ''));\r
-                       \r
-                       return id;\r
-               }, this));\r
-       },\r
-       \r
-       /**\r
-        * Fetches the template with the given variables\r
-        *\r
-        * @param       $variables      variables to insert\r
-        * @return                      parsed template\r
-        */\r
-       fetch: function($variables) {\r
-               var $result = this._template;\r
-               \r
-               // insert them :)\r
-               for (var $key in $variables) {\r
-                       $result = $result.replace(new RegExp(WCF.String.escapeRegExp('{$'+$key+'}'), 'g'), WCF.String.escapeHTML($variables[$key]));\r
-                       $result = $result.replace(new RegExp(WCF.String.escapeRegExp('{@$'+$key+'}'), 'g'), $variables[$key]);\r
-               }\r
-               \r
-               // insert delimiter tags\r
-               $result = $result.replace('{ldelim}', '{').replace('{rdelim}', '}');\r
-               \r
-               // and re-insert saved literals\r
-               return this.insertLiterals($result);\r
-       },\r
-       \r
-       /**\r
-        * Inserts literals into given string\r
-        * \r
-        * @param       $template       string to insert into\r
-        * @return                      string with inserted literals\r
-        */\r
-       insertLiterals: function ($template) {\r
-               this._literals.each(function ($pair) {\r
-                       $template = $template.replace($pair.key, $pair.value);\r
-               });\r
-               \r
-               return $template;\r
-       },\r
-       \r
-       /**\r
-        * Compiles this template into javascript-code\r
-        * \r
-        * @return      WCF.Template.Compiled\r
-        */\r
-       compile: function () {\r
-               var $compiled = this._template;\r
-               \r
-               // escape \ and '\r
-               $compiled = $compiled.replace('\\', '\\\\').replace("'", "\\'");\r
-               \r
-               // parse our variable-tags\r
-               $compiled = $compiled.replace(/\{\$(.*?)\}/g, function ($match) {\r
-                       var $name = '$v.' + $match.substring(2, $match.length - 1);\r
-                       // trinary operator to maintain compatibility with uncompiled template\r
-                       // ($name) ? $name : '$match'\r
-                       // -> $v.muh ? $v.muh : '{$muh}'\r
-                       return "' + WCF.String.escapeHTML("+ $name + " ? " + $name + " : '" + $match + "') + '";\r
-               }).replace(/\{@\$(.*?)\}/g, function ($match) {\r
-                       var $name = '$v.' + $match.substring(3, $match.length - 1);\r
-                       // trinary operator to maintain compatibility with uncompiled template\r
-                       // ($name) ? $name : '$match'\r
-                       // -> $v.muh ? $v.muh : '{$muh}'\r
-                       return "' + ("+ $name + " ? " + $name + " : '" + $match + "') + '";\r
-               });\r
-               \r
-               // insert delimiter tags\r
-               $compiled = $compiled.replace('{ldelim}', '{').replace('{rdelim}', '}');\r
-               \r
-               // and re-insert saved literals\r
-               return new WCF.Template.Compiled("'" + this.insertLiterals($compiled) + "';");\r
-       }\r
-};\r
-\r
-/**\r
- * Represents a compiled template\r
- * \r
- * @param      compiled                compiled template\r
- */\r
-WCF.Template.Compiled = function(compiled) { this.init(compiled); };\r
-WCF.Template.Compiled.prototype = {\r
-       /**\r
-        * Compiled template\r
-        * \r
-        * @var string\r
-        */\r
-       _compiled: '',\r
-       \r
-       /**\r
-        * Initializes our compiled template\r
-        * \r
-        * @param       $compiled       compiled template\r
-        */\r
-       init: function($compiled) {\r
-               this._compiled = $compiled;\r
-       },\r
-       \r
-       /**\r
-        * @see WCF.Template.fetch\r
-        */\r
-       fetch: function($v) {\r
-               return eval(this._compiled);\r
-       }\r
-};\r
-\r
-/**\r
- * Toggles options.\r
- * \r
- * @param      string          element\r
- * @param      array           showItems\r
- * @param      array           hideItems\r
- */\r
-WCF.ToggleOptions = function(element, showItems, hideItems) { this.init(element, showItems, hideItems); };\r
-WCF.ToggleOptions.prototype = {\r
-       /**\r
-        * target item\r
-        * \r
-        * @var jQuery\r
-        */\r
-       _element: null,\r
-       \r
-       /**\r
-        * list of items to be shown\r
-        * \r
-        * @var array\r
-        */\r
-       _showItems: [],\r
-       \r
-       /**\r
-        * list of items to be hidden\r
-        * \r
-        * @var array\r
-        */\r
-       _hideItems: [],\r
-       \r
-       /**\r
-        * Initializes option toggle.\r
-        * \r
-        * @param       string          element\r
-        * @param       array           showItems\r
-        * @param       array           hideItems\r
-        */\r
-       init: function(element, showItems, hideItems) {\r
-               this._element = $('#' + element);\r
-               this._showItems = showItems;\r
-               this._hideItems = hideItems;\r
-               \r
-               // bind event\r
-               this._element.click($.proxy(this._toggle, this));\r
-               \r
-               // execute toggle on init\r
-               this._toggle();\r
-       },\r
-       \r
-       /**\r
-        * Toggles items.\r
-        */\r
-       _toggle: function() {\r
-               if (!this._element.attr('checked')) return;\r
-               \r
-               for (var $i = 0, $length = this._showItems.length; $i < $length; $i++) {\r
-                       var $item = this._showItems[$i];\r
-                       \r
-                       $('#' + $item).show();\r
-               }\r
-               \r
-               for (var $i = 0, $length = this._hideItems.length; $i < $length; $i++) {\r
-                       var $item = this._hideItems[$i];\r
-                       \r
-                       $('#' + $item).hide();\r
-               }\r
-       }\r
-};\r
-\r
-/**\r
- * Basic implementation for WCF dialogs.\r
- */\r
-$.widget('ui.wcfDialog', $.ui.dialog, {\r
-       _init: function() {\r
-               this.options.autoOpen = true;\r
-               this.options.close = function(event, ui) {\r
-                       $(this).parent('.ui-dialog').wcfDropOut('down', $.proxy(function() {\r
-                               $(this).parent('.ui-dialog').empty().remove();\r
-                       }, this));\r
-               };\r
-               this.options.height = 'auto';\r
-               this.options.minHeight = 0;\r
-               this.options.modal = true;\r
-               this.options.width = 'auto';\r
-               \r
-               $.ui.dialog.prototype._init.apply(this, arguments);\r
-       }\r
-});\r
-\r
-/**\r
- * Basic implementation for WCF dialogs loading content\r
- * via AJAX before calling dialog itself.\r
- */\r
-$.widget('ui.wcfAJAXDialog', $.ui.dialog, {\r
-       /**\r
-        * Indicates wether callback was already executed\r
-        * \r
-        * @var boolean\r
-        */\r
-       _callbackExecuted: false,\r
-       \r
-       /**\r
-        * Initializes AJAX-request to fetch content.\r
-        */\r
-       _init: function() {\r
-               if (this.options.ajax) {\r
-                       this._loadContent();\r
-               }\r
-               \r
-               // force dialog to be placed centered\r
-               this.options.position = {\r
-                       my: 'center center',\r
-                       at: 'center center'\r
-               };\r
-               \r
-               // dialog should display a spinner-like image, thus immediately fire up dialog\r
-               this.options.autoOpen = true;\r
-               this.options.width = 'auto';\r
-               this.options.minHeight = 80;\r
-               \r
-               // disable ability to move dialog\r
-               this.options.resizable = false;\r
-               this.options.draggable = false;\r
-               \r
-               this.options.modal = true;\r
-               this.options.hide = {\r
-                       effect: 'drop',\r
-                       direction: 'down'\r
-               };\r
-               \r
-               this.options.close = function(event, ui) {\r
-                       // loading ajax content seems to block properly closing\r
-                       $(this).parent('.ui-dialog').empty().remove();\r
-               };\r
-               \r
-               if (this.options.preventClose) {\r
-                       this.options.closeOnEscape = false;\r
-               }\r
-               \r
-               $.ui.dialog.prototype._init.apply(this, arguments);\r
-               \r
-               // remove complete node instead of removing node-by-node\r
-               if (this.options.hideTitle && this.options.preventClose) {\r
-                       this.element.parent('.ui-dialog').find('div.ui-dialog-titlebar').empty().remove();\r
-               }\r
-               else {\r
-                       if (this.options.hideTitle) {\r
-                               // remove title element\r
-                               $('#ui-dialog-title-' + this.element.attr('id')).empty().remove();\r
-                       }\r
-                       \r
-                       if (this.options.preventClose) {\r
-                               // remove close-button\r
-                               this.element.parent('.ui-dialog').find('a.ui-dialog-titlebar-close').empty().remove();\r
-                       }\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Loads content via AJAX.\r
-        * \r
-        * @todo        Enforce JSON\r
-        */\r
-       _loadContent: function() {\r
-               var $type = 'GET';\r
-               if (this.options.ajax.type) {\r
-                       $type = this.options.ajax.type;\r
-                       \r
-                       if (this.options.ajax.type != 'GET' && this.options.ajax.type != 'POST') {\r
-                               $type = 'GET';\r
-                       }\r
-               }\r
-               \r
-               var $data = this.options.ajax.data || {};\r
-               \r
-               $.ajax({\r
-                       url: this.options.ajax.url,\r
-                       context: this,\r
-                       dataType: 'json',\r
-                       type: $type,\r
-                       data: $data,\r
-                       success: $.proxy(this._createDialog, this),\r
-                       error: function(transport) {\r
-                               alert(transport.responseText);\r
-                       }\r
-               });\r
-       },\r
-       \r
-       /**\r
-        * Inserts content.\r
-        * \r
-        * @param       string          data\r
-        */\r
-       _createDialog: function(data) {\r
-               data.ignoreTemplate = true;\r
-               this.element.data('responseData', data);\r
-               \r
-               this.element.wcfGrow({\r
-                       content: data.template,\r
-                       parent: this.element.parent('.ui-dialog')\r
-               }, {\r
-                       duration: 600,\r
-                       complete: $.proxy(function(data) {\r
-                               this.element.css({\r
-                                       height: 'auto'\r
-                               });\r
-                               \r
-                               // prevent double execution due to two complete-calls (two times animate)\r
-                               if (this._callbackExecuted) {\r
-                                       return;\r
-                               }\r
-                               \r
-                               this._callbackExecuted = true;\r
-                               \r
-                               this.element.removeClass('overlayLoading');\r
-                               this.element.html(this.element.data('responseData').template);\r
-                               \r
-                               if (this.options.ajax.success) {\r
-                                       this.options.ajax.success();\r
-                               }\r
-                       }, this)\r
-               });\r
-       },\r
-       \r
-       /**\r
-        * Redraws dialog, should be executed everytime content is changed.\r
-        */\r
-       redraw: function() {\r
-               var $dimensions = this.element.getDimensions();\r
-               \r
-               if ($dimensions.height > 200) {\r
-                       this.element.wcfGrow({\r
-                               content: this.element.html(),\r
-                               parent: this.element.parent('.ui-dialog')\r
-                       }, {\r
-                               duration: 600,\r
-                               complete: function() {\r
-                                       $(this).css({ height: 'auto' });\r
-                               }\r
-                       });\r
-               }\r
-       }\r
-});\r
-\r
-/**\r
- * Workaround for ids containing a dot ".", until jQuery UI devs learn\r
- * to properly escape ids ... (it took 18 months until they finally\r
- * fixed it!)\r
- * \r
- * @see        http://bugs.jqueryui.com/ticket/4681\r
- */\r
-$.widget('ui.wcfTabs', $.ui.tabs, {\r
-       _init: function() {\r
-               $.ui.dialog.prototype._init.apply(this, arguments);\r
-       },\r
-       \r
-       _sanitizeSelector: function(hash) {\r
-               return hash.replace(/([:\.])/g, '\\$1');\r
-       }\r
-});\r
-\r
-/**\r
- * jQuery widget implementation of the wcf pagination.\r
- */\r
-$.widget('ui.wcfPages', {\r
-       SHOW_LINKS: 11,\r
-       SHOW_SUB_LINKS: 20,\r
-       \r
-       options: {\r
-               // vars\r
-               activePage: 1,\r
-               maxPage: 1,\r
-               \r
-               // icons\r
-               previousIcon: RELATIVE_WCF_DIR + 'icon/previousS.png',\r
-               previousDisabledIcon: RELATIVE_WCF_DIR + 'icon/previousDisabledS.png',\r
-               arrowDownIcon: RELATIVE_WCF_DIR + 'icon/arrowDown.png',\r
-               nextIcon: RELATIVE_WCF_DIR + 'icon/nextS.png',\r
-               nextDisabledIcon: RELATIVE_WCF_DIR + 'icon/nextDisabledS.png',\r
-               \r
-               // language\r
-               // we use options here instead of language variables, because the paginator is not only usable with pages\r
-               nextPage: null,\r
-               previousPage: null,\r
-       },\r
-       \r
-       /**\r
-        * Creates the pages widget.\r
-        */\r
-       _create: function() {\r
-               if (this.options.nextPage === null) this.options.nextPage = WCF.Language.get('wcf.global.page.next');\r
-               if (this.options.previousPage === null) this.options.previousPage = WCF.Language.get('wcf.global.page.previous');\r
-               \r
-               this.element.addClass('pageNavigation');\r
-               \r
-               this._render();\r
-       },\r
-       \r
-       /**\r
-        * Destroys the pages widget.\r
-        */\r
-       destroy: function() {\r
-               $.Widget.prototype.destroy.apply(this, arguments);\r
-               \r
-               this.element.children().remove();\r
-       },\r
-       \r
-       /**\r
-        * Renders th pages widget.\r
-        */\r
-       _render: function() {\r
-               // only render if we have more than 1 page\r
-               if (!this.options.disabled && this.options.maxPage > 1) {\r
-                       // make sure pagination is visible\r
-                       if (this.element.hasClass('hidden')) {\r
-                               this.element.removeClass('hidden');\r
-                       }\r
-                       this.element.show();\r
-                       \r
-                       this.element.children().remove();\r
-                       \r
-                       var $pageList = $('<ul></ul>');\r
-                       this.element.append($pageList);\r
-                       \r
-                       var $previousElement = $('<li></li>');\r
-                       $pageList.append($previousElement);\r
-                       \r
-                       if (this.options.activePage > 1) {\r
-                               var $previousLink = $('<a' + ((this.options.previousPage != null) ? (' title="' + this.options.previousPage + '"') : ('')) + '></a>');\r
-                               $previousElement.append($previousLink);\r
-                               this._bindSwitchPage($previousLink, this.options.activePage - 1);\r
-                               \r
-                               var $previousImage = $('<img src="' + this.options.previousIcon + '" alt="" />');\r
-                               $previousLink.append($previousImage);\r
-                       }\r
-                       else {\r
-                               var $previousImage = $('<img src="' + this.options.previousDisabledIcon + '" alt="" />');\r
-                               $previousElement.append($previousImage);\r
-                       }\r
-                       $previousElement.addClass('skip');\r
-                       \r
-                       // add first page\r
-                       $pageList.append(this._renderLink(1));\r
-                       \r
-                       // calculate page links\r
-                       var $maxLinks = this.SHOW_LINKS - 4;\r
-                       var $linksBefore = this.options.activePage - 2;\r
-                       if ($linksBefore < 0) $linksBefore = 0;\r
-                       var $linksAfter = this.options.maxPage - (this.options.activePage + 1);\r
-                       if ($linksAfter < 0) $linksAfter = 0;\r
-                       if (this.options.activePage > 1 && this.options.activePage < this.options.maxPage) $maxLinks--;\r
-                       \r
-                       var $half = $maxLinks / 2;\r
-                       var $left = this.options.activePage;\r
-                       var $right = this.options.activePage;\r
-                       if ($left < 1) $left = 1;\r
-                       if ($right < 1) $right = 1;\r
-                       if ($right > this.options.maxPage - 1) $right = this.options.maxPage - 1;\r
-                       \r
-                       if ($linksBefore >= $half) {\r
-                               $left -= $half;\r
-                       }\r
-                       else {\r
-                               $left -= $linksBefore;\r
-                               $right += $half - $linksBefore;\r
-                       }\r
-                       \r
-                       if ($linksAfter >= $half) {\r
-                               $right += $half;\r
-                       }\r
-                       else {\r
-                               $right += $linksAfter;\r
-                               $left -= $half - $linksAfter;\r
-                       }\r
-                       \r
-                       $right = Math.ceil($right);\r
-                       $left = Math.ceil($left);\r
-                       if ($left < 1) $left = 1;\r
-                       if ($right > this.options.maxPage) $right = this.options.maxPage;\r
-                       \r
-                       // left ... links\r
-                       if ($left > 1) {\r
-                               if ($left - 1 < 2) {\r
-                                       $pageList.append(this._renderLink(2));\r
-                               }\r
-                               else {\r
-                                       var $leftChildren = $('<li class="children"></li>');\r
-                                       $pageList.append($leftChildren);\r
-                                       \r
-                                       var $leftChildrenLink = $('<a>&hellip;</a>');\r
-                                       $leftChildren.append($leftChildrenLink);\r
-                                       $leftChildrenLink.click($.proxy(this._startInput, this));\r
-                                       \r
-                                       var $leftChildrenImage = $('<img src="' + this.options.arrowDownIcon + '" alt="" />');\r
-                                       $leftChildrenLink.append($leftChildrenImage);\r
-                                       \r
-                                       var $leftChildrenInput = $('<input type="text" class="inputText" name="pageNo" />');\r
-                                       $leftChildren.append($leftChildrenInput);\r
-                                       $leftChildrenInput.keydown($.proxy(this._handleInput, this));\r
-                                       $leftChildrenInput.keyup($.proxy(this._handleInput, this));\r
-                                       $leftChildrenInput.blur($.proxy(this._stopInput, this));\r
-                                       \r
-                                       var $leftChildrenContainer = $('<div></div>');\r
-                                       $leftChildren.append($leftChildrenContainer);\r
-                                       \r
-                                       var $leftChildrenList = $('<ul></u>');\r
-                                       $leftChildrenContainer.append($leftChildrenList);\r
-                                       \r
-                                       // render sublinks\r
-                                       var $k = 0;\r
-                                       var $step = Math.ceil(($left - 2) / this.SHOW_SUB_LINKS);\r
-                                       for (var $i = 2; $i <= $left; $i += $step) {\r
-                                               $leftChildrenList.append(this._renderLink($i, ($k != 0 && $k % 4 == 0)));\r
-                                               $k++;\r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-                       // visible links\r
-                       for (var $i = $left + 1; $i < $right; $i++) {\r
-                               $pageList.append(this._renderLink($i));\r
-                       }\r
-                       \r
-                       // right ... links\r
-                       if ($right < this.options.maxPage) {\r
-                               if (this.options.maxPage - $right < 2) {\r
-                                       $pageList.append(this._renderLink(this.options.maxPage - 1));\r
-                               }\r
-                               else {\r
-                                       var $rightChildren = $('<li class="children"></li>');\r
-                                       $pageList.append($rightChildren);\r
-                                       \r
-                                       var $rightChildrenLink = $('<a>&hellip;</a>');\r
-                                       $rightChildren.append($rightChildrenLink);\r
-                                       $rightChildrenLink.click($.proxy(this._startInput, this));\r
-                                       \r
-                                       var $rightChildrenImage = $('<img src="' + this.options.arrowDownIcon + '" alt="" />');\r
-                                       $rightChildrenLink.append($rightChildrenImage);\r
-                                       \r
-                                       var $rightChildrenInput = $('<input type="text" class="inputText" name="pageNo" />');\r
-                                       $rightChildren.append($rightChildrenInput);\r
-                                       $rightChildrenInput.keydown($.proxy(this._handleInput, this));\r
-                                       $rightChildrenInput.keyup($.proxy(this._handleInput, this));\r
-                                       $rightChildrenInput.blur($.proxy(this._stopInput, this));\r
-                                       \r
-                                       var $rightChildrenContainer = $('<div></div>');\r
-                                       $rightChildren.append($rightChildrenContainer);\r
-                                       \r
-                                       var $rightChildrenList = $('<ul></ul>');\r
-                                       $rightChildrenContainer.append($rightChildrenList);\r
-                                       \r
-                                       // render sublinks\r
-                                       var $k = 0;\r
-                                       var $step = Math.ceil((this.options.maxPage - $right) / this.SHOW_SUB_LINKS);\r
-                                       for (var $i = $right; $i < this.options.maxPage; $i += $step) {\r
-                                               $rightChildrenList.append(this._renderLink($i, ($k != 0 && $k % 4 == 0)));\r
-                                               $k++;\r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-                       // add last page\r
-                       $pageList.append(this._renderLink(this.options.maxPage));\r
-                       \r
-                       // add next button\r
-                       var $nextElement = $('<li></li>');\r
-                       $pageList.append($nextElement);\r
-                       \r
-                       if (this.options.activePage < this.options.maxPage) {\r
-                               var $nextLink = $('<a title="' + ((this.options.nextPage != null) ? (' title="' + this.options.nextPage + '"') : ('')) + '"></a>');\r
-                               $nextElement.append($nextLink);\r
-                               this._bindSwitchPage($nextLink, this.options.activePage + 1);\r
-                               \r
-                               var $nextImage = $('<img src="' + this.options.nextIcon + '" alt="" />');\r
-                               $nextLink.append($nextImage);\r
-                       }\r
-                       else {\r
-                               var $nextImage = $('<img src="' + this.options.nextDisabledIcon + '" alt="" />');\r
-                               $nextElement.append($nextImage);\r
-                       }\r
-                       $nextElement.addClass('skip');\r
-               }\r
-               else {\r
-                       // otherwise hide the paginator if not already hidden\r
-                       this.element.hide();\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Renders a page link\r
-        * \r
-        * @parameter   integer         page\r
-        * \r
-        * @return              $(element)\r
-        */\r
-       _renderLink: function(page, lineBreak) {\r
-               var $pageElement = $('<li></li>');\r
-               if (lineBreak != undefined && lineBreak) {\r
-                       $pageElement.addClass('break');\r
-               }\r
-               if (page != this.options.activePage) {\r
-                       var $pageLink = $('<a>' + WCF.String.addThousandsSeparator(page) + '</a>'); \r
-                       $pageElement.append($pageLink);\r
-                       this._bindSwitchPage($pageLink, page);\r
-               }\r
-               else {\r
-                       $pageElement.addClass('active');\r
-                       var $pageSubElement = $('<span>' + WCF.String.addThousandsSeparator(page) + '</span>');\r
-                       $pageElement.append($pageSubElement);\r
-               }\r
-               \r
-               return $pageElement;\r
-       },\r
-       \r
-       /**\r
-        * Binds the 'click'-event for the page switching to the given element.\r
-        * \r
-        * @parameter   $(element)      element\r
-        * @paremeter   integer         page\r
-        */\r
-       _bindSwitchPage: function(element, page) {\r
-               var $self = this;\r
-               element.click(function() {\r
-                       $self.switchPage(page);\r
-               });\r
-       },\r
-       \r
-       /**\r
-        * Switches to the given page\r
-        * \r
-        * @parameter   Event           event\r
-        * @parameter   integer         page\r
-        */\r
-       switchPage: function(page) {\r
-               this._setOption('activePage', page);\r
-       },\r
-       \r
-       /**\r
-        * Sets the given option to the given value.\r
-        * See the jQuery UI widget documentation for more.\r
-        */\r
-       _setOption: function(key, value) {\r
-               if (key == 'activePage') {\r
-                       if (value != this.options[key] && value > 0 && value <= this.options.maxPage) {\r
-                               // you can prevent the page switching by returning false or by event.preventDefault()\r
-                               // in a shouldSwitch-callback. e.g. if an AJAX request is already running.\r
-                               var $result = this._trigger('shouldSwitch', undefined, {\r
-                                       nextPage: value,\r
-                               });\r
-                               \r
-                               if ($result) {\r
-                                       this.options[key] = value;\r
-                                       this._render();\r
-                                       this._trigger('switched', undefined, {\r
-                                               activePage: value,\r
-                                       });\r
-                               }\r
-                               else {\r
-                                       this._trigger('notSwitched', undefined, {\r
-                                               activePage: value,\r
-                                       });\r
-                               }\r
-                       }\r
-               }\r
-               else {\r
-                       this.options[key] = value;\r
-                       \r
-                       if (key == 'disabled') {\r
-                               if (value) {\r
-                                       this.element.children().remove();\r
-                               }\r
-                               else {\r
-                                       this._render()\r
-                               }\r
-                       }\r
-                       else if (key == 'maxPage') {\r
-                               this._render();\r
-                       }\r
-               }\r
-               \r
-               return this;\r
-       },\r
-       \r
-       /**\r
-        * Start input of pagenumber\r
-        * \r
-        * @parameter   Event           event\r
-        */\r
-       _startInput: function(event) {\r
-               // hide a-tag\r
-               var $childLink = $(event.currentTarget);\r
-               if (!$childLink.is('a')) $childLink = $childLink.parent('a');\r
-               \r
-               $childLink.hide();\r
-               \r
-               // show input-tag\r
-               var $childInput = $childLink.parent('li').children('input')\r
-                       .css('display', 'block')\r
-                       .val('');\r
-               \r
-               $childInput.focus();\r
-       },\r
-       \r
-       /**\r
-        * Stops input of pagenumber\r
-        * \r
-        * @parameter   Event           event\r
-        */\r
-       _stopInput: function(event) {\r
-               // hide input-tag\r
-               var $childInput = $(event.currentTarget);\r
-               $childInput.css('display', 'none');\r
-               \r
-               // show a-tag\r
-               var $childContainer = $childInput.parent('li')\r
-               if ($childContainer != undefined && $childContainer != null) {\r
-                       $childContainer.children('a').show();\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Handles input of pagenumber\r
-        * \r
-        * @parameter   Event           event\r
-        */\r
-       _handleInput: function(event) {\r
-               var $ie7 = ($.browser.msie && $.browser.version == '7.0');\r
-               if (event.type != 'keyup' || $ie7) {\r
-                       if (!$ie7 || ((event.which == 13 || event.which == 27) && event.type == 'keyup')) {\r
-                               if (event.which == 13) {\r
-                                       this.switchPage(parseInt($(event.currentTarget).val()));\r
-                               }\r
-                               \r
-                               if (event.which == 13 || event.which == 27) {\r
-                                       this._stopInput(event);\r
-                                       event.stopPropagation();\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-});\r
-\r
-/**\r
- * Encapsulate eval() within an own function to prevent problems\r
- * with optimizing and minifiny JS.\r
- * \r
- * @param      mixed           expression\r
- * @returns    mixed\r
- */\r
-function wcfEval(expression) {\r
-       return eval(expression);\r
-}\r
+/**
+ * Class and function collection for WCF
+ * 
+ * @author     Tim Düsterhus, Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+
+/**
+ * Initialize WCF namespace
+ */
+var WCF = {};
+
+/**
+ * Extends jQuery with additional methods.
+ */
+$.extend(true, {
+       /**
+        * Escapes an ID to work with jQuery selectors.
+        *
+        * @see         http://docs.jquery.com/Frequently_Asked_Questions#How_do_I_select_an_element_by_an_ID_that_has_characters_used_in_CSS_notation.3F
+        * @param       string          id
+        * @return      string
+        */
+       wcfEscapeID: function(id) {
+               return id.replace(/(:|\.)/g, '\\$1');
+       },
+       
+       /**
+        * Returns true if given ID exists within DOM.
+        * 
+        * @param       string          id
+        * @return      boolean
+        */
+       wcfIsset: function(id) {
+               return !!$('#' + $.wcfEscapeID(id)).length;
+       }
+});
+
+/**
+ * Extends jQuery's chainable methods.
+ */
+$.fn.extend({
+       /**
+        * Returns tag name of current jQuery element.
+        * 
+        * @returns     string
+        */
+       getTagName: function() {
+               return this.get(0).tagName.toLowerCase();
+       },
+       
+       /**
+        * Returns the dimensions for current element.
+        * 
+        * @see         http://api.jquery.com/hidden-selector/
+        * @param       string          type
+        * @return      object
+        */
+       getDimensions: function(type) {
+               var dimensions = css = {};
+               var wasHidden = false;
+               
+               // show element to retrieve dimensions and restore them later
+               if (this.is(':hidden')) {
+                       css = {
+                               display: this.css('display'),
+                               visibility: this.css('visibility')
+                       };
+                       
+                       wasHidden = true;
+                       
+                       this.css({
+                               display: 'block',
+                               visibility: 'hidden'
+                       });
+               }
+               
+               switch (type) {
+                       case 'inner':
+                               dimensions = {
+                                       height: this.innerHeight(),
+                                       width: this.innerWidth()
+                               };
+                       break;
+                       
+                       case 'outer':
+                               dimensions = {
+                                       height: this.outerHeight(),
+                                       width: this.outerWidth()
+                               };
+                       break;
+                       
+                       default:
+                               dimensions = {
+                                       height: this.height(),
+                                       width: this.width()
+                               };
+                       break;
+               }
+               
+               // restore previous settings
+               if (wasHidden) {
+                       this.css(css);
+               }
+               
+               return dimensions;
+       },
+       
+       /**
+        * Returns the offsets for current element, defaults to position
+        * relative to document.
+        * 
+        * @see         http://api.jquery.com/hidden-selector/
+        * @param       string          type
+        * @return      object
+        */
+       getOffsets: function(type) {
+               var offsets = css = {};
+               var wasHidden = false;
+               
+               // show element to retrieve dimensions and restore them later
+               if (this.is(':hidden')) {
+                       css = {
+                               display: this.css('display'),
+                               visibility: this.css('visibility')
+                       };
+                       
+                       wasHidden = true;
+                       
+                       this.css({
+                               display: 'block',
+                               visibility: 'hidden'
+                       });
+               }
+               
+               switch (type) {
+                       case 'offset':
+                               offsets = this.offset();
+                       break;
+                       
+                       case 'position':
+                       default:
+                               offsets = this.position();
+                       break;
+               }
+               
+               // restore previous settings
+               if (wasHidden) {
+                       this.css(css);
+               }
+               
+               return offsets;
+       },
+       
+       /**
+        * Changes element's position to 'absolute' or 'fixed' while maintaining it's
+        * current position relative to viewport. Optionally removes element from
+        * current DOM-node and moving it into body-element (useful for drag & drop)
+        * 
+        * @param       boolean         rebase
+        * @return      object
+        */
+       makePositioned: function(position, rebase) {
+               if (position != 'absolute' && position != 'fixed') {
+                       position = 'absolute';
+               }
+               
+               var $currentPosition = this.getOffsets('position');
+               this.css({
+                       position: position,
+                       left: $currentPosition.left,
+                       margin: 0,
+                       top: $currentPosition.top
+               });
+               
+               if (rebase) {
+                       this.remove().appentTo('body');
+               }
+               
+               return this;
+       },
+       
+       /**
+        * Disables a form element.
+        * 
+        * @return jQuery
+        */
+       disable: function() {
+               return this.attr('disabled', 'disabled');
+       },
+       
+       /**
+        * Enables a form element.
+        * 
+        * @return      jQuery
+        */
+       enable: function() {
+               return this.removeAttr('disabled');
+       },
+       
+       /**
+        * Applies a grow-effect by resizing element while moving the
+        * element appropriately
+        * 
+        * @param       object          data
+        * @param       object          options
+        * @return      jQuery
+        */
+       wcfGrow: function(data, options) {
+               // create temporarily element to determine dimensions
+               var $tempElementID = WCF.getRandomID();
+               $('body').append('<div id="' + $tempElementID + '" class="wcfDimensions">' + data.content + '</div>');
+               var $tempElement = $('#' + $tempElementID);
+               
+               // get content dimensions
+               var $dimensions = $tempElement.getDimensions();
+               
+               // remove temporarily element
+               $tempElement.empty().remove();
+               
+               // move parent element, used if applying effect on dialogs
+               if (!data.parent) {
+                       data.parent = this;
+               }
+               
+               // calculate values for grow-effect
+               var $borderHeight = parseInt(data.parent.css('borderTopWidth')) + parseInt(data.parent.css('borderBottomWidth'));
+               var $borderWidth = parseInt(data.parent.css('borderLeftWidth')) + parseInt(data.parent.css('borderRightWidth'));
+               
+               var $windowDimensions = $(window).getDimensions();
+               var $leftOffset = Math.round(($windowDimensions.width - ($dimensions.width + $borderWidth)) / 2);
+               var $topOffset = Math.round(($windowDimensions.height - ($dimensions.height + $borderHeight)) / 2);
+               
+               data.parent.makePositioned('fixed', false);
+               data.parent.animate({
+                       left: $leftOffset + 'px',
+                       top: $topOffset + 'px'
+               }, options);
+               
+               return this.animate({
+                       height: $dimensions.height,
+                       width: $dimensions.width
+               }, options);
+       },
+       
+       /**
+        * Shows an element by sliding and fading it into viewport.
+        * 
+        * @param       string          direction
+        * @param       object          callback
+        * @returns     jQuery
+        */
+       wcfDropIn: function(direction, callback) {
+               if (!direction) direction = 'up';
+               
+               return this.show(WCF.getEffect(this.getTagName(), 'drop'), { direction: direction }, 600, callback);
+       },
+       
+       /**
+        * Hides an element by sliding and fading it out the viewport.
+        * 
+        * @param       string          direction
+        * @param       object          callback
+        * @returns     jQuery
+        */
+       wcfDropOut: function(direction, callback) {
+               if (!direction) direction = 'down';
+               
+               return this.hide(WCF.getEffect(this.getTagName(), 'drop'), { direction: direction }, 600, callback);
+       },
+       
+       /**
+        * Shows an element by blinding it up.
+        * 
+        * @param       string          direction
+        * @param       object          callback
+        * @returns     jQuery
+        */
+       wcfBlindIn: function(direction, callback) {
+               if (!direction) direction = 'vertical';
+               
+               return this.show(WCF.getEffect(this.getTagName(), 'blind'), { direction: direction }, 200, callback);
+       },
+       
+       /**
+        * Hides an element by blinding it down.
+        * 
+        * @param       string          direction
+        * @param       object          callback
+        * @returns     jQuery
+        */
+       wcfBlindOut: function(direction, callback) {
+               if (!direction) direction = 'vertical';
+               
+               return this.hide(WCF.getEffect(this.getTagName(), 'blind'), { direction: direction }, 200, callback);
+       },
+       
+       /**
+        * Highlights an element.
+        * 
+        * @param       object          options
+        * @param       object          callback
+        * @returns     jQuery
+        */
+       wcfHighlight: function(options, callback) {
+               return this.effect('highlight', options, 600, callback);
+       }
+});
+
+/**
+ * WoltLab Community Framework core methods
+ */
+$.extend(WCF, {
+       /**
+        * Counter for dynamic element id's
+        *
+        * @var integer
+        */
+       _idCounter: 0,
+       
+       /**
+        * Shows a modal dialog with a built-in AJAX-loader.
+        * 
+        * @param       string          dialogID
+        * @param       boolean         resetDialog
+        */
+       showAJAXDialog: function(dialogID, resetDialog) {
+               if (!dialogID) {
+                       dialogID = this.getRandomID();
+               }
+               
+               if (!$.wcfIsset(dialogID)) {
+                       $('body').append($('<div id="' + dialogID + '"></div>'));
+               }
+               
+               var dialog = $('#' + $.wcfEscapeID(dialogID));
+               
+               if (resetDialog) {
+                       dialog.empty();
+               }
+               
+               dialog.addClass('overlayLoading');
+               
+               var dialogOptions = arguments[2] || {};
+               dialog.wcfAJAXDialog(dialogOptions);
+       },
+       
+       /**
+        * Shows a modal dialog.
+        * @param       string          dialogID
+        */
+       showDialog: function(dialogID) {
+               // we cannot work with a non-existant dialog, if you wish to
+               // load content via AJAX, see showAJAXDialog() instead
+               if (!$.wcfIsset(dialogID)) return;
+               
+               var $dialog = $('#' + $.wcfEscapeID(dialogID));
+               
+               var dialogOptions = arguments[2] || {};
+               $dialog.wcfDialog(dialogOptions);
+       },
+       
+       /**
+        * Returns a dynamically created id.
+        * 
+        * @see         https://github.com/sstephenson/prototype/blob/master/src/prototype/dom/dom.js#L1789
+        * @return      string
+        */
+       getRandomID: function() {
+               var $elementID = '';
+               
+               do {
+                       $elementID = 'wcf' + this._idCounter++;
+               }
+               while ($.wcfIsset($elementID));
+               
+               return $elementID;
+       },
+       
+       /**
+        * Wrapper for $.inArray which returns boolean value instead of
+        * index value, similar to PHP's in_array().
+        * 
+        * @param       mixed           needle
+        * @param       array           haystack
+        * @return      boolean
+        */
+       inArray: function(needle, haystack) {
+               return ($.inArray(needle, haystack) != -1);
+       },
+       
+       /**
+        * Adjusts effect for partially supported elements.
+        * 
+        * @param       object          object
+        * @param       string          effect
+        * @return      string
+        */
+       getEffect: function(tagName, effect) {
+               // most effects are not properly supported on table rows, use highlight instead
+               if (tagName == 'tr') {
+                       return 'highlight';
+               }
+               
+               return effect;
+       }
+});
+
+/**
+ * Provides a simple call for periodical executed functions. Based upon
+ * ideas by Prototype's PeriodicalExecuter.
+ * 
+ * @see                https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/periodical_executer.js
+ * @param      function                callback
+ * @param      integer                 delay
+ */
+WCF.PeriodicalExecuter = function(callback, delay) { this.init(callback, delay); };
+WCF.PeriodicalExecuter.prototype = {
+       /**
+        * Initializes a periodical executer.
+        * 
+        * @param       function                callback
+        * @param       integer                 delay
+        */
+       init: function(callback, delay) {
+               this.callback = callback;
+               this.delay = delay;
+               this.loop = true;
+               
+               this.intervalID = setInterval($.proxy(this._execute, this), this.delay);
+       },
+       
+       /**
+        * Executes callback.
+        */
+       _execute: function() {
+               this.callback(this);
+               
+               if (!this.loop) {
+                       clearInterval(this.intervalID);
+               }
+       },
+       
+       /**
+        * Terminates loop.
+        */
+       stop: function() {
+               this.loop = false;
+       }
+};
+
+/**
+ * Namespace for AJAXProxies
+ */
+WCF.Action = {};
+
+/**
+ * Basic implementation for AJAX-based proxyies
+ * 
+ * @param      object          options
+ */
+WCF.Action.Proxy = function(options) { this.init(options); };
+WCF.Action.Proxy.prototype = {
+       /**
+        * Initializes AJAXProxy.
+        * 
+        * @param       object          options
+        */
+       init: function(options) {
+               // initialize default values
+               this.options = $.extend(true, {
+                       autoSend: false,
+                       data: { },
+                       after: null,
+                       init: null,
+                       failure: null,
+                       success: null,
+                       type: 'POST',
+                       url: 'index.php?action=AJAXProxy&t=' + SECURITY_TOKEN + SID_ARG_2ND
+               }, options);
+               
+               this.confirmationDialog = null;
+               this.loading = null;
+               
+               // send request immediately after initialization
+               if (this.options.autoSend) {
+                       this.sendRequest();
+               }
+       },
+       
+       /**
+        * Sends an AJAX request.
+        */
+       sendRequest: function() {
+               this._init();
+               
+               $.ajax({
+                       data: this.options.data,
+                       dataType: 'json',
+                       type: this.options.type,
+                       url: this.options.url,
+                       success: $.proxy(this._success, this),
+                       error: $.proxy(this._failure, this)
+               });
+       },
+       
+       /**
+        * Fires before request is send, displays global loading status.
+        */
+       _init: function() {
+               if ($.isFunction(this.options.init)) {
+                       this.options.init();
+               }
+               
+               $('<div id="actionProxyLoading" style="display: none;">Loading …</div>').appendTo($('body'));
+               this.loading = $('#actionProxyLoading');
+               this.loading.wcfDropIn();
+       },
+       
+       /**
+        * Handles AJAX errors.
+        * 
+        * @param       object          jqXHR
+        * @param       string          textStatus
+        * @param       string          errorThrown
+        */
+       _failure: function(jqXHR, textStatus, errorThrown) {
+               try {
+                       var data = $.parseJSON(jqXHR.responseText);
+                       
+                       // call child method if applicable
+                       if ($.isFunction(this.options.failure)) {
+                               this.options.failure(jqXHR, textStatus, errorThrown, data);
+                       }
+                       
+                       var $randomID = WCF.getRandomID();
+                       $('<div id="' + $randomID + '" title="HTTP/1.0 ' + jqXHR.status + ' ' + errorThrown + '"><p>Der Server antwortete: ' + data.message + '.</p></div>').wcfDialog();
+               }
+               // failed to parse JSON
+               catch (e) {
+                       var $randomID = WCF.getRandomID();
+                       $('<div id="' + $randomID + '" title="HTTP/1.0 ' + jqXHR.status + ' ' + errorThrown + '"><p>Der Server antwortete: ' + jqXHR.responseText + '.</p></div>').wcfDialog();
+               }
+               
+               this._after();
+       },
+       
+       /**
+        * Handles successful AJAX requests.
+        * 
+        * @param       object          data
+        * @param       string          textStatus
+        * @param       object          jqXHR
+        */
+       _success: function(data, textStatus, jqXHR) {
+               // call child method if applicable
+               if ($.isFunction(this.options.success)) {
+                       this.options.success(data, textStatus, jqXHR);
+               }
+               
+               this._after();
+       },
+       
+       /**
+        * Fires after an AJAX request, hides global loading status.
+        */
+       _after: function() {
+               if ($.isFunction(this.options.after)) {
+                       this.options.after();
+               }
+               
+               this.loading.wcfDropOut('up');
+       },
+       
+       /**
+        * Sets options, MUST be used to set parameters before sending request
+        * if calling from child classes.
+        * 
+        * @param       string          optionName
+        * @param       mixed           optionData
+        */
+       setOption: function(optionName, optionData) {
+               this.options[optionName] = optionData;
+       }
+};
+
+/**
+ * Basic implementation for simple proxy access using bound elements.
+ * 
+ * @param      object          options
+ * @param      object          callbacks
+ */
+WCF.Action.SimpleProxy = function(options, callbacks) { this.init(options, callbacks); };
+WCF.Action.SimpleProxy.prototype = {
+       /**
+        * Initializes SimpleProxy.
+        * 
+        * @param       object          options
+        * @param       object          callbacks
+        */
+       init: function(options, callbacks) {
+               /**
+                * action-specific options
+                */
+               this.options = $.extend(true, {
+                       action: '',
+                       className: '',
+                       elements: null,
+                       eventName: 'click'
+               }, options);
+               
+               /**
+                * proxy-specific options
+                */
+               this.callbacks = $.extend(true, {
+                       after: null,
+                       failure: null,
+                       init: null,
+                       success: null
+               }, callbacks);
+               
+               if (!this.options.elements) return;
+               
+               // initialize proxy
+               this.proxy = new WCF.Action.Proxy(this.callbacks);
+               
+               // bind event listener
+               this.options.elements.each($.proxy(function(index, element) {
+                       $(element).bind(this.options.eventName, $.proxy(this._handleEvent, this));
+               }, this));
+       },
+       
+       /**
+        * Handles event actions.
+        * 
+        * @param       object          event
+        */
+       _handleEvent: function(event) {
+               this.proxy.setOption('data', {
+                       actionName: this.options.action,
+                       className: this.options.className,
+                       objectIDs: [ $(event.target).data('objectID') ]
+               });
+               
+               this.proxy.sendRequest();
+       }
+};
+
+/**
+ * Basic implementation for AJAXProxy-based deletion.
+ * 
+ * @param      string          className
+ * @param      jQuery          containerList
+ */
+WCF.Action.Delete = function(className, containerList) { this.init(className, containerList); };
+WCF.Action.Delete.prototype = {
+       /**
+        * Initializes 'delete'-Proxy.
+        * 
+        * @param       string          className
+        * @param       jQuery          containerList
+        */
+       init: function(className, containerList) {
+               if (!containerList.length) return;
+               this.containerList = containerList;
+               this.className = className;
+               
+               // initialize proxy
+               var options = {
+                       success: $.proxy(this._success, this)
+               };
+               this.proxy = new WCF.Action.Proxy(options);
+               
+               // bind event listener
+               this.containerList.each($.proxy(function(index, container) {
+                       $(container).find('.deleteButton').bind('click', $.proxy(this._click, this));
+               }, this));
+       },
+       
+       /**
+        * Sends AJAX request.
+        * 
+        * @param       object          event
+        */
+       _click: function(event) {
+               var $target = $(event.target);
+               
+               if ($target.data('confirmMessage')) {
+                       if (confirm($target.data('confirmMessage'))) {
+                               this._sendRequest($target);
+                       }
+               }
+               else {
+                       this._sendRequest($target);
+               }
+               
+       },
+       
+       _sendRequest: function(object) {
+               this.proxy.setOption('data', {
+                       actionName: 'delete',
+                       className: this.className,
+                       objectIDs: [ $(object).data('objectID') ]
+               });
+               
+               this.proxy.sendRequest();
+       },
+       
+       /**
+        * Deletes items from containers.
+        * 
+        * @param       object          data
+        * @param       string          textStatus
+        * @param       object          jqXHR
+        */
+       _success: function(data, textStatus, jqXHR) {
+               // remove items
+               this.containerList.each(function(index, container) {
+                       var $objectID = $(container).find('.deleteButton').data('objectID');
+                       if (WCF.inArray($objectID, data.objectIDs)) {
+                               $(container).wcfBlindOut('up', function() {
+                                       $(container).empty().remove();
+                               }, container);
+                       }
+               });
+       }
+};
+
+/**
+ * Basic implementation for AJAXProxy-based toggle actions.
+ * 
+ * @param      string          className
+ * @param      jQuery          containerList
+ */
+WCF.Action.Toggle = function(className, containerList) { this.init(className, containerList); };
+WCF.Action.Toggle.prototype = {
+       /**
+        * Initializes 'toggle'-Proxy
+        * 
+        * @param       string          className
+        * @param       jQuery          containerList
+        */
+       init: function(className, containerList) {
+               if (!containerList.length) return;
+               this.containerList = containerList;
+               this.className = className;
+               
+               // initialize proxy
+               var options = {
+                       success: $.proxy(this._success, this)
+               };
+               this.proxy = new WCF.Action.Proxy(options);
+               
+               // bind event listener
+               this.containerList.each($.proxy(function(index, container) {
+                       $(container).find('.toggleButton').bind('click', $.proxy(this._click, this));
+               }, this));
+       },
+       
+       /**
+        * Sends AJAX request.
+        * 
+        * @param       object          event
+        */
+       _click: function(event) {
+               this.proxy.setOption('data', {
+                       actionName: 'toggle',
+                       className: this.className,
+                       objectIDs: [ $(event.target).data('objectID') ]
+               });
+               
+               this.proxy.sendRequest();
+       },
+       
+       /**
+        * Toggles status icons.
+        * 
+        * @param       object          data
+        * @param       string          textStatus
+        * @param       object          jqXHR
+        */
+       _success: function(data, textStatus, jqXHR) {
+               // remove items
+               this.containerList.each(function(index, container) {
+                       var $toggleButton = $(container).find('.toggleButton');
+                       if (WCF.inArray($toggleButton.data('objectID'), data.objectIDs)) {
+                               $(container).wcfHighlight();
+                               
+                               // toggle icon source
+                               $toggleButton.attr('src', function() {
+                                       if (this.src.match(/enabled(S|M|L)\.png$/)) {
+                                               return this.src.replace(/enabled(S|M|L)\.png$/, 'disabled$1\.png');
+                                       }
+                                       else {
+                                               return this.src.replace(/disabled(S|M|L)\.png$/, 'enabled$1\.png');
+                                       }
+                               });
+                               // toogle icon title
+                               $toggleButton.attr('title', function() {
+                                       if (this.src.match(/enabled(S|M|L)\.png$/)) {
+                                               return $(this).data('disableMessage');
+                                       }
+                                       else {
+                                               return $(this).data('enableMessage');
+                                       }
+                               });
+                       }
+               });
+       }
+};
+
+/**
+ * Namespace for date-related functions.
+ */
+WCF.Date = {};
+
+/**
+ * Provides utility functions for date operations.
+ */
+WCF.Date.Util = {
+       /**
+        * Returns UTC timestamp, if date is not given, current time will be used.
+        * 
+        * @param       Date            date
+        * @return      integer
+        */
+       gmdate: function(date) {
+               var $date = (date) ? date : new Date();
+               
+               return Math.round(Date.UTC(
+                       $date.getUTCFullYear(),
+                       $date.getUTCMonth(),
+                       $date.getUTCDay(),
+                       $date.getUTCHours(),
+                       $date.getUTCMinutes(),
+                       $date.getUTCSeconds()
+               ) / 1000);
+       },
+       
+       /**
+        * Returns a Date object with precise offset (including timezone and local timezone).
+        * Parameter timestamp must be in miliseconds!
+        * 
+        * @param       integer         timestamp
+        * @param       integer         offset
+        * @return      Date
+        */
+       getTimezoneDate: function(timestamp, offset) {
+               var $date = new Date(timestamp);
+               var $localOffset = $date.getTimezoneOffset() * -1 * 60000;
+               
+               return new Date((timestamp - $localOffset - offset));
+       }
+};
+
+/**
+ * Handles relative time designations.
+ */
+WCF.Date.Time = function() { this.init(); };
+WCF.Date.Time.prototype = {
+       /**
+        * Initializes relative datetimes.
+        */
+       init: function() {
+               // initialize variables
+               this.elements = $('time.datetime');
+               this.timestamp = 0;
+               
+               // calculate relative datetime on init
+               this._refresh();
+               
+               // re-calculate relative datetime every minute
+               new WCF.PeriodicalExecuter($.proxy(this._refresh, this), 60000);
+       },
+       
+       /**
+        * Refreshes relative datetime for each element.
+        */
+       _refresh: function() {
+               // TESTING ONLY!
+               var $date = new Date();
+               this.timestamp = ($date.getTime() - $date.getMilliseconds()) / 1000;
+               // TESTING ONLY!
+               
+               this.elements.each($.proxy(this._refreshElement, this));
+       },
+       
+       /**
+        * Refreshes relative datetime for current element.
+        * 
+        * @param       integer         index
+        * @param       object          element
+        */
+       _refreshElement: function(index, element) {
+               if (!$(element).attr('title')) {
+                       $(element).attr('title', $(element).text());
+               }
+               
+               var $timestamp = $(element).data('timestamp');
+               var $date = $(element).data('date');
+               var $time = $(element).data('time');
+               var $offset = $(element).data('offset');
+               
+               // timestamp is less than 60 minutes ago (display 1 hour ago rather than 60 minutes ago)
+               if (this.timestamp < ($timestamp + 3540)) {
+                       var $minutes = Math.round((this.timestamp - $timestamp) / 60);
+                       $(element).text(eval(WCF.Language.get('wcf.global.date.relative.minutes')));
+               }
+               // timestamp is less than 24 hours ago
+               else if (this.timestamp < ($timestamp + 86400)) {
+                       var $hours = Math.round((this.timestamp - $timestamp) / 3600);
+                       $(element).text(eval(WCF.Language.get('wcf.global.date.relative.hours')));
+               }
+               // timestamp is less than a week ago
+               else if (this.timestamp < ($timestamp + 604800)) {
+                       var $days = Math.round((this.timestamp - $timestamp) / 86400);
+                       var $string = eval(WCF.Language.get('wcf.global.date.relative.pastDays'));
+               
+                       // get day of week
+                       var $dateObj = WCF.Date.Util.getTimezoneDate(($timestamp * 1000), $offset);
+                       var $dow = $dateObj.getDay();
+                       
+                       $(element).text($string.replace(/\%day\%/, WCF.Language.get('__days')[$dow]).replace(/\%time\%/, $time));
+               }
+               // timestamp is between ~700 million years BC and last week
+               else {
+                       var $string = WCF.Language.get('wcf.global.date.dateTimeFormat');
+                       $(element).text($string.replace(/\%date\%/, $date).replace(/\%time\%/, $time));
+               }
+       }
+};
+
+/**
+ * Hash-like dictionary. Based upon idead from Prototype's hash
+ * 
+ * @see        https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/hash.js
+ */
+WCF.Dictionary = function() { this.init(); };
+WCF.Dictionary.prototype = {
+       /**
+        * Initializes a new dictionary.
+        */
+       init: function() {
+               this.variables = { };
+       },
+       
+       /**
+        * Adds an entry.
+        * 
+        * @param       string          key
+        * @param       mixed           value
+        */
+       add: function(key, value) {
+               this.variables[key] = value;
+       },
+       
+       /**
+        * Adds a traditional object to current dataset.
+        * 
+        * @param       object          object
+        */
+       addObject: function(object) {
+               for (var $key in object) {
+                       this.add($key, object[$key]);
+               }
+       },
+       
+       /**
+        * Adds a dictionary to current dataset.
+        * 
+        * @param       object          dictionary
+        */
+       addDictionary: function(dictionary) {
+               dictionary.each($.proxy(function(pair) {
+                       this.add(pair.key, pair.value);
+               }, this));
+       },
+       
+       /**
+        * Retrieves the value of an entry or returns null if key is not found.
+        * 
+        * @param       string          key
+        * @returns     mixed
+        */
+       get: function(key) {
+               if (this.isset(key)) {
+                       return this.variables[key];
+               }
+               
+               return null;
+       },
+       
+       /**
+        * Returns true if given key is a valid entry.
+        * 
+        * @param       string          key
+        */
+       isset: function(key) {
+               return this.variables.hasOwnProperty(key);
+       },
+       
+       /**
+        * Removes an entry.
+        * 
+        * @param       string          key
+        */
+       remove: function(key) {
+               delete this.variables[key];
+       },
+       
+       /**
+        * Iterates through dictionary.
+        * 
+        * Usage:
+        *      var $hash = new WCF.Dictionary();
+        *      $hash.add('foo', 'bar');
+        *      $hash.each(function(pair) {
+        *              // alerts:      foo = bar
+        *              alert(pair.key + ' = ' + pair.value);
+        *      });
+        * 
+        * @param       function        callback
+        */
+       each: function(callback) {
+               if (!$.isFunction(callback)) {
+                       return;
+               }
+               
+               for (var $key in this.variables) {
+                       var $value = this.variables[$key];
+                       var $pair = {
+                               key: $key,
+                               value: $value
+                       };
+                       
+                       callback($pair);
+               }
+       }
+};
+
+/**
+ * Global language storage.
+ * 
+ * @see        WCF.Dictionary
+ */
+WCF.Language = {
+       _variables: new WCF.Dictionary(),
+       
+       /**
+        * @see WCF.Dictionary.addObject()
+        */
+       add: function(key, value) {
+               this._variables.add(key, value);
+       },
+       
+       /**
+        * @see WCF.Dictionary.addObject()
+        */
+       addObject: function(object) {
+               this._variables.addObject(object);
+       },
+       
+       /**
+        * Retrieves a variable.
+        * 
+        * @param       string          key
+        * @return      mixed
+        */
+       get: function(key) {
+               return this._variables.get(key);
+       }
+};
+
+/**
+ * String utilities.
+ */
+WCF.String = {
+       /**
+        * Escapes special HTML-characters within a string
+        * 
+        * @param       string  string
+        * @return      string
+        */
+       escapeHTML: function (string) {
+               return string.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+       },
+       
+       /**
+        * Escapes a String to work with RegExp.
+        *
+        * @see         https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/regexp.js#L25
+        * @param       string  string
+        * @return      string
+        */
+       escapeRegExp: function(string) {
+               return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+       },
+       
+       /**
+        * Makes a string's first character uppercase
+        * 
+        * @param       string          string
+        * @return      string
+        */
+       ucfirst: function(string) {
+               return string.substring(0, 1).toUpperCase() + string.substring(1);
+       },
+       
+       /**
+        * Adds thousands separators to a given number.
+        * 
+        * @param       mixed           number
+        * @return      string
+        */
+       addThousandsSeparator: function(number) {
+               var $numberString = String(number);
+               if (number >= 1000 || number <= -1000) {
+                       var $negative = false;
+                       if (number <= -1000) {
+                               $negative = true;
+                               $numberString = $numberString.substring(1);
+                       }
+                       var $separator = WCF.Language.get('wcf.global.thousandsSeparator');
+                       
+                       if ($separator != null && $separator != '') {
+                               var $numElements = new Array();
+                               var $firstPart = $numberString.length % 3
+                               if ($firstPart == 0) $firstPart = 3;
+                               for (var $i = 0; $i < Math.ceil($numberString.length / 3); $i++) {
+                                       if ($i == 0) $numElements.push($numberString.substring(0, $firstPart));
+                                       else {
+                                               var $start = (($i - 1) * 3) + $firstPart
+                                               $numElements.push($numberString.substring($start, $start + 3));
+                                       }
+                               }
+                               $numberString = (($negative) ? ('-') : ('')) + $numElements.join($separator);
+                       }
+               }
+               
+               return $numberString;
+       }
+};
+
+/**
+ * Basic implementation for WCF TabMenus. Use the data attributes 'active' to specify the
+ * tab which should be shown on init. Furthermore you may specify a 'store' data-attribute
+ * which will be filled with the currently selected tab.
+ */
+WCF.TabMenu = {
+       /**
+        * Initializes all TabMenus
+        */
+       init: function() {
+               $('.tabMenuContainer').each(function(index, tabMenu) {
+                       if (!$(tabMenu).attr('id')) {
+                               var $randomID = WCF.getRandomID();
+                               $(tabMenu).attr('id', $randomID);
+                       }
+                       
+                       // init jQuery UI TabMenu
+                       $(tabMenu).wcfTabs({
+                               select: function(event, ui) {
+                                       var $panel = $(ui.panel);
+                                       var $container = $panel.closest('.tabMenuContainer');
+                                       
+                                       // store currently selected item
+                                       if ($container.data('store')) {
+                                               if ($.wcfIsset($container.data('store'))) {
+                                                       $('#' + $container.data('store')).attr('value', $panel.attr('id'));
+                                               }
+                                       }
+                               }
+                       });
+                       
+                       // display active item on init
+                       if ($(tabMenu).data('active')) {
+                               $(tabMenu).find('.tabMenuContent').each(function(index, tabMenuItem) {
+                                       if ($(tabMenuItem).attr('id') == $(tabMenu).data('active')) {
+                                               $(tabMenu).wcfTabs('select', index);
+                                       }
+                               });
+                       }
+               });
+       }
+};
+
+/**
+ * Templates that may be fetched more than once with different variables. Based upon ideas from Prototype's template
+ * 
+ * Usage:
+ *     var myTemplate = new WCF.Template('{$hello} World');
+ *     myTemplate.fetch({ hello: 'Hi' }); // Hi World
+ *     myTemplate.fetch({ hello: 'Hello' }); // Hello World
+ *     
+ *     my2ndTemplate = new WCF.Template('{@$html}{$html}');
+ *     my2ndTemplate.fetch({ html: '<b>Test</b>' }); // <b>Test</b>&lt;b&gt;Test&lt;/b&gt;
+ * 
+ *     var my3rdTemplate = new WCF.Template('You can use {literal}{$variable}{/literal}-Tags here');
+ *     my3rdTemplate.fetch({ variable: 'Not shown' }); // You can use {$variable}-Tags here
+ * 
+ * 
+ * @param      template                template-content
+ * @see                https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/template.js
+ */
+WCF.Template = function(template) { this.init(template); };
+WCF.Template.prototype = {
+       /**
+        * Template-content
+        * 
+        * @var string
+        */
+       _template: '',
+       
+       /**
+        * Saved literal-tags
+        * 
+        * @var WCF.Dictionary
+        */
+       _literals: new WCF.Dictionary(),
+       
+       /**
+        * Prepares template
+        * 
+        * @param       $template               template-content
+        */
+       init: function($template) {
+               this._template = $template;
+               
+               // save literal-tags
+               this._template = this._template.replace(/\{literal\}(.*?)\{\/literal\}/g, $.proxy(function ($match) {
+                       // hopefully no one uses this string in one of his templates
+                       var id = '@@@@@@@@@@@'+Math.random()+'@@@@@@@@@@@';
+                       this._literals.add(id, $match.replace(/\{\/?literal\}/g, ''));
+                       
+                       return id;
+               }, this));
+       },
+       
+       /**
+        * Fetches the template with the given variables
+        *
+        * @param       $variables      variables to insert
+        * @return                      parsed template
+        */
+       fetch: function($variables) {
+               var $result = this._template;
+               
+               // insert them :)
+               for (var $key in $variables) {
+                       $result = $result.replace(new RegExp(WCF.String.escapeRegExp('{$'+$key+'}'), 'g'), WCF.String.escapeHTML($variables[$key]));
+                       $result = $result.replace(new RegExp(WCF.String.escapeRegExp('{@$'+$key+'}'), 'g'), $variables[$key]);
+               }
+               
+               // insert delimiter tags
+               $result = $result.replace('{ldelim}', '{').replace('{rdelim}', '}');
+               
+               // and re-insert saved literals
+               return this.insertLiterals($result);
+       },
+       
+       /**
+        * Inserts literals into given string
+        * 
+        * @param       $template       string to insert into
+        * @return                      string with inserted literals
+        */
+       insertLiterals: function ($template) {
+               this._literals.each(function ($pair) {
+                       $template = $template.replace($pair.key, $pair.value);
+               });
+               
+               return $template;
+       },
+       
+       /**
+        * Compiles this template into javascript-code
+        * 
+        * @return      WCF.Template.Compiled
+        */
+       compile: function () {
+               var $compiled = this._template;
+               
+               // escape \ and '
+               $compiled = $compiled.replace('\\', '\\\\').replace("'", "\\'");
+               
+               // parse our variable-tags
+               $compiled = $compiled.replace(/\{\$(.*?)\}/g, function ($match) {
+                       var $name = '$v.' + $match.substring(2, $match.length - 1);
+                       // trinary operator to maintain compatibility with uncompiled template
+                       // ($name) ? $name : '$match'
+                       // -> $v.muh ? $v.muh : '{$muh}'
+                       return "' + WCF.String.escapeHTML("+ $name + " ? " + $name + " : '" + $match + "') + '";
+               }).replace(/\{@\$(.*?)\}/g, function ($match) {
+                       var $name = '$v.' + $match.substring(3, $match.length - 1);
+                       // trinary operator to maintain compatibility with uncompiled template
+                       // ($name) ? $name : '$match'
+                       // -> $v.muh ? $v.muh : '{$muh}'
+                       return "' + ("+ $name + " ? " + $name + " : '" + $match + "') + '";
+               });
+               
+               // insert delimiter tags
+               $compiled = $compiled.replace('{ldelim}', '{').replace('{rdelim}', '}');
+               
+               // and re-insert saved literals
+               return new WCF.Template.Compiled("'" + this.insertLiterals($compiled) + "';");
+       }
+};
+
+/**
+ * Represents a compiled template
+ * 
+ * @param      compiled                compiled template
+ */
+WCF.Template.Compiled = function(compiled) { this.init(compiled); };
+WCF.Template.Compiled.prototype = {
+       /**
+        * Compiled template
+        * 
+        * @var string
+        */
+       _compiled: '',
+       
+       /**
+        * Initializes our compiled template
+        * 
+        * @param       $compiled       compiled template
+        */
+       init: function($compiled) {
+               this._compiled = $compiled;
+       },
+       
+       /**
+        * @see WCF.Template.fetch
+        */
+       fetch: function($v) {
+               return eval(this._compiled);
+       }
+};
+
+/**
+ * Toggles options.
+ * 
+ * @param      string          element
+ * @param      array           showItems
+ * @param      array           hideItems
+ */
+WCF.ToggleOptions = function(element, showItems, hideItems) { this.init(element, showItems, hideItems); };
+WCF.ToggleOptions.prototype = {
+       /**
+        * target item
+        * 
+        * @var jQuery
+        */
+       _element: null,
+       
+       /**
+        * list of items to be shown
+        * 
+        * @var array
+        */
+       _showItems: [],
+       
+       /**
+        * list of items to be hidden
+        * 
+        * @var array
+        */
+       _hideItems: [],
+       
+       /**
+        * Initializes option toggle.
+        * 
+        * @param       string          element
+        * @param       array           showItems
+        * @param       array           hideItems
+        */
+       init: function(element, showItems, hideItems) {
+               this._element = $('#' + element);
+               this._showItems = showItems;
+               this._hideItems = hideItems;
+               
+               // bind event
+               this._element.click($.proxy(this._toggle, this));
+               
+               // execute toggle on init
+               this._toggle();
+       },
+       
+       /**
+        * Toggles items.
+        */
+       _toggle: function() {
+               if (!this._element.attr('checked')) return;
+               
+               for (var $i = 0, $length = this._showItems.length; $i < $length; $i++) {
+                       var $item = this._showItems[$i];
+                       
+                       $('#' + $item).show();
+               }
+               
+               for (var $i = 0, $length = this._hideItems.length; $i < $length; $i++) {
+                       var $item = this._hideItems[$i];
+                       
+                       $('#' + $item).hide();
+               }
+       }
+};
+
+/**
+ * Basic implementation for WCF dialogs.
+ */
+$.widget('ui.wcfDialog', $.ui.dialog, {
+       _init: function() {
+               this.options.autoOpen = true;
+               this.options.close = function(event, ui) {
+                       $(this).parent('.ui-dialog').wcfDropOut('down', $.proxy(function() {
+                               $(this).parent('.ui-dialog').empty().remove();
+                       }, this));
+               };
+               this.options.height = 'auto';
+               this.options.minHeight = 0;
+               this.options.modal = true;
+               this.options.width = 'auto';
+               
+               $.ui.dialog.prototype._init.apply(this, arguments);
+       }
+});
+
+/**
+ * Basic implementation for WCF dialogs loading content
+ * via AJAX before calling dialog itself.
+ */
+$.widget('ui.wcfAJAXDialog', $.ui.dialog, {
+       /**
+        * Indicates wether callback was already executed
+        * 
+        * @var boolean
+        */
+       _callbackExecuted: false,
+       
+       /**
+        * Initializes AJAX-request to fetch content.
+        */
+       _init: function() {
+               if (this.options.ajax) {
+                       this._loadContent();
+               }
+               
+               // force dialog to be placed centered
+               this.options.position = {
+                       my: 'center center',
+                       at: 'center center'
+               };
+               
+               // dialog should display a spinner-like image, thus immediately fire up dialog
+               this.options.autoOpen = true;
+               this.options.width = 'auto';
+               this.options.minHeight = 80;
+               
+               // disable ability to move dialog
+               this.options.resizable = false;
+               this.options.draggable = false;
+               
+               this.options.modal = true;
+               this.options.hide = {
+                       effect: 'drop',
+                       direction: 'down'
+               };
+               
+               this.options.close = function(event, ui) {
+                       // loading ajax content seems to block properly closing
+                       $(this).parent('.ui-dialog').empty().remove();
+               };
+               
+               if (this.options.preventClose) {
+                       this.options.closeOnEscape = false;
+               }
+               
+               $.ui.dialog.prototype._init.apply(this, arguments);
+               
+               // remove complete node instead of removing node-by-node
+               if (this.options.hideTitle && this.options.preventClose) {
+                       this.element.parent('.ui-dialog').find('div.ui-dialog-titlebar').empty().remove();
+               }
+               else {
+                       if (this.options.hideTitle) {
+                               // remove title element
+                               $('#ui-dialog-title-' + this.element.attr('id')).empty().remove();
+                       }
+                       
+                       if (this.options.preventClose) {
+                               // remove close-button
+                               this.element.parent('.ui-dialog').find('a.ui-dialog-titlebar-close').empty().remove();
+                       }
+               }
+       },
+       
+       /**
+        * Loads content via AJAX.
+        * 
+        * @todo        Enforce JSON
+        */
+       _loadContent: function() {
+               var $type = 'GET';
+               if (this.options.ajax.type) {
+                       $type = this.options.ajax.type;
+                       
+                       if (this.options.ajax.type != 'GET' && this.options.ajax.type != 'POST') {
+                               $type = 'GET';
+                       }
+               }
+               
+               var $data = this.options.ajax.data || {};
+               
+               $.ajax({
+                       url: this.options.ajax.url,
+                       context: this,
+                       dataType: 'json',
+                       type: $type,
+                       data: $data,
+                       success: $.proxy(this._createDialog, this),
+                       error: function(transport) {
+                               alert(transport.responseText);
+                       }
+               });
+       },
+       
+       /**
+        * Inserts content.
+        * 
+        * @param       string          data
+        */
+       _createDialog: function(data) {
+               data.ignoreTemplate = true;
+               this.element.data('responseData', data);
+               
+               this.element.wcfGrow({
+                       content: data.template,
+                       parent: this.element.parent('.ui-dialog')
+               }, {
+                       duration: 600,
+                       complete: $.proxy(function(data) {
+                               this.element.css({
+                                       height: 'auto'
+                               });
+                               
+                               // prevent double execution due to two complete-calls (two times animate)
+                               if (this._callbackExecuted) {
+                                       return;
+                               }
+                               
+                               this._callbackExecuted = true;
+                               
+                               this.element.removeClass('overlayLoading');
+                               this.element.html(this.element.data('responseData').template);
+                               
+                               if (this.options.ajax.success) {
+                                       this.options.ajax.success();
+                               }
+                       }, this)
+               });
+       },
+       
+       /**
+        * Redraws dialog, should be executed everytime content is changed.
+        */
+       redraw: function() {
+               var $dimensions = this.element.getDimensions();
+               
+               if ($dimensions.height > 200) {
+                       this.element.wcfGrow({
+                               content: this.element.html(),
+                               parent: this.element.parent('.ui-dialog')
+                       }, {
+                               duration: 600,
+                               complete: function() {
+                                       $(this).css({ height: 'auto' });
+                               }
+                       });
+               }
+       }
+});
+
+/**
+ * Workaround for ids containing a dot ".", until jQuery UI devs learn
+ * to properly escape ids ... (it took 18 months until they finally
+ * fixed it!)
+ * 
+ * @see        http://bugs.jqueryui.com/ticket/4681
+ */
+$.widget('ui.wcfTabs', $.ui.tabs, {
+       _init: function() {
+               $.ui.dialog.prototype._init.apply(this, arguments);
+       },
+       
+       _sanitizeSelector: function(hash) {
+               return hash.replace(/([:\.])/g, '\\$1');
+       }
+});
+
+/**
+ * jQuery widget implementation of the wcf pagination.
+ */
+$.widget('ui.wcfPages', {
+       SHOW_LINKS: 11,
+       SHOW_SUB_LINKS: 20,
+       
+       options: {
+               // vars
+               activePage: 1,
+               maxPage: 1,
+               
+               // icons
+               previousIcon: RELATIVE_WCF_DIR + 'icon/previousS.png',
+               previousDisabledIcon: RELATIVE_WCF_DIR + 'icon/previousDisabledS.png',
+               arrowDownIcon: RELATIVE_WCF_DIR + 'icon/arrowDown.png',
+               nextIcon: RELATIVE_WCF_DIR + 'icon/nextS.png',
+               nextDisabledIcon: RELATIVE_WCF_DIR + 'icon/nextDisabledS.png',
+               
+               // language
+               // we use options here instead of language variables, because the paginator is not only usable with pages
+               nextPage: null,
+               previousPage: null,
+       },
+       
+       /**
+        * Creates the pages widget.
+        */
+       _create: function() {
+               if (this.options.nextPage === null) this.options.nextPage = WCF.Language.get('wcf.global.page.next');
+               if (this.options.previousPage === null) this.options.previousPage = WCF.Language.get('wcf.global.page.previous');
+               
+               this.element.addClass('pageNavigation');
+               
+               this._render();
+       },
+       
+       /**
+        * Destroys the pages widget.
+        */
+       destroy: function() {
+               $.Widget.prototype.destroy.apply(this, arguments);
+               
+               this.element.children().remove();
+       },
+       
+       /**
+        * Renders th pages widget.
+        */
+       _render: function() {
+               // only render if we have more than 1 page
+               if (!this.options.disabled && this.options.maxPage > 1) {
+                       // make sure pagination is visible
+                       if (this.element.hasClass('hidden')) {
+                               this.element.removeClass('hidden');
+                       }
+                       this.element.show();
+                       
+                       this.element.children().remove();
+                       
+                       var $pageList = $('<ul></ul>');
+                       this.element.append($pageList);
+                       
+                       var $previousElement = $('<li></li>');
+                       $pageList.append($previousElement);
+                       
+                       if (this.options.activePage > 1) {
+                               var $previousLink = $('<a' + ((this.options.previousPage != null) ? (' title="' + this.options.previousPage + '"') : ('')) + '></a>');
+                               $previousElement.append($previousLink);
+                               this._bindSwitchPage($previousLink, this.options.activePage - 1);
+                               
+                               var $previousImage = $('<img src="' + this.options.previousIcon + '" alt="" />');
+                               $previousLink.append($previousImage);
+                       }
+                       else {
+                               var $previousImage = $('<img src="' + this.options.previousDisabledIcon + '" alt="" />');
+                               $previousElement.append($previousImage);
+                       }
+                       $previousElement.addClass('skip');
+                       
+                       // add first page
+                       $pageList.append(this._renderLink(1));
+                       
+                       // calculate page links
+                       var $maxLinks = this.SHOW_LINKS - 4;
+                       var $linksBefore = this.options.activePage - 2;
+                       if ($linksBefore < 0) $linksBefore = 0;
+                       var $linksAfter = this.options.maxPage - (this.options.activePage + 1);
+                       if ($linksAfter < 0) $linksAfter = 0;
+                       if (this.options.activePage > 1 && this.options.activePage < this.options.maxPage) $maxLinks--;
+                       
+                       var $half = $maxLinks / 2;
+                       var $left = this.options.activePage;
+                       var $right = this.options.activePage;
+                       if ($left < 1) $left = 1;
+                       if ($right < 1) $right = 1;
+                       if ($right > this.options.maxPage - 1) $right = this.options.maxPage - 1;
+                       
+                       if ($linksBefore >= $half) {
+                               $left -= $half;
+                       }
+                       else {
+                               $left -= $linksBefore;
+                               $right += $half - $linksBefore;
+                       }
+                       
+                       if ($linksAfter >= $half) {
+                               $right += $half;
+                       }
+                       else {
+                               $right += $linksAfter;
+                               $left -= $half - $linksAfter;
+                       }
+                       
+                       $right = Math.ceil($right);
+                       $left = Math.ceil($left);
+                       if ($left < 1) $left = 1;
+                       if ($right > this.options.maxPage) $right = this.options.maxPage;
+                       
+                       // left ... links
+                       if ($left > 1) {
+                               if ($left - 1 < 2) {
+                                       $pageList.append(this._renderLink(2));
+                               }
+                               else {
+                                       var $leftChildren = $('<li class="children"></li>');
+                                       $pageList.append($leftChildren);
+                                       
+                                       var $leftChildrenLink = $('<a>&hellip;</a>');
+                                       $leftChildren.append($leftChildrenLink);
+                                       $leftChildrenLink.click($.proxy(this._startInput, this));
+                                       
+                                       var $leftChildrenImage = $('<img src="' + this.options.arrowDownIcon + '" alt="" />');
+                                       $leftChildrenLink.append($leftChildrenImage);
+                                       
+                                       var $leftChildrenInput = $('<input type="text" class="inputText" name="pageNo" />');
+                                       $leftChildren.append($leftChildrenInput);
+                                       $leftChildrenInput.keydown($.proxy(this._handleInput, this));
+                                       $leftChildrenInput.keyup($.proxy(this._handleInput, this));
+                                       $leftChildrenInput.blur($.proxy(this._stopInput, this));
+                                       
+                                       var $leftChildrenContainer = $('<div></div>');
+                                       $leftChildren.append($leftChildrenContainer);
+                                       
+                                       var $leftChildrenList = $('<ul></u>');
+                                       $leftChildrenContainer.append($leftChildrenList);
+                                       
+                                       // render sublinks
+                                       var $k = 0;
+                                       var $step = Math.ceil(($left - 2) / this.SHOW_SUB_LINKS);
+                                       for (var $i = 2; $i <= $left; $i += $step) {
+                                               $leftChildrenList.append(this._renderLink($i, ($k != 0 && $k % 4 == 0)));
+                                               $k++;
+                                       }
+                               }
+                       }
+                       
+                       // visible links
+                       for (var $i = $left + 1; $i < $right; $i++) {
+                               $pageList.append(this._renderLink($i));
+                       }
+                       
+                       // right ... links
+                       if ($right < this.options.maxPage) {
+                               if (this.options.maxPage - $right < 2) {
+                                       $pageList.append(this._renderLink(this.options.maxPage - 1));
+                               }
+                               else {
+                                       var $rightChildren = $('<li class="children"></li>');
+                                       $pageList.append($rightChildren);
+                                       
+                                       var $rightChildrenLink = $('<a>&hellip;</a>');
+                                       $rightChildren.append($rightChildrenLink);
+                                       $rightChildrenLink.click($.proxy(this._startInput, this));
+                                       
+                                       var $rightChildrenImage = $('<img src="' + this.options.arrowDownIcon + '" alt="" />');
+                                       $rightChildrenLink.append($rightChildrenImage);
+                                       
+                                       var $rightChildrenInput = $('<input type="text" class="inputText" name="pageNo" />');
+                                       $rightChildren.append($rightChildrenInput);
+                                       $rightChildrenInput.keydown($.proxy(this._handleInput, this));
+                                       $rightChildrenInput.keyup($.proxy(this._handleInput, this));
+                                       $rightChildrenInput.blur($.proxy(this._stopInput, this));
+                                       
+                                       var $rightChildrenContainer = $('<div></div>');
+                                       $rightChildren.append($rightChildrenContainer);
+                                       
+                                       var $rightChildrenList = $('<ul></ul>');
+                                       $rightChildrenContainer.append($rightChildrenList);
+                                       
+                                       // render sublinks
+                                       var $k = 0;
+                                       var $step = Math.ceil((this.options.maxPage - $right) / this.SHOW_SUB_LINKS);
+                                       for (var $i = $right; $i < this.options.maxPage; $i += $step) {
+                                               $rightChildrenList.append(this._renderLink($i, ($k != 0 && $k % 4 == 0)));
+                                               $k++;
+                                       }
+                               }
+                       }
+                       
+                       // add last page
+                       $pageList.append(this._renderLink(this.options.maxPage));
+                       
+                       // add next button
+                       var $nextElement = $('<li></li>');
+                       $pageList.append($nextElement);
+                       
+                       if (this.options.activePage < this.options.maxPage) {
+                               var $nextLink = $('<a title="' + ((this.options.nextPage != null) ? (' title="' + this.options.nextPage + '"') : ('')) + '"></a>');
+                               $nextElement.append($nextLink);
+                               this._bindSwitchPage($nextLink, this.options.activePage + 1);
+                               
+                               var $nextImage = $('<img src="' + this.options.nextIcon + '" alt="" />');
+                               $nextLink.append($nextImage);
+                       }
+                       else {
+                               var $nextImage = $('<img src="' + this.options.nextDisabledIcon + '" alt="" />');
+                               $nextElement.append($nextImage);
+                       }
+                       $nextElement.addClass('skip');
+               }
+               else {
+                       // otherwise hide the paginator if not already hidden
+                       this.element.hide();
+               }
+       },
+       
+       /**
+        * Renders a page link
+        * 
+        * @parameter   integer         page
+        * 
+        * @return              $(element)
+        */
+       _renderLink: function(page, lineBreak) {
+               var $pageElement = $('<li></li>');
+               if (lineBreak != undefined && lineBreak) {
+                       $pageElement.addClass('break');
+               }
+               if (page != this.options.activePage) {
+                       var $pageLink = $('<a>' + WCF.String.addThousandsSeparator(page) + '</a>'); 
+                       $pageElement.append($pageLink);
+                       this._bindSwitchPage($pageLink, page);
+               }
+               else {
+                       $pageElement.addClass('active');
+                       var $pageSubElement = $('<span>' + WCF.String.addThousandsSeparator(page) + '</span>');
+                       $pageElement.append($pageSubElement);
+               }
+               
+               return $pageElement;
+       },
+       
+       /**
+        * Binds the 'click'-event for the page switching to the given element.
+        * 
+        * @parameter   $(element)      element
+        * @paremeter   integer         page
+        */
+       _bindSwitchPage: function(element, page) {
+               var $self = this;
+               element.click(function() {
+                       $self.switchPage(page);
+               });
+       },
+       
+       /**
+        * Switches to the given page
+        * 
+        * @parameter   Event           event
+        * @parameter   integer         page
+        */
+       switchPage: function(page) {
+               this._setOption('activePage', page);
+       },
+       
+       /**
+        * Sets the given option to the given value.
+        * See the jQuery UI widget documentation for more.
+        */
+       _setOption: function(key, value) {
+               if (key == 'activePage') {
+                       if (value != this.options[key] && value > 0 && value <= this.options.maxPage) {
+                               // you can prevent the page switching by returning false or by event.preventDefault()
+                               // in a shouldSwitch-callback. e.g. if an AJAX request is already running.
+                               var $result = this._trigger('shouldSwitch', undefined, {
+                                       nextPage: value,
+                               });
+                               
+                               if ($result) {
+                                       this.options[key] = value;
+                                       this._render();
+                                       this._trigger('switched', undefined, {
+                                               activePage: value,
+                                       });
+                               }
+                               else {
+                                       this._trigger('notSwitched', undefined, {
+                                               activePage: value,
+                                       });
+                               }
+                       }
+               }
+               else {
+                       this.options[key] = value;
+                       
+                       if (key == 'disabled') {
+                               if (value) {
+                                       this.element.children().remove();
+                               }
+                               else {
+                                       this._render()
+                               }
+                       }
+                       else if (key == 'maxPage') {
+                               this._render();
+                       }
+               }
+               
+               return this;
+       },
+       
+       /**
+        * Start input of pagenumber
+        * 
+        * @parameter   Event           event
+        */
+       _startInput: function(event) {
+               // hide a-tag
+               var $childLink = $(event.currentTarget);
+               if (!$childLink.is('a')) $childLink = $childLink.parent('a');
+               
+               $childLink.hide();
+               
+               // show input-tag
+               var $childInput = $childLink.parent('li').children('input')
+                       .css('display', 'block')
+                       .val('');
+               
+               $childInput.focus();
+       },
+       
+       /**
+        * Stops input of pagenumber
+        * 
+        * @parameter   Event           event
+        */
+       _stopInput: function(event) {
+               // hide input-tag
+               var $childInput = $(event.currentTarget);
+               $childInput.css('display', 'none');
+               
+               // show a-tag
+               var $childContainer = $childInput.parent('li')
+               if ($childContainer != undefined && $childContainer != null) {
+                       $childContainer.children('a').show();
+               }
+       },
+       
+       /**
+        * Handles input of pagenumber
+        * 
+        * @parameter   Event           event
+        */
+       _handleInput: function(event) {
+               var $ie7 = ($.browser.msie && $.browser.version == '7.0');
+               if (event.type != 'keyup' || $ie7) {
+                       if (!$ie7 || ((event.which == 13 || event.which == 27) && event.type == 'keyup')) {
+                               if (event.which == 13) {
+                                       this.switchPage(parseInt($(event.currentTarget).val()));
+                               }
+                               
+                               if (event.which == 13 || event.which == 27) {
+                                       this._stopInput(event);
+                                       event.stopPropagation();
+                               }
+                       }
+               }
+       }
+});
+
+/**
+ * Encapsulate eval() within an own function to prevent problems
+ * with optimizing and minifiny JS.
+ * 
+ * @param      mixed           expression
+ * @returns    mixed
+ */
+function wcfEval(expression) {
+       return eval(expression);
+}
index be9ef4f2338ea8d6b2bb60e36e01dd0ff8aa66c0..6cf562206c827729109c54dd1aa7f408ae45725b 100755 (executable)
@@ -1,14 +1,14 @@
-<?php\r
-namespace wcf\acp\action;\r
-\r
-/**\r
- * Copy of the default implementation for object-actions using the AJAX-API.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category   Community Framework\r
- */\r
+<?php
+namespace wcf\acp\action;
+
+/**
+ * Copy of the default implementation for object-actions using the AJAX-API.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.action
+ * @category   Community Framework
+ */
 class AJAXProxyAction extends \wcf\action\AJAXProxyAction { }
index ad0cf4196c6327382b7b2c4c48cd6e5e53c4e77c..7803f0c33cc80141404c39b0db10e8ab49801cb5 100755 (executable)
-<?php\r
-namespace wcf\acp\action;\r
-use wcf\action\AbstractDialogAction;\r
-use wcf\data\package\installation\queue\PackageInstallationQueue;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Handles an AJAX-based package installation.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category   Community Framework\r
- */\r
-class InstallPackageAction extends AbstractDialogAction {\r
-       /**\r
-        * current node\r
-        *\r
-        * @var string\r
-        */\r
-       public $node = '';\r
-       \r
-       /**\r
-        * PackageInstallationDispatcher object\r
-        *\r
-        * @var PackageInstallationDispatcher\r
-        */\r
-       public $installation = null;\r
-       \r
-       /**\r
-        * PackageInstallationQueue object\r
-        *\r
-        * @var PackageInstallationQueue\r
-        */\r
-       public $queue = null;\r
-       \r
-       /**\r
-        * current queue id\r
-        *\r
-        * @var integer\r
-        */\r
-       public $queueID = 0;\r
-       \r
-       // system\r
-       public $templateName = 'packageInstallationStep';\r
-       \r
-       /**\r
-        * @see wcf\action\IAction::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_POST['node'])) $this->node = StringUtil::trim($_POST['node']);\r
-               if (isset($_POST['queueID'])) $this->queueID = intval($_POST['queueID']);\r
-               $this->queue = new PackageInstallationQueue($this->queueID);\r
-               \r
-               if (!$this->queue->queueID) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-               \r
-               $this->installation = new PackageInstallationDispatcher($this->queue);\r
-       }\r
-       \r
-       /**\r
-        * Executes installation based upon nodes.\r
-        */\r
-       protected function stepInstall() {\r
-               $step = $this->installation->install($this->node);\r
-               \r
-               if ($step->hasDocument()) {\r
-                       $this->data = array(\r
-                               'innerTemplate' => $step->getTemplate(),\r
-                               'node' => $step->getNode(),\r
-                               'progress' => $this->installation->nodeBuilder->calculateProgress($this->node),\r
-                               'step' => 'install'\r
-                       );\r
-               }\r
-               else {\r
-                       if ($step->getNode() == '') {\r
-                               // perform final actions\r
-                               $queueID = $this->installation->completeSetup();\r
-                               \r
-                               // begin with next queue\r
-                               if ($queueID) {\r
-                                       $this->data = array(\r
-                                               'progress' => 100,\r
-                                               'queueID' => $queueID,\r
-                                               'step' => 'prepare'\r
-                                       );\r
-                                       return;\r
-                               }\r
-                               \r
-                               // no more queues, show success\r
-                               $this->data = array(\r
-                                       'progress' => 100,\r
-                                       'step' => 'success'\r
-                               );\r
-                               return;\r
-                       }\r
-                       \r
-                       // continue with next node\r
-                       $this->data = array(\r
-                               'step' => 'install',\r
-                               'node' => $step->getNode(),\r
-                               'progress' => $this->installation->nodeBuilder->calculateProgress($this->node)\r
-                       );\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Prepares the installation process.\r
-        */\r
-       protected function stepPrepare() {\r
-               // update package information\r
-               $this->installation->updatePackage();\r
-               \r
-               // clean-up previously created nodes\r
-               $this->installation->nodeBuilder->purgeNodes();\r
-               \r
-               // create node tree\r
-               $this->installation->nodeBuilder->buildNodes();\r
-               $nextNode = $this->installation->nodeBuilder->getNextNode();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'queue' => $this->queue\r
-               ));\r
-               \r
-               $this->data = array(\r
-                       'template' => WCF::getTPL()->fetch($this->templateName),\r
-                       'step' => 'install',\r
-                       'node' => $nextNode,\r
-                       'currentAction' => WCF::getLanguage()->get('wcf.package.installation.step.installing'),\r
-                       'progress' => 0\r
-               );\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\action\AbstractDialogAction\AbstractDialogAction::validateStep()\r
-        */\r
-       protected function validateStep() {\r
-               switch ($this->step) {\r
-                       case 'install':\r
-                       case 'prepare':\r
-                               continue;\r
-                       break;\r
-                       \r
-                       default:\r
-                               throw new IllegalLinkException();\r
-                       break;\r
-               }\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\action;
+use wcf\action\AbstractDialogAction;
+use wcf\data\package\installation\queue\PackageInstallationQueue;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * Handles an AJAX-based package installation.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.action
+ * @category   Community Framework
+ */
+class InstallPackageAction extends AbstractDialogAction {
+       /**
+        * current node
+        *
+        * @var string
+        */
+       public $node = '';
+       
+       /**
+        * PackageInstallationDispatcher object
+        *
+        * @var PackageInstallationDispatcher
+        */
+       public $installation = null;
+       
+       /**
+        * PackageInstallationQueue object
+        *
+        * @var PackageInstallationQueue
+        */
+       public $queue = null;
+       
+       /**
+        * current queue id
+        *
+        * @var integer
+        */
+       public $queueID = 0;
+       
+       // system
+       public $templateName = 'packageInstallationStep';
+       
+       /**
+        * @see wcf\action\IAction::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_POST['node'])) $this->node = StringUtil::trim($_POST['node']);
+               if (isset($_POST['queueID'])) $this->queueID = intval($_POST['queueID']);
+               $this->queue = new PackageInstallationQueue($this->queueID);
+               
+               if (!$this->queue->queueID) {
+                       throw new IllegalLinkException();
+               }
+               
+               $this->installation = new PackageInstallationDispatcher($this->queue);
+       }
+       
+       /**
+        * Executes installation based upon nodes.
+        */
+       protected function stepInstall() {
+               $step = $this->installation->install($this->node);
+               
+               if ($step->hasDocument()) {
+                       $this->data = array(
+                               'innerTemplate' => $step->getTemplate(),
+                               'node' => $step->getNode(),
+                               'progress' => $this->installation->nodeBuilder->calculateProgress($this->node),
+                               'step' => 'install'
+                       );
+               }
+               else {
+                       if ($step->getNode() == '') {
+                               // perform final actions
+                               $queueID = $this->installation->completeSetup();
+                               
+                               // begin with next queue
+                               if ($queueID) {
+                                       $this->data = array(
+                                               'progress' => 100,
+                                               'queueID' => $queueID,
+                                               'step' => 'prepare'
+                                       );
+                                       return;
+                               }
+                               
+                               // no more queues, show success
+                               $this->data = array(
+                                       'progress' => 100,
+                                       'step' => 'success'
+                               );
+                               return;
+                       }
+                       
+                       // continue with next node
+                       $this->data = array(
+                               'step' => 'install',
+                               'node' => $step->getNode(),
+                               'progress' => $this->installation->nodeBuilder->calculateProgress($this->node)
+                       );
+               }
+       }
+       
+       /**
+        * Prepares the installation process.
+        */
+       protected function stepPrepare() {
+               // update package information
+               $this->installation->updatePackage();
+               
+               // clean-up previously created nodes
+               $this->installation->nodeBuilder->purgeNodes();
+               
+               // create node tree
+               $this->installation->nodeBuilder->buildNodes();
+               $nextNode = $this->installation->nodeBuilder->getNextNode();
+               
+               WCF::getTPL()->assign(array(
+                       'queue' => $this->queue
+               ));
+               
+               $this->data = array(
+                       'template' => WCF::getTPL()->fetch($this->templateName),
+                       'step' => 'install',
+                       'node' => $nextNode,
+                       'currentAction' => WCF::getLanguage()->get('wcf.package.installation.step.installing'),
+                       'progress' => 0
+               );
+       }
+       
+       /**
+        * @see wcf\action\AbstractDialogAction\AbstractDialogAction::validateStep()
+        */
+       protected function validateStep() {
+               switch ($this->step) {
+                       case 'install':
+                       case 'prepare':
+                               continue;
+                       break;
+                       
+                       default:
+                               throw new IllegalLinkException();
+                       break;
+               }
+       }
+}
index b72222a0dafa62d584a1b81d9a1452cef14d9e70..2f18ed59ba9671f98d3d15f1f58608a668f72e81 100755 (executable)
@@ -1,40 +1,40 @@
-<?php\r
-namespace wcf\acp\action;\r
-use wcf\action\AbstractSecureAction;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-use wcf\util\HeaderUtil;\r
-\r
-/**\r
- * Does the user logout in the admin control panel.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category   Community Framework\r
- */\r
-class LogoutAction extends AbstractSecureAction {\r
-       /**\r
-        * @see wcf\action\IAction::execute()\r
-        */\r
-       public function execute() {\r
-               parent::execute();\r
-               \r
-               // validate\r
-               if (!WCF::getUser()->userID) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-               \r
-               // do logout\r
-               WCF::getSession()->delete();\r
-               \r
-               $this->executed();\r
-               \r
-               // forward to index page\r
-               // warning: if doLogout() writes a cookie this is buggy in MS IIS\r
-               HeaderUtil::redirect('index.php'.SID_ARG_1ST);\r
-               exit;\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\action;
+use wcf\action\AbstractSecureAction;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+use wcf\util\HeaderUtil;
+
+/**
+ * Does the user logout in the admin control panel.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.action
+ * @category   Community Framework
+ */
+class LogoutAction extends AbstractSecureAction {
+       /**
+        * @see wcf\action\IAction::execute()
+        */
+       public function execute() {
+               parent::execute();
+               
+               // validate
+               if (!WCF::getUser()->userID) {
+                       throw new IllegalLinkException();
+               }
+               
+               // do logout
+               WCF::getSession()->delete();
+               
+               $this->executed();
+               
+               // forward to index page
+               // warning: if doLogout() writes a cookie this is buggy in MS IIS
+               HeaderUtil::redirect('index.php'.SID_ARG_1ST);
+               exit;
+       }
+}
index d30e10428363f660c9e1cb7ff0294bf9cf30b154..51edb8475f057ff2064aa015d0500c37b47e239d 100755 (executable)
@@ -1,54 +1,54 @@
-<?php\r
-namespace wcf\acp\action;\r
-use wcf\action\AbstractAction;\r
-use wcf\data\option\Option;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Exports the options to an XML.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category   Community Framework\r
- */\r
-class OptionExportAction extends AbstractAction {\r
-       /**\r
-        * @see wcf\action\AbstractAction\AbstractAction::$neededPermissions\r
-        */\r
-       public $neededPermissions = array('admin.system.canEditOption');\r
-       \r
-       /**\r
-        * @see wcf\action\IAction::execute();\r
-        */\r
-       public function execute() {\r
-               parent::execute();\r
-               \r
-               // header\r
-               @header('Content-type: text/xml');\r
-               \r
-               // file name\r
-               @header('Content-disposition: attachment; filename="options.xml"');\r
-                       \r
-               // no cache headers\r
-               @header('Pragma: no-cache');\r
-               @header('Expires: 0');\r
-               \r
-               // content\r
-               echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<options>\n";\r
-               \r
-               $options = Option::getOptions();\r
-               foreach ($options as $option) {\r
-                       echo "\t<option>\n";\r
-                       echo "\t\t<name><![CDATA[".StringUtil::escapeCDATA($option['optionName'])."]]></name>\n";\r
-                       echo "\t\t<value><![CDATA[".StringUtil::escapeCDATA($option['optionValue'])."]]></value>\n";\r
-                       echo "\t</option>\n";\r
-               }\r
-               \r
-               echo '</options>';\r
-               $this->executed();\r
-               exit;\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\action;
+use wcf\action\AbstractAction;
+use wcf\data\option\Option;
+use wcf\util\StringUtil;
+
+/**
+ * Exports the options to an XML.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.action
+ * @category   Community Framework
+ */
+class OptionExportAction extends AbstractAction {
+       /**
+        * @see wcf\action\AbstractAction\AbstractAction::$neededPermissions
+        */
+       public $neededPermissions = array('admin.system.canEditOption');
+       
+       /**
+        * @see wcf\action\IAction::execute();
+        */
+       public function execute() {
+               parent::execute();
+               
+               // header
+               @header('Content-type: text/xml');
+               
+               // file name
+               @header('Content-disposition: attachment; filename="options.xml"');
+                       
+               // no cache headers
+               @header('Pragma: no-cache');
+               @header('Expires: 0');
+               
+               // content
+               echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<options>\n";
+               
+               $options = Option::getOptions();
+               foreach ($options as $option) {
+                       echo "\t<option>\n";
+                       echo "\t\t<name><![CDATA[".StringUtil::escapeCDATA($option['optionName'])."]]></name>\n";
+                       echo "\t\t<value><![CDATA[".StringUtil::escapeCDATA($option['optionValue'])."]]></value>\n";
+                       echo "\t</option>\n";
+               }
+               
+               echo '</options>';
+               $this->executed();
+               exit;
+       }
+}
index 2ecd601153776884d714d8a719acf43eea37866d..91b4860041e7f6df97323df43167ad028863c30b 100755 (executable)
-<?php\r
-namespace wcf\acp\action;\r
-use wcf\action\AbstractDialogAction;\r
-use wcf\data\package\Package;\r
-use wcf\data\package\installation\queue\PackageInstallationQueue;\r
-use wcf\data\package\installation\queue\PackageInstallationQueueEditor;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\package\PackageUninstallationDispatcher;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Handles an AJAX-based package uninstallation.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category   Community Framework\r
- */\r
-class UninstallPackageAction extends InstallPackageAction {\r
-       /**\r
-        * active package id\r
-        *\r
-        * @var integer\r
-        */\r
-       protected $packageID = 0;\r
-       \r
-       // system\r
-       public $templateName = 'packageUninstallationStep';\r
-       \r
-       /**\r
-        * @see wcf\action\IAction::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               AbstractDialogAction::readParameters();\r
-               \r
-               if (isset($_POST['node'])) $this->node = StringUtil::trim($_POST['node']);\r
-               \r
-               if (isset($_POST['packageID'])) {\r
-                       $this->packageID = intval($_POST['packageID']);\r
-               }\r
-               else {\r
-                       if (isset($_POST['queueID'])) $this->queueID = intval($_POST['queueID']);\r
-                       $this->queue = new PackageInstallationQueue($this->queueID);\r
-                       \r
-                       if (!$this->queue->queueID) {\r
-                               throw new IllegalLinkException();\r
-                       }\r
-                       \r
-                       $this->installation = new PackageUninstallationDispatcher($this->queue);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Prepares the uninstallation process.\r
-        */\r
-       protected function stepPrepare() {\r
-               $package = new Package($this->packageID);\r
-               if (!$package->packageID) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-               \r
-               if (PackageUninstallationDispatcher::hasDependencies($package->packageID)) {\r
-                       throw new SystemException('hasDependencies');\r
-               }\r
-               else {\r
-                       // get new process no\r
-                       $processNo = PackageInstallationQueue::getNewProcessNo();\r
-                       \r
-                       // create queue\r
-                       $queue = PackageInstallationQueueEditor::create(array(\r
-                               'processNo' => $processNo,\r
-                               'userID' => WCF::getUser()->userID,\r
-                               'packageName' => $package->getName(),\r
-                               'packageID' => $package->packageID,\r
-                               'action' => 'uninstall',\r
-                               'cancelable' => 0\r
-                       ));\r
-                       \r
-                       // initialize uninstallation\r
-                       $this->installation = new PackageUninstallationDispatcher($queue);\r
-                       \r
-                       $this->installation->nodeBuilder->purgeNodes();\r
-                       $this->installation->nodeBuilder->buildNodes();\r
-                       \r
-                       WCF::getTPL()->assign(array(\r
-                               'queue' => $queue\r
-                       ));\r
-                       \r
-                       $this->data = array(\r
-                               'template' => WCF::getTPL()->fetch($this->templateName),\r
-                               'step' => 'uninstall',\r
-                               'node' => $this->installation->nodeBuilder->getNextNode(),\r
-                               'currentAction' => WCF::getLanguage()->get('wcf.package.installation.step.uninstalling'),\r
-                               'progress' => 0,\r
-                               'queueID' => $queue->queueID\r
-                       );\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Uninstalls node components and returns next node.\r
-        *\r
-        * @param       string          $node\r
-        * @return      string\r
-        */\r
-       public function stepUninstall() {\r
-               $node = $this->installation->uninstall($this->node);\r
-               \r
-               if ($node == '') {\r
-                       // remove node data\r
-                       $this->installation->nodeBuilder->purgeNodes();\r
-                       \r
-                       // TODO: Show 'success' template at this point\r
-                       $this->data = array(\r
-                               'progress' => 100,\r
-                               'step' => 'success'\r
-                       );\r
-                       return;\r
-               }\r
-               \r
-               // continue with next node\r
-               $this->data = array(\r
-                       'step' => 'uninstall',\r
-                       'node' => $node,\r
-                       'progress' => $this->installation->nodeBuilder->calculateProgress($this->node)\r
-               );\r
-       }\r
-       \r
-       /**\r
-        * @see AbstractDialogAction::validateStep()\r
-        */\r
-       protected function validateStep() {\r
-               switch ($this->step) {\r
-                       case 'prepare':\r
-                       case 'uninstall':\r
-                               continue;\r
-                       break;\r
-                       \r
-                       default:\r
-                               die(print_r($_POST, true));\r
-                               throw new IllegalLinkException();\r
-                       break;\r
-               }\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\action;
+use wcf\action\AbstractDialogAction;
+use wcf\data\package\Package;
+use wcf\data\package\installation\queue\PackageInstallationQueue;
+use wcf\data\package\installation\queue\PackageInstallationQueueEditor;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\SystemException;
+use wcf\system\package\PackageUninstallationDispatcher;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * Handles an AJAX-based package uninstallation.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.action
+ * @category   Community Framework
+ */
+class UninstallPackageAction extends InstallPackageAction {
+       /**
+        * active package id
+        *
+        * @var integer
+        */
+       protected $packageID = 0;
+       
+       // system
+       public $templateName = 'packageUninstallationStep';
+       
+       /**
+        * @see wcf\action\IAction::readParameters()
+        */
+       public function readParameters() {
+               AbstractDialogAction::readParameters();
+               
+               if (isset($_POST['node'])) $this->node = StringUtil::trim($_POST['node']);
+               
+               if (isset($_POST['packageID'])) {
+                       $this->packageID = intval($_POST['packageID']);
+               }
+               else {
+                       if (isset($_POST['queueID'])) $this->queueID = intval($_POST['queueID']);
+                       $this->queue = new PackageInstallationQueue($this->queueID);
+                       
+                       if (!$this->queue->queueID) {
+                               throw new IllegalLinkException();
+                       }
+                       
+                       $this->installation = new PackageUninstallationDispatcher($this->queue);
+               }
+       }
+       
+       /**
+        * Prepares the uninstallation process.
+        */
+       protected function stepPrepare() {
+               $package = new Package($this->packageID);
+               if (!$package->packageID) {
+                       throw new IllegalLinkException();
+               }
+               
+               if (PackageUninstallationDispatcher::hasDependencies($package->packageID)) {
+                       throw new SystemException('hasDependencies');
+               }
+               else {
+                       // get new process no
+                       $processNo = PackageInstallationQueue::getNewProcessNo();
+                       
+                       // create queue
+                       $queue = PackageInstallationQueueEditor::create(array(
+                               'processNo' => $processNo,
+                               'userID' => WCF::getUser()->userID,
+                               'packageName' => $package->getName(),
+                               'packageID' => $package->packageID,
+                               'action' => 'uninstall',
+                               'cancelable' => 0
+                       ));
+                       
+                       // initialize uninstallation
+                       $this->installation = new PackageUninstallationDispatcher($queue);
+                       
+                       $this->installation->nodeBuilder->purgeNodes();
+                       $this->installation->nodeBuilder->buildNodes();
+                       
+                       WCF::getTPL()->assign(array(
+                               'queue' => $queue
+                       ));
+                       
+                       $this->data = array(
+                               'template' => WCF::getTPL()->fetch($this->templateName),
+                               'step' => 'uninstall',
+                               'node' => $this->installation->nodeBuilder->getNextNode(),
+                               'currentAction' => WCF::getLanguage()->get('wcf.package.installation.step.uninstalling'),
+                               'progress' => 0,
+                               'queueID' => $queue->queueID
+                       );
+               }
+       }
+       
+       /**
+        * Uninstalls node components and returns next node.
+        *
+        * @param       string          $node
+        * @return      string
+        */
+       public function stepUninstall() {
+               $node = $this->installation->uninstall($this->node);
+               
+               if ($node == '') {
+                       // remove node data
+                       $this->installation->nodeBuilder->purgeNodes();
+                       
+                       // TODO: Show 'success' template at this point
+                       $this->data = array(
+                               'progress' => 100,
+                               'step' => 'success'
+                       );
+                       return;
+               }
+               
+               // continue with next node
+               $this->data = array(
+                       'step' => 'uninstall',
+                       'node' => $node,
+                       'progress' => $this->installation->nodeBuilder->calculateProgress($this->node)
+               );
+       }
+       
+       /**
+        * @see AbstractDialogAction::validateStep()
+        */
+       protected function validateStep() {
+               switch ($this->step) {
+                       case 'prepare':
+                       case 'uninstall':
+                               continue;
+                       break;
+                       
+                       default:
+                               die(print_r($_POST, true));
+                               throw new IllegalLinkException();
+                       break;
+               }
+       }
+}
index cf98b005f56d76a4fd6460c13d6cf53ea5e70b95..129258d54a65ce73e16d283bed094ce55cfdea97 100755 (executable)
@@ -1,33 +1,33 @@
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\form\AbstractForm;\r
-\r
-/**\r
- * Provides a default implementation for the show method in acp forms.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class ACPForm extends AbstractForm {\r
-       /**\r
-        * Active acp menu item.\r
-        * \r
-        * @var string\r
-        */\r
-       public $activeMenuItem = '';\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               // enable menu item\r
-               if (!empty($this->activeMenuItem)) ACPMenu::getInstance()->setActiveMenuItem($this->activeMenuItem);\r
-               \r
-               parent::show();\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\form\AbstractForm;
+
+/**
+ * Provides a default implementation for the show method in acp forms.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class ACPForm extends AbstractForm {
+       /**
+        * Active acp menu item.
+        * 
+        * @var string
+        */
+       public $activeMenuItem = '';
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               // enable menu item
+               if (!empty($this->activeMenuItem)) ACPMenu::getInstance()->setActiveMenuItem($this->activeMenuItem);
+               
+               parent::show();
+       }
+}
index 24ee8d1ca87c71f189c76754b85a4b2ca838792c..041267406141147657e3cdb5ff6dc6e54a4d75c1 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\option\category\OptionCategory;\r
-use wcf\data\option\Option;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * This class provides default implementations for a list of options.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-abstract class AbstractOptionListForm extends AbstractForm {\r
-       /**\r
-        * @see wcf\form\AbstractForm::$errorField\r
-        */\r
-       public $errorField = array();\r
-       \r
-       /**\r
-        * @see wcf\form\AbstractForm::$errorType\r
-        */\r
-       public $errorType = array();\r
-\r
-       /**\r
-        * cache name\r
-        * @var string\r
-        */\r
-       public $cacheName = 'option-';\r
-       \r
-       /**\r
-        * cache class name\r
-        * @var string\r
-        */\r
-       public $cacheClass = 'wcf\system\cache\builder\CacheBuilderOption';\r
-\r
-       /**\r
-        * list of all option categories\r
-        * @var array<OptionCategory>\r
-        */\r
-       public $cachedCategories = array();\r
-       \r
-       /**\r
-        * list of all options\r
-        * @var array<Option>\r
-        */\r
-       public $cachedOptions = array();\r
-       \r
-       /**\r
-        * category structure\r
-        * @var array\r
-        */\r
-       public $cachedCategoryStructure = array();\r
-       \r
-       /**\r
-        * option structure\r
-        * @var array\r
-        */\r
-       public $cachedOptionToCategories = array();\r
-       \r
-       /**\r
-        * raw option values\r
-        * @var array<mixed>\r
-        */\r
-       public $rawValues = array();\r
-       \r
-       /**\r
-        * option values\r
-        * @var array<mixed>\r
-        */\r
-       public $optionValues = array();\r
-       \r
-       /**\r
-        * Name of the active option category.\r
-        * @var string\r
-        */\r
-       public $categoryName = '';\r
-       \r
-       /**\r
-        * Options of the active category.\r
-        * @var array<Option>\r
-        */\r
-       public $options = array();\r
-       \r
-       /**\r
-        * Type object cache.\r
-        * @var array\r
-        */\r
-       public $typeObjects = array();\r
-               \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['values']) && is_array($_POST['values'])) $this->rawValues = $_POST['values'];\r
-       }\r
-\r
-       /**\r
-        * Returns an object of the requested option type.\r
-        * \r
-        * @param       string                  $type\r
-        * @return      wcf\system\option\IOptionType\r
-        */\r
-       protected function getTypeObject($type) {\r
-               if (!isset($this->typeObjects[$type])) {\r
-                       $className = 'wcf\system\option\OptionType'.ucfirst($type);\r
-                       \r
-                       // validate class\r
-                       if (!class_exists($className)) {\r
-                               throw new SystemException("unable to find class '".$className."'", 11001);\r
-                       }\r
-                       if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\IOptionType')) {\r
-                               throw new SystemException("'".$className."' should implement wcf\system\option\IOptionType");\r
-                       }\r
-                       // create instance\r
-                       $this->typeObjects[$type] = new $className();\r
-               }\r
-               \r
-               return $this->typeObjects[$type];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               parent::validate();\r
-               \r
-               foreach ($this->options as $option) {\r
-                       try {\r
-                               $this->validateOption($option);\r
-                       }\r
-                       catch (UserInputException $e) {\r
-                               $this->errorType[$e->getField()] = $e->getType();\r
-                       }\r
-               }\r
-               \r
-               if (count($this->errorType) > 0) {\r
-                       throw new UserInputException('options', $this->errorType);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Validates an option.\r
-        * \r
-        * @param       Option          $option\r
-        */\r
-       protected function validateOption(Option $option) {\r
-               // get type object\r
-               $typeObj = $this->getTypeObject($option->optionType);\r
-               \r
-               // get new value\r
-               $newValue = isset($this->rawValues[$option->optionName]) ? $this->rawValues[$option->optionName] : null;\r
-                               \r
-               // get save value\r
-               $this->optionValues[$option->optionName] = $typeObj->getData($option, $newValue);\r
-                               \r
-               // validate with pattern\r
-               if ($option->validationPattern) {\r
-                       if (!preg_match('~'.$option->validationPattern.'~', $this->optionValues[$option->optionName])) {\r
-                               throw new UserInputException($option->optionName, 'validationFailed');\r
-                       }\r
-               }\r
-               \r
-               // validate by type object\r
-               $typeObj->validate($option, $newValue);\r
-       }\r
-       \r
-       /**\r
-        * Gets all options and option categories from cache.\r
-        */\r
-       protected function readCache() {\r
-               // init cache\r
-               $cacheName = $this->cacheName.PACKAGE_ID;\r
-               CacheHandler::getInstance()->addResource($cacheName, WCF_DIR.'cache/cache.'.$cacheName.'.php', $this->cacheClass);\r
-               \r
-               // get cache contents\r
-               $this->cachedCategories = CacheHandler::getInstance()->get($cacheName, 'categories');\r
-               $this->cachedOptions = CacheHandler::getInstance()->get($cacheName, 'options');\r
-               $this->cachedCategoryStructure = CacheHandler::getInstance()->get($cacheName, 'categoryStructure');\r
-               $this->cachedOptionToCategories = CacheHandler::getInstance()->get($cacheName, 'optionToCategories');\r
-               \r
-               // get active options\r
-               $this->loadActiveOptions($this->categoryName);\r
-       }\r
-       \r
-       /**\r
-        * Creates a list of all active options.\r
-        * \r
-        * @param       string          $parentCategoryName\r
-        */\r
-       protected function loadActiveOptions($parentCategoryName) {\r
-               if (!isset($this->cachedCategories[$parentCategoryName]) || static::checkCategory($this->cachedCategories[$parentCategoryName])) {\r
-                       if (isset($this->cachedOptionToCategories[$parentCategoryName])) {\r
-                               foreach ($this->cachedOptionToCategories[$parentCategoryName] as $optionName) {\r
-                                       if (static::checkOption($this->cachedOptions[$optionName])) {\r
-                                               $this->options[$optionName] = $this->cachedOptions[$optionName];\r
-                                       }\r
-                               }\r
-                       }\r
-                       if (isset($this->cachedCategoryStructure[$parentCategoryName])) {\r
-                               foreach ($this->cachedCategoryStructure[$parentCategoryName] as $categoryName) {\r
-                                       $this->loadActiveOptions($categoryName);\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Checks the required permissions and options of a category.\r
-        * \r
-        * @param       OptionCategory          $category\r
-        * @return      boolean\r
-        */\r
-       protected static function checkCategory(OptionCategory $category) {\r
-               if ($category->permissions) {\r
-                       $hasPermission = false;\r
-                       $permissions = explode(',', $category->permissions);\r
-                       foreach ($permissions as $permission) {\r
-                               if (WCF::getSession()->getPermission($permission)) {\r
-                                       $hasPermission = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       \r
-                       if (!$hasPermission) return false;\r
-                       \r
-               }\r
-               if ($category->options) {\r
-                       $hasEnabledOption = false;\r
-                       $options = explode(',', strtoupper($category->options));\r
-                       foreach ($options as $option) {\r
-                               if (defined($option) && constant($option)) {\r
-                                       $hasEnabledOption = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       \r
-                       if (!$hasEnabledOption) return false;\r
-               }\r
-               \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       protected function getFormElement($type, Option $option) {\r
-               return $this->getTypeObject($type)->getFormElement($option, (isset($this->optionValues[$option->optionName]) ? $this->optionValues[$option->optionName] : null));\r
-       }\r
-       \r
-       /**\r
-        * Checks the required permissions and options of an option.\r
-        * \r
-        * @param       Option          $option\r
-        * @return      boolean\r
-        */\r
-       protected static function checkOption(Option $option) {\r
-               if ($option->permissions) {\r
-                       $hasPermission = false;\r
-                       $permissions = explode(',', $option->permissions);\r
-                       foreach ($permissions as $permission) {\r
-                               if (WCF::getSession()->getPermission($permission)) {\r
-                                       $hasPermission = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       \r
-                       if (!$hasPermission) return false;\r
-                       \r
-               }\r
-               if ($option->options) {\r
-                       $hasEnabledOption = false;\r
-                       $options = explode(',', strtoupper($option->options));\r
-                       foreach ($options as $option) {\r
-                               if (defined($option) && constant($option)) {\r
-                                       $hasEnabledOption = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       \r
-                       if (!$hasEnabledOption) return false;\r
-               }\r
-               \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Returns the tree of options.\r
-        * \r
-        * @param       string          $parentCategoryName\r
-        * @param       integer         $level\r
-        * @return      array\r
-        */\r
-       protected function getOptionTree($parentCategoryName = '', $level = 0) {\r
-               $tree = array();\r
-               \r
-               if (isset($this->cachedCategoryStructure[$parentCategoryName])) {\r
-                       // get super categories\r
-                       foreach ($this->cachedCategoryStructure[$parentCategoryName] as $superCategoryName) {\r
-                               $superCategoryObject = $this->cachedCategories[$superCategoryName];\r
-                               $superCategory = array(\r
-                                       'object' => $superCategoryObject,\r
-                                       'categories' => array(),\r
-                                       'options' => array()\r
-                               );\r
-                               \r
-                               if (static::checkCategory($superCategoryObject)) {\r
-                                       if ($level <= 1) {\r
-                                               $superCategory['categories'] = $this->getOptionTree($superCategoryName, $level + 1);\r
-                                       }\r
-                                       if ($level > 1 || count($superCategory['categories']) == 0) {\r
-                                               $superCategory['options'] = $this->getCategoryOptions($superCategoryName);\r
-                                       }\r
-                                       else {\r
-                                               $superCategory['options'] = $this->getCategoryOptions($superCategoryName, false);\r
-                                       }\r
-                                       \r
-                                       if (count($superCategory['categories']) > 0 || count($superCategory['options']) > 0) {\r
-                                               $tree[] = $superCategory;\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       \r
-               return $tree;\r
-       }\r
-       \r
-       /**\r
-        * Returns a list with the options of a specific option category.\r
-        * \r
-        * @param       string          $categoryName\r
-        * @param       boolean         $inherit\r
-        * @return      array\r
-        */\r
-       protected function getCategoryOptions($categoryName = '', $inherit = true) {\r
-               $children = array();\r
-               \r
-               // get sub categories\r
-               if ($inherit && isset($this->cachedCategoryStructure[$categoryName])) {\r
-                       foreach ($this->cachedCategoryStructure[$categoryName] as $subCategoryName) {\r
-                               $children = array_merge($children, $this->getCategoryOptions($subCategoryName));\r
-                       }\r
-               }\r
-               \r
-               // get options\r
-               if (isset($this->cachedOptionToCategories[$categoryName])) {\r
-                       $i = 0;\r
-                       $last = count($this->cachedOptionToCategories[$categoryName]) - 1;\r
-                       foreach ($this->cachedOptionToCategories[$categoryName] as $optionName) {\r
-                               if (!isset($this->options[$optionName]) || !$this->checkOption($this->options[$optionName])) continue;\r
-                               \r
-                               // get option object\r
-                               $option = $this->options[$optionName];\r
-                               \r
-                               // get form element html\r
-                               $html = $this->getFormElement($option->optionType, $option);\r
-                               \r
-                               // add option to list\r
-                               $children[] = array(\r
-                                       'object' => $option,\r
-                                       'html' => $html\r
-                               );\r
-                               \r
-                               $i++;\r
-                       }\r
-               }\r
-               \r
-               return $children;\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\option\category\OptionCategory;
+use wcf\data\option\Option;
+use wcf\form\AbstractForm;
+use wcf\system\cache\CacheHandler;
+use wcf\system\exception\SystemException;
+use wcf\util\ClassUtil;
+
+/**
+ * This class provides default implementations for a list of options.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+abstract class AbstractOptionListForm extends AbstractForm {
+       /**
+        * @see wcf\form\AbstractForm::$errorField
+        */
+       public $errorField = array();
+       
+       /**
+        * @see wcf\form\AbstractForm::$errorType
+        */
+       public $errorType = array();
+
+       /**
+        * cache name
+        * @var string
+        */
+       public $cacheName = 'option-';
+       
+       /**
+        * cache class name
+        * @var string
+        */
+       public $cacheClass = 'wcf\system\cache\builder\CacheBuilderOption';
+
+       /**
+        * list of all option categories
+        * @var array<OptionCategory>
+        */
+       public $cachedCategories = array();
+       
+       /**
+        * list of all options
+        * @var array<Option>
+        */
+       public $cachedOptions = array();
+       
+       /**
+        * category structure
+        * @var array
+        */
+       public $cachedCategoryStructure = array();
+       
+       /**
+        * option structure
+        * @var array
+        */
+       public $cachedOptionToCategories = array();
+       
+       /**
+        * raw option values
+        * @var array<mixed>
+        */
+       public $rawValues = array();
+       
+       /**
+        * option values
+        * @var array<mixed>
+        */
+       public $optionValues = array();
+       
+       /**
+        * Name of the active option category.
+        * @var string
+        */
+       public $categoryName = '';
+       
+       /**
+        * Options of the active category.
+        * @var array<Option>
+        */
+       public $options = array();
+       
+       /**
+        * Type object cache.
+        * @var array
+        */
+       public $typeObjects = array();
+               
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['values']) && is_array($_POST['values'])) $this->rawValues = $_POST['values'];
+       }
+
+       /**
+        * Returns an object of the requested option type.
+        * 
+        * @param       string                  $type
+        * @return      wcf\system\option\IOptionType
+        */
+       protected function getTypeObject($type) {
+               if (!isset($this->typeObjects[$type])) {
+                       $className = 'wcf\system\option\OptionType'.ucfirst($type);
+                       
+                       // validate class
+                       if (!class_exists($className)) {
+                               throw new SystemException("unable to find class '".$className."'", 11001);
+                       }
+                       if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\IOptionType')) {
+                               throw new SystemException("'".$className."' should implement wcf\system\option\IOptionType");
+                       }
+                       // create instance
+                       $this->typeObjects[$type] = new $className();
+               }
+               
+               return $this->typeObjects[$type];
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               parent::validate();
+               
+               foreach ($this->options as $option) {
+                       try {
+                               $this->validateOption($option);
+                       }
+                       catch (UserInputException $e) {
+                               $this->errorType[$e->getField()] = $e->getType();
+                       }
+               }
+               
+               if (count($this->errorType) > 0) {
+                       throw new UserInputException('options', $this->errorType);
+               }
+       }
+       
+       /**
+        * Validates an option.
+        * 
+        * @param       Option          $option
+        */
+       protected function validateOption(Option $option) {
+               // get type object
+               $typeObj = $this->getTypeObject($option->optionType);
+               
+               // get new value
+               $newValue = isset($this->rawValues[$option->optionName]) ? $this->rawValues[$option->optionName] : null;
+                               
+               // get save value
+               $this->optionValues[$option->optionName] = $typeObj->getData($option, $newValue);
+                               
+               // validate with pattern
+               if ($option->validationPattern) {
+                       if (!preg_match('~'.$option->validationPattern.'~', $this->optionValues[$option->optionName])) {
+                               throw new UserInputException($option->optionName, 'validationFailed');
+                       }
+               }
+               
+               // validate by type object
+               $typeObj->validate($option, $newValue);
+       }
+       
+       /**
+        * Gets all options and option categories from cache.
+        */
+       protected function readCache() {
+               // init cache
+               $cacheName = $this->cacheName.PACKAGE_ID;
+               CacheHandler::getInstance()->addResource($cacheName, WCF_DIR.'cache/cache.'.$cacheName.'.php', $this->cacheClass);
+               
+               // get cache contents
+               $this->cachedCategories = CacheHandler::getInstance()->get($cacheName, 'categories');
+               $this->cachedOptions = CacheHandler::getInstance()->get($cacheName, 'options');
+               $this->cachedCategoryStructure = CacheHandler::getInstance()->get($cacheName, 'categoryStructure');
+               $this->cachedOptionToCategories = CacheHandler::getInstance()->get($cacheName, 'optionToCategories');
+               
+               // get active options
+               $this->loadActiveOptions($this->categoryName);
+       }
+       
+       /**
+        * Creates a list of all active options.
+        * 
+        * @param       string          $parentCategoryName
+        */
+       protected function loadActiveOptions($parentCategoryName) {
+               if (!isset($this->cachedCategories[$parentCategoryName]) || static::checkCategory($this->cachedCategories[$parentCategoryName])) {
+                       if (isset($this->cachedOptionToCategories[$parentCategoryName])) {
+                               foreach ($this->cachedOptionToCategories[$parentCategoryName] as $optionName) {
+                                       if (static::checkOption($this->cachedOptions[$optionName])) {
+                                               $this->options[$optionName] = $this->cachedOptions[$optionName];
+                                       }
+                               }
+                       }
+                       if (isset($this->cachedCategoryStructure[$parentCategoryName])) {
+                               foreach ($this->cachedCategoryStructure[$parentCategoryName] as $categoryName) {
+                                       $this->loadActiveOptions($categoryName);
+                               }
+                       }
+               }
+       }
+       
+       /**
+        * Checks the required permissions and options of a category.
+        * 
+        * @param       OptionCategory          $category
+        * @return      boolean
+        */
+       protected static function checkCategory(OptionCategory $category) {
+               if ($category->permissions) {
+                       $hasPermission = false;
+                       $permissions = explode(',', $category->permissions);
+                       foreach ($permissions as $permission) {
+                               if (WCF::getSession()->getPermission($permission)) {
+                                       $hasPermission = true;
+                                       break;
+                               }
+                       }
+                       
+                       if (!$hasPermission) return false;
+                       
+               }
+               if ($category->options) {
+                       $hasEnabledOption = false;
+                       $options = explode(',', strtoupper($category->options));
+                       foreach ($options as $option) {
+                               if (defined($option) && constant($option)) {
+                                       $hasEnabledOption = true;
+                                       break;
+                               }
+                       }
+                       
+                       if (!$hasEnabledOption) return false;
+               }
+               
+               return true;
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       protected function getFormElement($type, Option $option) {
+               return $this->getTypeObject($type)->getFormElement($option, (isset($this->optionValues[$option->optionName]) ? $this->optionValues[$option->optionName] : null));
+       }
+       
+       /**
+        * Checks the required permissions and options of an option.
+        * 
+        * @param       Option          $option
+        * @return      boolean
+        */
+       protected static function checkOption(Option $option) {
+               if ($option->permissions) {
+                       $hasPermission = false;
+                       $permissions = explode(',', $option->permissions);
+                       foreach ($permissions as $permission) {
+                               if (WCF::getSession()->getPermission($permission)) {
+                                       $hasPermission = true;
+                                       break;
+                               }
+                       }
+                       
+                       if (!$hasPermission) return false;
+                       
+               }
+               if ($option->options) {
+                       $hasEnabledOption = false;
+                       $options = explode(',', strtoupper($option->options));
+                       foreach ($options as $option) {
+                               if (defined($option) && constant($option)) {
+                                       $hasEnabledOption = true;
+                                       break;
+                               }
+                       }
+                       
+                       if (!$hasEnabledOption) return false;
+               }
+               
+               return true;
+       }
+       
+       /**
+        * Returns the tree of options.
+        * 
+        * @param       string          $parentCategoryName
+        * @param       integer         $level
+        * @return      array
+        */
+       protected function getOptionTree($parentCategoryName = '', $level = 0) {
+               $tree = array();
+               
+               if (isset($this->cachedCategoryStructure[$parentCategoryName])) {
+                       // get super categories
+                       foreach ($this->cachedCategoryStructure[$parentCategoryName] as $superCategoryName) {
+                               $superCategoryObject = $this->cachedCategories[$superCategoryName];
+                               $superCategory = array(
+                                       'object' => $superCategoryObject,
+                                       'categories' => array(),
+                                       'options' => array()
+                               );
+                               
+                               if (static::checkCategory($superCategoryObject)) {
+                                       if ($level <= 1) {
+                                               $superCategory['categories'] = $this->getOptionTree($superCategoryName, $level + 1);
+                                       }
+                                       if ($level > 1 || count($superCategory['categories']) == 0) {
+                                               $superCategory['options'] = $this->getCategoryOptions($superCategoryName);
+                                       }
+                                       else {
+                                               $superCategory['options'] = $this->getCategoryOptions($superCategoryName, false);
+                                       }
+                                       
+                                       if (count($superCategory['categories']) > 0 || count($superCategory['options']) > 0) {
+                                               $tree[] = $superCategory;
+                                       }
+                               }
+                       }
+               }
+       
+               return $tree;
+       }
+       
+       /**
+        * Returns a list with the options of a specific option category.
+        * 
+        * @param       string          $categoryName
+        * @param       boolean         $inherit
+        * @return      array
+        */
+       protected function getCategoryOptions($categoryName = '', $inherit = true) {
+               $children = array();
+               
+               // get sub categories
+               if ($inherit && isset($this->cachedCategoryStructure[$categoryName])) {
+                       foreach ($this->cachedCategoryStructure[$categoryName] as $subCategoryName) {
+                               $children = array_merge($children, $this->getCategoryOptions($subCategoryName));
+                       }
+               }
+               
+               // get options
+               if (isset($this->cachedOptionToCategories[$categoryName])) {
+                       $i = 0;
+                       $last = count($this->cachedOptionToCategories[$categoryName]) - 1;
+                       foreach ($this->cachedOptionToCategories[$categoryName] as $optionName) {
+                               if (!isset($this->options[$optionName]) || !$this->checkOption($this->options[$optionName])) continue;
+                               
+                               // get option object
+                               $option = $this->options[$optionName];
+                               
+                               // get form element html
+                               $html = $this->getFormElement($option->optionType, $option);
+                               
+                               // add option to list
+                               $children[] = array(
+                                       'object' => $option,
+                                       'html' => $html
+                               );
+                               
+                               $i++;
+                       }
+               }
+               
+               return $children;
+       }
+}
index f336d3feae6f9e840a7d5e2d8108e25d764d3e08..7dc5ac838f69599006ca5cbf226d1cecb2d0c381 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\cronjob\CronjobAction;\r
-use wcf\data\package\Package;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\WCF;\r
-use wcf\util\CronjobUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the cronjobs add form.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class CronjobAddForm extends ACPForm {\r
-       /**\r
-        * @see wcf\page\AbstractPage::$templateName\r
-        */\r
-       public $templateName = 'cronjobAdd';\r
-       \r
-       /**\r
-        * @see wcf\acp\form\ACPForm::$activeMenuItem\r
-        */\r
-       public $activeMenuItem = 'wcf.acp.menu.link.cronjobs.add';\r
-       \r
-       /**\r
-        * @see wcf\page\AbstractPage::$neededPermissions\r
-        */\r
-       public $neededPermissions = array('admin.system.cronjobs.canAddCronjob');\r
-       \r
-       /**\r
-        * cronjob class name\r
-        * @var string\r
-        */\r
-       public $className = '';\r
-       \r
-       /**\r
-        * cronjob package id\r
-        * @var integer\r
-        */\r
-       public $packageID = PACKAGE_ID;\r
-       \r
-       /**\r
-        * cronjob description\r
-        * @var string\r
-        */\r
-       public $description = '';\r
-       \r
-       /**\r
-        * execution time (min)\r
-        * @var string\r
-        */\r
-       public $startMinute = '*';\r
-       \r
-       /**\r
-        * execution time (hour)\r
-        * @var string\r
-        */\r
-       public $startHour = '*';\r
-       \r
-       /**\r
-        * execution time (day of month)\r
-        * @var string\r
-        */\r
-       public $startDom = '*';\r
-       \r
-       /**\r
-        * execution time (month)\r
-        * @var string\r
-        */\r
-       public $startMonth = '*';\r
-       \r
-       /**\r
-        * execution time (day of week)\r
-        * @var string\r
-        */\r
-       public $startDow = '*';\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['className'])) $this->className = StringUtil::trim($_POST['className']);\r
-               if (isset($_POST['description'])) $this->description = StringUtil::trim($_POST['description']);\r
-               if (isset($_POST['startMinute'])) $this->startMinute = StringUtil::replace(' ', '', $_POST['startMinute']);\r
-               if (isset($_POST['startHour'])) $this->startHour = StringUtil::replace(' ', '', $_POST['startHour']);\r
-               if (isset($_POST['startDom'])) $this->startDom = StringUtil::replace(' ', '', $_POST['startDom']);\r
-               if (isset($_POST['startMonth'])) $this->startMonth = StringUtil::replace(' ', '', $_POST['startMonth']);\r
-               if (isset($_POST['startDow'])) $this->startDow = StringUtil::replace(' ', '', $_POST['startDow']);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               parent::validate();\r
-               \r
-               // validate class name\r
-               if (empty($this->className)) {\r
-                       throw new UserInputException('className');\r
-               }\r
-               \r
-               if (!class_exists($this->className)) {\r
-                       throw new UserInputException('className', 'doesNotExist');\r
-               }\r
-               \r
-               try {\r
-                       CronjobUtil::validate($this->startMinute, $this->startHour, $this->startDom, $this->startMonth, $this->startDow);\r
-               } \r
-               catch (SystemException $e) {\r
-                       // extract field name\r
-                       $fieldName = '';\r
-                       if (preg_match("/cronjob attribute '(.*)'/", $e->getMessage(), $match)) {\r
-                               $fieldName = $match[1];\r
-                       }\r
-                       \r
-                       throw new UserInputException($fieldName, 'notValid');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               parent::save();\r
-               \r
-               // save cronjob\r
-               $data = array(\r
-                       'className' => $this->className,\r
-                       'packageID' => $this->packageID,\r
-                       'description' => $this->description,\r
-                       'startMinute' => $this->startMinute,\r
-                       'startHour' => $this->startHour,\r
-                       'startDom' => $this->startDom,\r
-                       'startMonth' => $this->startMonth,\r
-                       'startDow' => $this->startDow\r
-               );\r
-               \r
-               $cronjobAction = new CronjobAction(array(), 'create', array('data' => $data));\r
-               $cronjobAction->executeAction();\r
-               $this->saved();\r
-               \r
-               // reset values\r
-               $this->className = $this->description = '';\r
-               $this->startMinute = $this->startHour = $this->startDom = $this->startMonth = $this->startDow = '*';\r
-               \r
-               // show success.\r
-               WCF::getTPL()->assign(array(\r
-                       'success' => true\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'className' => $this->className,\r
-                       'description' => $this->description,\r
-                       'startMinute' => $this->startMinute,\r
-                       'startHour' => $this->startHour,\r
-                       'startDom' => $this->startDom,\r
-                       'startMonth' => $this->startMonth,\r
-                       'startDow' => $this->startDow,\r
-                       'action' => 'add'\r
-               ));\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\cronjob\CronjobAction;
+use wcf\data\package\Package;
+use wcf\system\exception\SystemException;
+use wcf\system\exception\UserInputException;
+use wcf\system\WCF;
+use wcf\util\CronjobUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the cronjobs add form.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class CronjobAddForm extends ACPForm {
+       /**
+        * @see wcf\page\AbstractPage::$templateName
+        */
+       public $templateName = 'cronjobAdd';
+       
+       /**
+        * @see wcf\acp\form\ACPForm::$activeMenuItem
+        */
+       public $activeMenuItem = 'wcf.acp.menu.link.cronjobs.add';
+       
+       /**
+        * @see wcf\page\AbstractPage::$neededPermissions
+        */
+       public $neededPermissions = array('admin.system.cronjobs.canAddCronjob');
+       
+       /**
+        * cronjob class name
+        * @var string
+        */
+       public $className = '';
+       
+       /**
+        * cronjob package id
+        * @var integer
+        */
+       public $packageID = PACKAGE_ID;
+       
+       /**
+        * cronjob description
+        * @var string
+        */
+       public $description = '';
+       
+       /**
+        * execution time (min)
+        * @var string
+        */
+       public $startMinute = '*';
+       
+       /**
+        * execution time (hour)
+        * @var string
+        */
+       public $startHour = '*';
+       
+       /**
+        * execution time (day of month)
+        * @var string
+        */
+       public $startDom = '*';
+       
+       /**
+        * execution time (month)
+        * @var string
+        */
+       public $startMonth = '*';
+       
+       /**
+        * execution time (day of week)
+        * @var string
+        */
+       public $startDow = '*';
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['className'])) $this->className = StringUtil::trim($_POST['className']);
+               if (isset($_POST['description'])) $this->description = StringUtil::trim($_POST['description']);
+               if (isset($_POST['startMinute'])) $this->startMinute = StringUtil::replace(' ', '', $_POST['startMinute']);
+               if (isset($_POST['startHour'])) $this->startHour = StringUtil::replace(' ', '', $_POST['startHour']);
+               if (isset($_POST['startDom'])) $this->startDom = StringUtil::replace(' ', '', $_POST['startDom']);
+               if (isset($_POST['startMonth'])) $this->startMonth = StringUtil::replace(' ', '', $_POST['startMonth']);
+               if (isset($_POST['startDow'])) $this->startDow = StringUtil::replace(' ', '', $_POST['startDow']);
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               parent::validate();
+               
+               // validate class name
+               if (empty($this->className)) {
+                       throw new UserInputException('className');
+               }
+               
+               if (!class_exists($this->className)) {
+                       throw new UserInputException('className', 'doesNotExist');
+               }
+               
+               try {
+                       CronjobUtil::validate($this->startMinute, $this->startHour, $this->startDom, $this->startMonth, $this->startDow);
+               } 
+               catch (SystemException $e) {
+                       // extract field name
+                       $fieldName = '';
+                       if (preg_match("/cronjob attribute '(.*)'/", $e->getMessage(), $match)) {
+                               $fieldName = $match[1];
+                       }
+                       
+                       throw new UserInputException($fieldName, 'notValid');
+               }
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               parent::save();
+               
+               // save cronjob
+               $data = array(
+                       'className' => $this->className,
+                       'packageID' => $this->packageID,
+                       'description' => $this->description,
+                       'startMinute' => $this->startMinute,
+                       'startHour' => $this->startHour,
+                       'startDom' => $this->startDom,
+                       'startMonth' => $this->startMonth,
+                       'startDow' => $this->startDow
+               );
+               
+               $cronjobAction = new CronjobAction(array(), 'create', array('data' => $data));
+               $cronjobAction->executeAction();
+               $this->saved();
+               
+               // reset values
+               $this->className = $this->description = '';
+               $this->startMinute = $this->startHour = $this->startDom = $this->startMonth = $this->startDow = '*';
+               
+               // show success.
+               WCF::getTPL()->assign(array(
+                       'success' => true
+               ));
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'className' => $this->className,
+                       'description' => $this->description,
+                       'startMinute' => $this->startMinute,
+                       'startHour' => $this->startHour,
+                       'startDom' => $this->startDom,
+                       'startMonth' => $this->startMonth,
+                       'startDow' => $this->startDow,
+                       'action' => 'add'
+               ));
+       }
+}
index bcca5511eedf7e298652a07853511658f12ad399..ce5de5f47716436a83e3916cbfef32997b4e36c4 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\cronjob\Cronjob;\r
-use wcf\data\cronjob\CronjobAction;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows the cronjobs edit form.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class CronjobEditForm extends CronjobAddForm {\r
-       /**\r
-        * @see wcf\acp\form\ACPForm::$activeMenuItem\r
-        */\r
-       public $activeMenuItem = 'wcf.acp.menu.link.cronjobs';\r
-       \r
-       /**\r
-        * @see wcf\page\AbstractPage::$neededPermissions\r
-        */\r
-       public $neededPermissions = array('admin.system.cronjobs.canEditCronjob');\r
-       \r
-       /**\r
-        * cronjob id\r
-        * \r
-        * @var integer\r
-        */\r
-       public $cronjobID = 0;\r
-       \r
-       /**\r
-        * cronjob object\r
-        *\r
-        * @var Cronjob\r
-        */\r
-       public $cronjob = null;\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_REQUEST['cronjobID'])) $this->cronjobID = intval($_REQUEST['cronjobID']);\r
-               $this->cronjob = new Cronjob($this->cronjobID);\r
-               if (!$cronjob->cronjobID) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-               \r
-               $this->packageID = $this->cronjob->packageID;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               ACPForm::save();\r
-               \r
-               // update cronjob\r
-               $data = array(\r
-                       'className' => $this->className,\r
-                       'description' => $this->description,\r
-                       'startMinute' => $this->startMinute,\r
-                       'startHour' => $this->startHour,\r
-                       'startDom' => $this->startDom,\r
-                       'startMonth' => $this->startMonth,\r
-                       'startDow' => $this->startDow\r
-               );\r
-               \r
-               $cronjobAction = new CronjobAction(array($this->cronjobID), 'update', array('data' => $data));\r
-               $cronjobAction->executeAction();\r
-               \r
-               $this->saved();\r
-               \r
-               // show success\r
-               WCF::getTPL()->assign(array(\r
-                       'success' => true\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               if (!count($_POST)) {\r
-                       $this->className = $this->cronjob->className;\r
-                       $this->description = $this->cronjob->description;\r
-                       $this->startMinute = $this->cronjob->startMinute;\r
-                       $this->startHour = $this->cronjob->startHour;\r
-                       $this->startDom = $this->cronjob->startDom;\r
-                       $this->startMonth = $this->cronjob->startMonth;\r
-                       $this->startDow = $this->cronjob->startDow;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'cronjobID' => $this->cronjobID,\r
-                       'action' => 'edit'\r
-               ));\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\cronjob\Cronjob;
+use wcf\data\cronjob\CronjobAction;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+
+/**
+ * Shows the cronjobs edit form.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class CronjobEditForm extends CronjobAddForm {
+       /**
+        * @see wcf\acp\form\ACPForm::$activeMenuItem
+        */
+       public $activeMenuItem = 'wcf.acp.menu.link.cronjobs';
+       
+       /**
+        * @see wcf\page\AbstractPage::$neededPermissions
+        */
+       public $neededPermissions = array('admin.system.cronjobs.canEditCronjob');
+       
+       /**
+        * cronjob id
+        * 
+        * @var integer
+        */
+       public $cronjobID = 0;
+       
+       /**
+        * cronjob object
+        *
+        * @var Cronjob
+        */
+       public $cronjob = null;
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_REQUEST['cronjobID'])) $this->cronjobID = intval($_REQUEST['cronjobID']);
+               $this->cronjob = new Cronjob($this->cronjobID);
+               if (!$cronjob->cronjobID) {
+                       throw new IllegalLinkException();
+               }
+               
+               $this->packageID = $this->cronjob->packageID;
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               ACPForm::save();
+               
+               // update cronjob
+               $data = array(
+                       'className' => $this->className,
+                       'description' => $this->description,
+                       'startMinute' => $this->startMinute,
+                       'startHour' => $this->startHour,
+                       'startDom' => $this->startDom,
+                       'startMonth' => $this->startMonth,
+                       'startDow' => $this->startDow
+               );
+               
+               $cronjobAction = new CronjobAction(array($this->cronjobID), 'update', array('data' => $data));
+               $cronjobAction->executeAction();
+               
+               $this->saved();
+               
+               // show success
+               WCF::getTPL()->assign(array(
+                       'success' => true
+               ));
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               if (!count($_POST)) {
+                       $this->className = $this->cronjob->className;
+                       $this->description = $this->cronjob->description;
+                       $this->startMinute = $this->cronjob->startMinute;
+                       $this->startHour = $this->cronjob->startHour;
+                       $this->startDom = $this->cronjob->startDom;
+                       $this->startMonth = $this->cronjob->startMonth;
+                       $this->startDow = $this->cronjob->startDow;
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'cronjobID' => $this->cronjobID,
+                       'action' => 'edit'
+               ));
+       }
+}
index ab6b983e565dd199499649b230d8be97bdc5b804..7eabecce4aad2ec7c88af486df0b0b53abca0a9a 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\User;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\auth\UserAuth;\r
-use wcf\system\exception\PermissionDeniedException;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\WCF;\r
-use wcf\util\HeaderUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the acp login form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class LoginForm extends AbstractForm {\r
-       /**\r
-        * @see wcf\page\AbstractPage::$templateName\r
-        */\r
-       public $templateName = 'login';\r
-       \r
-       /**\r
-        * given login username\r
-        * @var string\r
-        */\r
-       public $username = '';\r
-       \r
-       /**\r
-        * given login password\r
-        * @var string\r
-        */\r
-       public $password = '';\r
-       \r
-       /**\r
-        * user object\r
-        * @var User\r
-        */\r
-       public $user;\r
-       \r
-       /**\r
-        * given forward url\r
-        * @var string\r
-        */\r
-       public $url = null;\r
-       \r
-       /**\r
-        * Creates a new LoginForm object.\r
-        */\r
-       public function __construct() {\r
-               if (WCF::getUser()->userID) {\r
-                       throw new PermissionDeniedException();\r
-               }\r
-               \r
-               parent::__construct();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (!empty($_REQUEST['url'])) $this->url = $_REQUEST['url'];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);\r
-               if (isset($_POST['password'])) $this->password = $_POST['password'];\r
-       }\r
-       \r
-       /**\r
-        * Validates the user access data.\r
-        */\r
-       protected function validateUser() {\r
-               $this->user = UserAuth::getInstance()->loginManually($this->username, $this->password);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               parent::validate();\r
-               \r
-               // error handling\r
-               if (empty($this->username)) {\r
-                       throw new UserInputException('username');\r
-               }\r
-               \r
-               if (empty($this->password)) {\r
-                       throw new UserInputException('password');\r
-               }\r
-               \r
-               $this->validateUser();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               parent::save();\r
-               \r
-               // change user\r
-               WCF::getSession()->changeUser($this->user);\r
-               $this->saved();\r
-               \r
-               if (!empty($this->url)) {\r
-                       // append session\r
-                       if (StringUtil::indexOf($this->url, '?') !== false) $this->url .= SID_ARG_2ND_NOT_ENCODED;\r
-                       else $this->url .= SID_ARG_1ST;\r
-                       HeaderUtil::redirect($this->url);\r
-               }\r
-               else {\r
-                       HeaderUtil::redirect('index.php'.SID_ARG_1ST);\r
-               }\r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-\r
-               // get preferred username\r
-               if (!count($_POST)) {\r
-                       if (isset($_COOKIE[COOKIE_PREFIX.'userID'])) {\r
-                               $user = new User(intval($_COOKIE[COOKIE_PREFIX.'userID']));\r
-                               if ($user->userID) $this->username = $user->username;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'username' => $this->username,\r
-                       'password' => $this->password,\r
-                       'url' => $this->url\r
-               ));\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\User;
+use wcf\form\AbstractForm;
+use wcf\system\auth\UserAuth;
+use wcf\system\exception\PermissionDeniedException;
+use wcf\system\exception\UserInputException;
+use wcf\system\WCF;
+use wcf\util\HeaderUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the acp login form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class LoginForm extends AbstractForm {
+       /**
+        * @see wcf\page\AbstractPage::$templateName
+        */
+       public $templateName = 'login';
+       
+       /**
+        * given login username
+        * @var string
+        */
+       public $username = '';
+       
+       /**
+        * given login password
+        * @var string
+        */
+       public $password = '';
+       
+       /**
+        * user object
+        * @var User
+        */
+       public $user;
+       
+       /**
+        * given forward url
+        * @var string
+        */
+       public $url = null;
+       
+       /**
+        * Creates a new LoginForm object.
+        */
+       public function __construct() {
+               if (WCF::getUser()->userID) {
+                       throw new PermissionDeniedException();
+               }
+               
+               parent::__construct();
+       }
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (!empty($_REQUEST['url'])) $this->url = $_REQUEST['url'];
+       }
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);
+               if (isset($_POST['password'])) $this->password = $_POST['password'];
+       }
+       
+       /**
+        * Validates the user access data.
+        */
+       protected function validateUser() {
+               $this->user = UserAuth::getInstance()->loginManually($this->username, $this->password);
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               parent::validate();
+               
+               // error handling
+               if (empty($this->username)) {
+                       throw new UserInputException('username');
+               }
+               
+               if (empty($this->password)) {
+                       throw new UserInputException('password');
+               }
+               
+               $this->validateUser();
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               parent::save();
+               
+               // change user
+               WCF::getSession()->changeUser($this->user);
+               $this->saved();
+               
+               if (!empty($this->url)) {
+                       // append session
+                       if (StringUtil::indexOf($this->url, '?') !== false) $this->url .= SID_ARG_2ND_NOT_ENCODED;
+                       else $this->url .= SID_ARG_1ST;
+                       HeaderUtil::redirect($this->url);
+               }
+               else {
+                       HeaderUtil::redirect('index.php'.SID_ARG_1ST);
+               }
+               exit;
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+
+               // get preferred username
+               if (!count($_POST)) {
+                       if (isset($_COOKIE[COOKIE_PREFIX.'userID'])) {
+                               $user = new User(intval($_COOKIE[COOKIE_PREFIX.'userID']));
+                               if ($user->userID) $this->username = $user->username;
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'username' => $this->username,
+                       'password' => $this->password,
+                       'url' => $this->url
+               ));
+       }
+}
index d2ba120aa3f4c7e04e3545a16f88e5866121de50..80ca744b20fcdcadc517d71c40b11368abd349a4 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\option\category\OptionCategory;\r
-use wcf\data\option\OptionAction;\r
-use wcf\data\option\Option;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-\r
-/**\r
- * Shows the option edit form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class OptionForm extends AbstractOptionListForm {\r
-       /**\r
-        * @see wcf\page\AbstractPage::$templateName;\r
-        */\r
-       public $templateName = 'option';\r
-       \r
-       /**\r
-        * category option\r
-        * @var OptionCategory\r
-        */\r
-       public $category = null;\r
-       \r
-       /**\r
-        * category id\r
-        * @var integer\r
-        */\r
-       public $categoryID = 0;\r
-       \r
-       /**\r
-        * active tab menu item name\r
-        * @var string\r
-        */\r
-       public $activeTabMenuItem = '';\r
-       \r
-       /**\r
-        * the option tree\r
-        * @var array\r
-        */\r
-       public $optionTree = array();\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_REQUEST['categoryID'])) $this->categoryID = intval($_REQUEST['categoryID']);\r
-               $this->category = new OptionCategory($this->categoryID);\r
-               if (!isset($this->category->categoryID)) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-               $this->categoryName = $this->category->categoryName;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['activeTabMenuItem'])) $this->activeTabMenuItem = $_POST['activeTabMenuItem'];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               parent::save();\r
-               \r
-               // save options\r
-               $saveOptions = array();\r
-               foreach ($this->options as $option) {\r
-                       $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
-               }\r
-               $optionAction = new OptionAction(array(), 'updateAll', array('data' => $saveOptions));\r
-               $optionAction->executeAction();\r
-               $this->saved();\r
-               \r
-               // show succes message\r
-               WCF::getTPL()->assign('success', true);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               if (!count($_POST)) {\r
-                       // get option values\r
-                       foreach ($this->options as $option) {\r
-                               $this->optionValues[$option->optionName] = $option->optionValue;\r
-                       }\r
-               }\r
-               $this->optionTree = $this->getOptionTree($this->category->categoryName);\r
-               if (!count($_POST)) {\r
-                       $this->activeTabMenuItem = $this->optionTree[0]['object']->categoryName;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'category' => $this->category,\r
-                       'optionTree' => $this->optionTree,\r
-                       'activeTabMenuItem' => $this->activeTabMenuItem\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::show()\r
-        */\r
-       public function show() {\r
-               // set active menu item\r
-               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.option.category.'.$this->category->categoryName);\r
-               \r
-               // check permission\r
-               WCF::getSession()->checkPermission(array('admin.system.canEditOption'));\r
-\r
-               if ($this->category->categoryName == 'module') {\r
-                       // check master password\r
-                       WCFACP::checkMasterPassword();\r
-               }\r
-               \r
-               // get options and categories from cache\r
-               $this->readCache();\r
-               \r
-               // show form\r
-               parent::show();\r
-       }\r
-       \r
-       /**\r
-        * @see AbstractOptionListForm::checkOption()\r
-        */\r
-       protected static function checkOption(Option $option) {\r
-               if (!parent::checkOption($option)) return false;\r
-               return ($option->hidden != 1);\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\option\category\OptionCategory;
+use wcf\data\option\OptionAction;
+use wcf\data\option\Option;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+
+/**
+ * Shows the option edit form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class OptionForm extends AbstractOptionListForm {
+       /**
+        * @see wcf\page\AbstractPage::$templateName;
+        */
+       public $templateName = 'option';
+       
+       /**
+        * category option
+        * @var OptionCategory
+        */
+       public $category = null;
+       
+       /**
+        * category id
+        * @var integer
+        */
+       public $categoryID = 0;
+       
+       /**
+        * active tab menu item name
+        * @var string
+        */
+       public $activeTabMenuItem = '';
+       
+       /**
+        * the option tree
+        * @var array
+        */
+       public $optionTree = array();
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_REQUEST['categoryID'])) $this->categoryID = intval($_REQUEST['categoryID']);
+               $this->category = new OptionCategory($this->categoryID);
+               if (!isset($this->category->categoryID)) {
+                       throw new IllegalLinkException();
+               }
+               $this->categoryName = $this->category->categoryName;
+       }
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['activeTabMenuItem'])) $this->activeTabMenuItem = $_POST['activeTabMenuItem'];
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               parent::save();
+               
+               // save options
+               $saveOptions = array();
+               foreach ($this->options as $option) {
+                       $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+               }
+               $optionAction = new OptionAction(array(), 'updateAll', array('data' => $saveOptions));
+               $optionAction->executeAction();
+               $this->saved();
+               
+               // show succes message
+               WCF::getTPL()->assign('success', true);
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               if (!count($_POST)) {
+                       // get option values
+                       foreach ($this->options as $option) {
+                               $this->optionValues[$option->optionName] = $option->optionValue;
+                       }
+               }
+               $this->optionTree = $this->getOptionTree($this->category->categoryName);
+               if (!count($_POST)) {
+                       $this->activeTabMenuItem = $this->optionTree[0]['object']->categoryName;
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'category' => $this->category,
+                       'optionTree' => $this->optionTree,
+                       'activeTabMenuItem' => $this->activeTabMenuItem
+               ));
+       }
+       
+       /**
+        * @see wcf\form\IForm::show()
+        */
+       public function show() {
+               // set active menu item
+               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.option.category.'.$this->category->categoryName);
+               
+               // check permission
+               WCF::getSession()->checkPermission(array('admin.system.canEditOption'));
+
+               if ($this->category->categoryName == 'module') {
+                       // check master password
+                       WCFACP::checkMasterPassword();
+               }
+               
+               // get options and categories from cache
+               $this->readCache();
+               
+               // show form
+               parent::show();
+       }
+       
+       /**
+        * @see AbstractOptionListForm::checkOption()
+        */
+       protected static function checkOption(Option $option) {
+               if (!parent::checkOption($option)) return false;
+               return ($option->hidden != 1);
+       }
+}
index c84684e8bc77b9512bab37f23224dbf0e48705a9..13ddfe9bf2605d2035524787fa0e19cbdff6fcaa 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\package\Package;\r
-use wcf\data\package\installation\queue\PackageInstallationQueue;\r
-use wcf\data\package\installation\queue\PackageInstallationQueueEditor;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\package\PackageArchive;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\util\FileUtil;\r
-use wcf\util\HeaderUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the package install and update form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class PackageStartInstallForm extends ACPForm {\r
-       public $templateName = 'packageStartInstall';\r
-       public $activeMenuItem = 'wcf.acp.menu.link.package.install';\r
-               \r
-       public $packageID = 0;\r
-       public $package = null;\r
-       public $downloadPackage = '';\r
-       public $uploadPackage = '';\r
-       public $archive = null;\r
-       public $queue = null;\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_REQUEST['activePackageID'])) {\r
-                       $this->packageID = intval($_REQUEST['activePackageID']);\r
-                       if ($this->packageID != 0) {\r
-                               try {\r
-                                       $this->package = new Package($this->packageID);\r
-                               }\r
-                               catch (SystemException $e) {\r
-                                       throw new IllegalLinkException();\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['downloadPackage'])) $this->downloadPackage = StringUtil::trim($_POST['downloadPackage']);\r
-               if (isset($_FILES['uploadPackage'])) $this->uploadPackage = $_FILES['uploadPackage'];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               parent::validate();\r
-               \r
-               if (!empty($this->uploadPackage['name'])) {\r
-                       $this->validateUploadPackage();\r
-               }\r
-               else if (!empty($this->downloadPackage)) {\r
-                       $this->validateDownloadPackage();\r
-               }\r
-               else {\r
-                       throw new UserInputException('uploadPackage');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Validates the upload package input.\r
-        */\r
-       protected function validateUploadPackage() {\r
-               if (empty($this->uploadPackage['tmp_name'])) {\r
-                       throw new UserInputException('uploadPackage', 'uploadFailed');\r
-               }\r
-               \r
-               // get filename\r
-               $this->uploadPackage['name'] = FileUtil::getTemporaryFilename('package_', preg_replace('!^.*(?=\.(?:tar\.gz|tgz|tar)$)!i', '', basename($this->uploadPackage['name'])));\r
-               \r
-               if (!@move_uploaded_file($this->uploadPackage['tmp_name'], $this->uploadPackage['name'])) {\r
-                       throw new UserInputException('uploadPackage', 'uploadFailed');\r
-               }\r
-               \r
-               $this->archive = new PackageArchive($this->uploadPackage['name'], $this->package);\r
-               $this->validateArchive('uploadPackage');\r
-       }\r
-       \r
-       /**\r
-        * Validates the download package input.\r
-        */\r
-       protected function validateDownloadPackage() {\r
-               if (FileUtil::isURL($this->downloadPackage)) {\r
-                       // download package\r
-                       $this->archive = new PackageArchive($this->downloadPackage, $this->package);\r
-                       \r
-                       try {\r
-                               $this->downloadPackage = $this->archive->downloadArchive();\r
-                               //$this->archive->downloadArchive();\r
-                       }\r
-                       catch (SystemException $e) {\r
-                               throw new UserInputException('downloadPackage', 'notFound');\r
-                       }\r
-               }\r
-               else {\r
-                       // probably local path\r
-                       if (!file_exists($this->downloadPackage)) {\r
-                               throw new UserInputException('downloadPackage', 'notFound');\r
-                       }\r
-                       \r
-                       $this->archive = new PackageArchive($this->downloadPackage, $this->package);\r
-               }\r
-               \r
-               $this->validateArchive('downloadPackage');\r
-       }\r
-       \r
-       /**\r
-        * Validates the package archive.\r
-        *\r
-        * @param       string          $type           upload or download package\r
-        */\r
-       protected function validateArchive($type) {\r
-               // try to open the archive\r
-               try {\r
-                       // TODO: Exceptions thrown within openArchive() are discarded, resulting in\r
-                       // the meaningless message 'not a valid package'\r
-                       $this->archive->openArchive();\r
-               }\r
-               catch (SystemException $e) {\r
-                       throw new UserInputException($type, 'noValidPackage');\r
-               }\r
-               \r
-               // validate php requirements\r
-               $errors = PackageInstallationDispatcher::validatePHPRequirements($this->archive->getPhpRequirements());\r
-               if (count($errors)) {\r
-                       WCF::getTPL()->assign('phpRequirements', $errors);\r
-                       throw new UserInputException($type, 'phpRequirements');\r
-               }\r
-               \r
-               // check update or install support\r
-               if ($this->package !== null) {\r
-                       if (!$this->archive->isValidUpdate()) {\r
-                               throw new UserInputException($type, 'noValidUpdate');\r
-                       }\r
-               }\r
-               else {\r
-                       if (!$this->archive->isValidInstall()) {\r
-                               throw new UserInputException($type, 'noValidInstall');\r
-                       }\r
-                       elseif ($this->archive->isAlreadyInstalled()) {\r
-                               throw new UserInputException($type, 'uniqueAlreadyInstalled');\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               parent::save();\r
-               \r
-               // get new process no\r
-               $processNo = PackageInstallationQueue::getNewProcessNo();\r
-               \r
-               // obey foreign key\r
-               $packageID = ($this->packageID) ? $this->packageID : null;\r
-               \r
-               // insert queue\r
-               $this->queue = PackageInstallationQueueEditor::create(array(\r
-                       'processNo' => $processNo,\r
-                       'userID' => WCF::getUser()->userID,\r
-                       'package' => $this->archive->getPackageInfo('name'),\r
-                       'packageName' => $this->archive->getPackageInfo('packageName'),\r
-                       'packageID' => $packageID,\r
-                       'archive' => (!empty($this->uploadPackage['tmp_name']) ? $this->uploadPackage['name'] : $this->downloadPackage),\r
-                       'action' => ($this->package != null ? 'update' : 'install'),\r
-                       'confirmInstallation' => 1,\r
-                       'cancelable' => ($this->package != null ? 0 : 1)\r
-               ));\r
-               \r
-               $this->saved();\r
-               \r
-               // open queue\r
-               HeaderUtil::redirect('index.php?page=Package&action=openQueue&processNo='.$processNo.''.SID_ARG_2ND_NOT_ENCODED);\r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'packageID' => $this->packageID,\r
-                       'package' => $this->package\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               if ($this->action == 'install') WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));\r
-               else WCF::getSession()->checkPermission(array('admin.system.package.canUpdatePackage'));\r
-               \r
-               // check master password\r
-               WCFACP::checkMasterPassword();\r
-               \r
-               parent::show();\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\package\Package;
+use wcf\data\package\installation\queue\PackageInstallationQueue;
+use wcf\data\package\installation\queue\PackageInstallationQueueEditor;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\SystemException;
+use wcf\system\exception\UserInputException;
+use wcf\system\package\PackageArchive;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\util\FileUtil;
+use wcf\util\HeaderUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the package install and update form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class PackageStartInstallForm extends ACPForm {
+       public $templateName = 'packageStartInstall';
+       public $activeMenuItem = 'wcf.acp.menu.link.package.install';
+               
+       public $packageID = 0;
+       public $package = null;
+       public $downloadPackage = '';
+       public $uploadPackage = '';
+       public $archive = null;
+       public $queue = null;
+       
+       /**
+        * @see wcf\form\IForm::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_REQUEST['activePackageID'])) {
+                       $this->packageID = intval($_REQUEST['activePackageID']);
+                       if ($this->packageID != 0) {
+                               try {
+                                       $this->package = new Package($this->packageID);
+                               }
+                               catch (SystemException $e) {
+                                       throw new IllegalLinkException();
+                               }
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['downloadPackage'])) $this->downloadPackage = StringUtil::trim($_POST['downloadPackage']);
+               if (isset($_FILES['uploadPackage'])) $this->uploadPackage = $_FILES['uploadPackage'];
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               parent::validate();
+               
+               if (!empty($this->uploadPackage['name'])) {
+                       $this->validateUploadPackage();
+               }
+               else if (!empty($this->downloadPackage)) {
+                       $this->validateDownloadPackage();
+               }
+               else {
+                       throw new UserInputException('uploadPackage');
+               }
+       }
+       
+       /**
+        * Validates the upload package input.
+        */
+       protected function validateUploadPackage() {
+               if (empty($this->uploadPackage['tmp_name'])) {
+                       throw new UserInputException('uploadPackage', 'uploadFailed');
+               }
+               
+               // get filename
+               $this->uploadPackage['name'] = FileUtil::getTemporaryFilename('package_', preg_replace('!^.*(?=\.(?:tar\.gz|tgz|tar)$)!i', '', basename($this->uploadPackage['name'])));
+               
+               if (!@move_uploaded_file($this->uploadPackage['tmp_name'], $this->uploadPackage['name'])) {
+                       throw new UserInputException('uploadPackage', 'uploadFailed');
+               }
+               
+               $this->archive = new PackageArchive($this->uploadPackage['name'], $this->package);
+               $this->validateArchive('uploadPackage');
+       }
+       
+       /**
+        * Validates the download package input.
+        */
+       protected function validateDownloadPackage() {
+               if (FileUtil::isURL($this->downloadPackage)) {
+                       // download package
+                       $this->archive = new PackageArchive($this->downloadPackage, $this->package);
+                       
+                       try {
+                               $this->downloadPackage = $this->archive->downloadArchive();
+                               //$this->archive->downloadArchive();
+                       }
+                       catch (SystemException $e) {
+                               throw new UserInputException('downloadPackage', 'notFound');
+                       }
+               }
+               else {
+                       // probably local path
+                       if (!file_exists($this->downloadPackage)) {
+                               throw new UserInputException('downloadPackage', 'notFound');
+                       }
+                       
+                       $this->archive = new PackageArchive($this->downloadPackage, $this->package);
+               }
+               
+               $this->validateArchive('downloadPackage');
+       }
+       
+       /**
+        * Validates the package archive.
+        *
+        * @param       string          $type           upload or download package
+        */
+       protected function validateArchive($type) {
+               // try to open the archive
+               try {
+                       // TODO: Exceptions thrown within openArchive() are discarded, resulting in
+                       // the meaningless message 'not a valid package'
+                       $this->archive->openArchive();
+               }
+               catch (SystemException $e) {
+                       throw new UserInputException($type, 'noValidPackage');
+               }
+               
+               // validate php requirements
+               $errors = PackageInstallationDispatcher::validatePHPRequirements($this->archive->getPhpRequirements());
+               if (count($errors)) {
+                       WCF::getTPL()->assign('phpRequirements', $errors);
+                       throw new UserInputException($type, 'phpRequirements');
+               }
+               
+               // check update or install support
+               if ($this->package !== null) {
+                       if (!$this->archive->isValidUpdate()) {
+                               throw new UserInputException($type, 'noValidUpdate');
+                       }
+               }
+               else {
+                       if (!$this->archive->isValidInstall()) {
+                               throw new UserInputException($type, 'noValidInstall');
+                       }
+                       elseif ($this->archive->isAlreadyInstalled()) {
+                               throw new UserInputException($type, 'uniqueAlreadyInstalled');
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               parent::save();
+               
+               // get new process no
+               $processNo = PackageInstallationQueue::getNewProcessNo();
+               
+               // obey foreign key
+               $packageID = ($this->packageID) ? $this->packageID : null;
+               
+               // insert queue
+               $this->queue = PackageInstallationQueueEditor::create(array(
+                       'processNo' => $processNo,
+                       'userID' => WCF::getUser()->userID,
+                       'package' => $this->archive->getPackageInfo('name'),
+                       'packageName' => $this->archive->getPackageInfo('packageName'),
+                       'packageID' => $packageID,
+                       'archive' => (!empty($this->uploadPackage['tmp_name']) ? $this->uploadPackage['name'] : $this->downloadPackage),
+                       'action' => ($this->package != null ? 'update' : 'install'),
+                       'confirmInstallation' => 1,
+                       'cancelable' => ($this->package != null ? 0 : 1)
+               ));
+               
+               $this->saved();
+               
+               // open queue
+               HeaderUtil::redirect('index.php?page=Package&action=openQueue&processNo='.$processNo.''.SID_ARG_2ND_NOT_ENCODED);
+               exit;
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'packageID' => $this->packageID,
+                       'package' => $this->package
+               ));
+       }
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               if ($this->action == 'install') WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));
+               else WCF::getSession()->checkPermission(array('admin.system.package.canUpdatePackage'));
+               
+               // check master password
+               WCFACP::checkMasterPassword();
+               
+               parent::show();
+       }
+}
index 28ddabce7f26c9be2100971d530206f48f99686d..f8a824baa35d6d59c51bea2aec51b28ff6df4f80 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\option\Option;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\UserAction;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\language\LanguageFactory;\r
-use wcf\system\WCF;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\StringUtil;\r
-use wcf\util\UserUtil;\r
-\r
-/**\r
- * Shows the user add form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class UserAddForm extends UserOptionListForm {\r
-       /**\r
-        * @see wcf\page\AbstractPage::$templateName\r
-        */\r
-       public $templateName = 'userAdd';\r
-       \r
-       /**\r
-        * @see wcf\page\AbstractPage::$neededPermissions\r
-        */\r
-       public $neededPermissions = array('admin.user.canAddUser');\r
-       \r
-       /**\r
-        * name of the active menu item\r
-        * @var string\r
-        */\r
-       public $menuItemName = 'wcf.acp.menu.link.user.add';\r
-       \r
-       /**\r
-        * username\r
-        * @var string\r
-        */\r
-       public $username = '';\r
-       \r
-       /**\r
-        * email address\r
-        * @var string\r
-        */\r
-       public $email = '';\r
-       \r
-       /**\r
-        * confirmed email address\r
-        * @var string\r
-        */\r
-       public $confirmEmail = '';\r
-       \r
-       /**\r
-        * user password\r
-        * @var string\r
-        */\r
-       public $password = '';\r
-       \r
-       /**\r
-        * confirmed user password\r
-        * @var string\r
-        */\r
-       public $confirmPassword = '';\r
-       \r
-       /**\r
-        * user group ids\r
-        * @var array<integer>\r
-        */\r
-       public $groupIDs = array();\r
-       \r
-       /**\r
-        * language id\r
-        * @var integer\r
-        */\r
-       public $languageID = 0;\r
-       \r
-       /**\r
-        * visible languages\r
-        * @var array<integer>\r
-        */\r
-       public $visibleLanguages = array();\r
-       \r
-       /**\r
-        * additional fields\r
-        * @var array<mixed>\r
-        */\r
-       public $additionalFields = array();\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']); \r
-               if (isset($_POST['email'])) $this->email = StringUtil::trim($_POST['email']);\r
-               if (isset($_POST['confirmEmail'])) $this->confirmEmail = StringUtil::trim($_POST['confirmEmail']);\r
-               if (isset($_POST['password'])) $this->password = $_POST['password'];\r
-               if (isset($_POST['confirmPassword'])) $this->confirmPassword = $_POST['confirmPassword'];\r
-               if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);\r
-               if (isset($_POST['visibleLanguages']) && is_array($_POST['visibleLanguages'])) $this->visibleLanguages = ArrayUtil::toIntegerArray($_POST['visibleLanguages']);\r
-               if (isset($_POST['languageID'])) $this->languageID = intval($_POST['languageID']);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               // validate static user options \r
-               try {\r
-                       $this->validateUsername($this->username); \r
-               }\r
-               catch (UserInputException $e) {\r
-                       $this->errorType[$e->getField()] = $e->getType();\r
-               }\r
-               \r
-               try {\r
-                       $this->validateEmail($this->email, $this->confirmEmail); \r
-               }\r
-               catch (UserInputException $e) {\r
-                       $this->errorType[$e->getField()] = $e->getType();\r
-               }\r
-               \r
-               try {\r
-                       $this->validatePassword($this->password, $this->confirmPassword);\r
-               }\r
-               catch (UserInputException $e) {\r
-                       $this->errorType[$e->getField()] = $e->getType();\r
-               }\r
-               \r
-               // validate user groups\r
-               if (count($this->groupIDs) > 0) {\r
-                       $conditions = new PreparedStatementConditionBuilder();\r
-                       $conditions->add("groupID IN (?)", array($this->groupIDs));\r
-                       $conditions->add("groupType NOT IN (?)", array(array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS)));\r
-                       \r
-                       $sql = "SELECT  groupID\r
-                               FROM    wcf".WCF_N."_user_group\r
-                               ".$conditions;\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute($conditions->getParameters());\r
-                       $this->groupIDs = array();\r
-                       while ($row = $statement->fetchArray()) {\r
-                               if (UserGroup::isAccessibleGroup(array($row['groupID']))) {\r
-                                       $this->groupIDs[] = $row['groupID'];\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               // validate user language\r
-               $language = LanguageFactory::getLanguage($this->languageID);\r
-               if (!$language->languageID) {\r
-                       // use default language\r
-                       $this->languageID = LanguageFactory::getDefaultLanguageID();\r
-               }\r
-               \r
-               // validate visible languages\r
-               foreach ($this->visibleLanguages as $key => $visibleLanguage) {\r
-                       $language = LanguageFactory::getLanguage($visibleLanguage);\r
-                       if (!$language->languageID || !$language->hasContent) {\r
-                               unset($this->visibleLanguages[$key]);\r
-                       }\r
-               }\r
-               if (!count($this->visibleLanguages) && ($language = LanguageFactory::getLanguage($this->languageID)) && $language->hasContent) {\r
-                       $this->visibleLanguages[] = $this->languageID;\r
-               }\r
-               \r
-               // validate dynamic options\r
-               parent::validate();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               AbstractForm::save();\r
-               \r
-               // create\r
-               $saveOptions = array();\r
-               foreach ($this->options as $option) {\r
-                       $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
-               }\r
-               $this->additionalFields['languageID'] = $this->languageID;\r
-               $data = array(\r
-                       'data' => array_merge($this->additionalFields, array(\r
-                               'username' => $this->username,\r
-                               'email' => $this->email,\r
-                               'password' => $this->password,\r
-                       )),\r
-                       'groups' => $this->groupIDs,\r
-                       'languages' => $this->visibleLanguages,\r
-                       'options' => $saveOptions\r
-               );\r
-               $userAction = new UserAction(array(), 'create', $data);\r
-               $userAction->executeAction();\r
-               $this->saved();\r
-               \r
-               // show empty add form\r
-               WCF::getTPL()->assign(array(\r
-                       'success' => true\r
-               ));\r
-               \r
-               // reset values\r
-               $this->username = $this->email = $this->confirmEmail = $this->password = $this->confirmPassword = '';\r
-               $this->groupIDs = array();\r
-               $this->languageID = $this->getDefaultFormLanguageID();\r
-               $this->optionValues = array();\r
-       }\r
-       \r
-       /**\r
-        * Throws a UserInputException if the username is not unique or not valid.\r
-        * \r
-        * @param       string          $username\r
-        */\r
-       protected function validateUsername($username) {\r
-               if (empty($username)) {\r
-                       throw new UserInputException('username');\r
-               }\r
-               \r
-               // check for forbidden chars (e.g. the ",")\r
-               if (!UserUtil::isValidUsername($username)) {\r
-                       throw new UserInputException('username', 'notValid');\r
-               }\r
-               \r
-               // Check if username exists already.\r
-               if (!UserUtil::isAvailableUsername($username)) {\r
-                       throw new UserInputException('username', 'notUnique');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Throws a UserInputException if the email is not unique or not valid.\r
-        * \r
-        * @param       string          $email\r
-        * @param       string          $confirmEmail\r
-        */\r
-       protected function validateEmail($email, $confirmEmail) {\r
-               if (empty($email)) {    \r
-                       throw new UserInputException('email');\r
-               }\r
-               \r
-               // check for valid email (one @ etc.)\r
-               if (!UserUtil::isValidEmail($email)) {\r
-                       throw new UserInputException('email', 'notValid');\r
-               }\r
-               \r
-               // Check if email exists already.\r
-               if (!UserUtil::isAvailableEmail($email)) {\r
-                       throw new UserInputException('email', 'notUnique');\r
-               }\r
-               \r
-               // check confirm input\r
-               if (StringUtil::toLowerCase($email) != StringUtil::toLowerCase($confirmEmail)) {\r
-                       throw new UserInputException('confirmEmail', 'notEqual');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Throws a UserInputException if the password is not valid.\r
-        * \r
-        * @param       string          $password\r
-        * @param       string          $confirmPassword\r
-        */\r
-       protected function validatePassword($password, $confirmPassword) {\r
-               if (empty($password)) {\r
-                       throw new UserInputException('password');\r
-               }\r
-               \r
-               // check confirm input\r
-               if ($password != $confirmPassword) {\r
-                       throw new UserInputException('confirmPassword', 'notEqual');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               $this->optionTree = $this->getOptionTree();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'username' => $this->username,\r
-                       'email' => $this->email,\r
-                       'confirmEmail' => $this->confirmEmail,\r
-                       'password' => $this->password,\r
-                       'confirmPassword' => $this->confirmPassword,\r
-                       'groupIDs' => $this->groupIDs,\r
-                       'optionTree' => $this->optionTree,\r
-                       'availableGroups' => $this->getAvailableGroups(),\r
-                       'availableLanguages' => $this->getAvailableLanguages(),\r
-                       'languageID' => $this->languageID,\r
-                       'visibleLanguages' => $this->visibleLanguages,\r
-                       'availableContentLanguages' => $this->getAvailableContentLanguages(),\r
-                       'action' => 'add'\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               // set active menu item\r
-               ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);\r
-               \r
-               // get the default langauge id\r
-               $this->languageID = $this->getDefaultFormLanguageID();\r
-               \r
-               // get user options and categories from cache\r
-               $this->readCache();\r
-               \r
-               // show form\r
-               parent::show();\r
-       }\r
-       \r
-       /**\r
-        * @see AbstractOptionListForm::checkOption()\r
-        */\r
-       protected static function checkOption(Option $option) {\r
-               if (!parent::checkOption($option)) return false;\r
-               \r
-               return ($option->editable != 1 && $option->editable != 4 && !$option->disabled);\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\option\Option;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\UserAction;
+use wcf\form\AbstractForm;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\UserInputException;
+use wcf\system\language\LanguageFactory;
+use wcf\system\WCF;
+use wcf\util\ArrayUtil;
+use wcf\util\StringUtil;
+use wcf\util\UserUtil;
+
+/**
+ * Shows the user add form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class UserAddForm extends UserOptionListForm {
+       /**
+        * @see wcf\page\AbstractPage::$templateName
+        */
+       public $templateName = 'userAdd';
+       
+       /**
+        * @see wcf\page\AbstractPage::$neededPermissions
+        */
+       public $neededPermissions = array('admin.user.canAddUser');
+       
+       /**
+        * name of the active menu item
+        * @var string
+        */
+       public $menuItemName = 'wcf.acp.menu.link.user.add';
+       
+       /**
+        * username
+        * @var string
+        */
+       public $username = '';
+       
+       /**
+        * email address
+        * @var string
+        */
+       public $email = '';
+       
+       /**
+        * confirmed email address
+        * @var string
+        */
+       public $confirmEmail = '';
+       
+       /**
+        * user password
+        * @var string
+        */
+       public $password = '';
+       
+       /**
+        * confirmed user password
+        * @var string
+        */
+       public $confirmPassword = '';
+       
+       /**
+        * user group ids
+        * @var array<integer>
+        */
+       public $groupIDs = array();
+       
+       /**
+        * language id
+        * @var integer
+        */
+       public $languageID = 0;
+       
+       /**
+        * visible languages
+        * @var array<integer>
+        */
+       public $visibleLanguages = array();
+       
+       /**
+        * additional fields
+        * @var array<mixed>
+        */
+       public $additionalFields = array();
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']); 
+               if (isset($_POST['email'])) $this->email = StringUtil::trim($_POST['email']);
+               if (isset($_POST['confirmEmail'])) $this->confirmEmail = StringUtil::trim($_POST['confirmEmail']);
+               if (isset($_POST['password'])) $this->password = $_POST['password'];
+               if (isset($_POST['confirmPassword'])) $this->confirmPassword = $_POST['confirmPassword'];
+               if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);
+               if (isset($_POST['visibleLanguages']) && is_array($_POST['visibleLanguages'])) $this->visibleLanguages = ArrayUtil::toIntegerArray($_POST['visibleLanguages']);
+               if (isset($_POST['languageID'])) $this->languageID = intval($_POST['languageID']);
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               // validate static user options 
+               try {
+                       $this->validateUsername($this->username); 
+               }
+               catch (UserInputException $e) {
+                       $this->errorType[$e->getField()] = $e->getType();
+               }
+               
+               try {
+                       $this->validateEmail($this->email, $this->confirmEmail); 
+               }
+               catch (UserInputException $e) {
+                       $this->errorType[$e->getField()] = $e->getType();
+               }
+               
+               try {
+                       $this->validatePassword($this->password, $this->confirmPassword);
+               }
+               catch (UserInputException $e) {
+                       $this->errorType[$e->getField()] = $e->getType();
+               }
+               
+               // validate user groups
+               if (count($this->groupIDs) > 0) {
+                       $conditions = new PreparedStatementConditionBuilder();
+                       $conditions->add("groupID IN (?)", array($this->groupIDs));
+                       $conditions->add("groupType NOT IN (?)", array(array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS)));
+                       
+                       $sql = "SELECT  groupID
+                               FROM    wcf".WCF_N."_user_group
+                               ".$conditions;
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditions->getParameters());
+                       $this->groupIDs = array();
+                       while ($row = $statement->fetchArray()) {
+                               if (UserGroup::isAccessibleGroup(array($row['groupID']))) {
+                                       $this->groupIDs[] = $row['groupID'];
+                               }
+                       }
+               }
+               
+               // validate user language
+               $language = LanguageFactory::getLanguage($this->languageID);
+               if (!$language->languageID) {
+                       // use default language
+                       $this->languageID = LanguageFactory::getDefaultLanguageID();
+               }
+               
+               // validate visible languages
+               foreach ($this->visibleLanguages as $key => $visibleLanguage) {
+                       $language = LanguageFactory::getLanguage($visibleLanguage);
+                       if (!$language->languageID || !$language->hasContent) {
+                               unset($this->visibleLanguages[$key]);
+                       }
+               }
+               if (!count($this->visibleLanguages) && ($language = LanguageFactory::getLanguage($this->languageID)) && $language->hasContent) {
+                       $this->visibleLanguages[] = $this->languageID;
+               }
+               
+               // validate dynamic options
+               parent::validate();
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               AbstractForm::save();
+               
+               // create
+               $saveOptions = array();
+               foreach ($this->options as $option) {
+                       $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+               }
+               $this->additionalFields['languageID'] = $this->languageID;
+               $data = array(
+                       'data' => array_merge($this->additionalFields, array(
+                               'username' => $this->username,
+                               'email' => $this->email,
+                               'password' => $this->password,
+                       )),
+                       'groups' => $this->groupIDs,
+                       'languages' => $this->visibleLanguages,
+                       'options' => $saveOptions
+               );
+               $userAction = new UserAction(array(), 'create', $data);
+               $userAction->executeAction();
+               $this->saved();
+               
+               // show empty add form
+               WCF::getTPL()->assign(array(
+                       'success' => true
+               ));
+               
+               // reset values
+               $this->username = $this->email = $this->confirmEmail = $this->password = $this->confirmPassword = '';
+               $this->groupIDs = array();
+               $this->languageID = $this->getDefaultFormLanguageID();
+               $this->optionValues = array();
+       }
+       
+       /**
+        * Throws a UserInputException if the username is not unique or not valid.
+        * 
+        * @param       string          $username
+        */
+       protected function validateUsername($username) {
+               if (empty($username)) {
+                       throw new UserInputException('username');
+               }
+               
+               // check for forbidden chars (e.g. the ",")
+               if (!UserUtil::isValidUsername($username)) {
+                       throw new UserInputException('username', 'notValid');
+               }
+               
+               // Check if username exists already.
+               if (!UserUtil::isAvailableUsername($username)) {
+                       throw new UserInputException('username', 'notUnique');
+               }
+       }
+       
+       /**
+        * Throws a UserInputException if the email is not unique or not valid.
+        * 
+        * @param       string          $email
+        * @param       string          $confirmEmail
+        */
+       protected function validateEmail($email, $confirmEmail) {
+               if (empty($email)) {    
+                       throw new UserInputException('email');
+               }
+               
+               // check for valid email (one @ etc.)
+               if (!UserUtil::isValidEmail($email)) {
+                       throw new UserInputException('email', 'notValid');
+               }
+               
+               // Check if email exists already.
+               if (!UserUtil::isAvailableEmail($email)) {
+                       throw new UserInputException('email', 'notUnique');
+               }
+               
+               // check confirm input
+               if (StringUtil::toLowerCase($email) != StringUtil::toLowerCase($confirmEmail)) {
+                       throw new UserInputException('confirmEmail', 'notEqual');
+               }
+       }
+       
+       /**
+        * Throws a UserInputException if the password is not valid.
+        * 
+        * @param       string          $password
+        * @param       string          $confirmPassword
+        */
+       protected function validatePassword($password, $confirmPassword) {
+               if (empty($password)) {
+                       throw new UserInputException('password');
+               }
+               
+               // check confirm input
+               if ($password != $confirmPassword) {
+                       throw new UserInputException('confirmPassword', 'notEqual');
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               $this->optionTree = $this->getOptionTree();
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'username' => $this->username,
+                       'email' => $this->email,
+                       'confirmEmail' => $this->confirmEmail,
+                       'password' => $this->password,
+                       'confirmPassword' => $this->confirmPassword,
+                       'groupIDs' => $this->groupIDs,
+                       'optionTree' => $this->optionTree,
+                       'availableGroups' => $this->getAvailableGroups(),
+                       'availableLanguages' => $this->getAvailableLanguages(),
+                       'languageID' => $this->languageID,
+                       'visibleLanguages' => $this->visibleLanguages,
+                       'availableContentLanguages' => $this->getAvailableContentLanguages(),
+                       'action' => 'add'
+               ));
+       }
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               // set active menu item
+               ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);
+               
+               // get the default langauge id
+               $this->languageID = $this->getDefaultFormLanguageID();
+               
+               // get user options and categories from cache
+               $this->readCache();
+               
+               // show form
+               parent::show();
+       }
+       
+       /**
+        * @see AbstractOptionListForm::checkOption()
+        */
+       protected static function checkOption(Option $option) {
+               if (!parent::checkOption($option)) return false;
+               
+               return ($option->editable != 1 && $option->editable != 4 && !$option->disabled);
+       }
+}
index 87a26c0f9d0ec1ce49f89a3f217e21e0dd35e05b..2f1ba5e2ba81168b3857b96c0340e93bdf838304 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\UserEditor;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\PermissionDeniedException;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\WCF;\r
-use wcf\util\ArrayUtil;\r
-\r
-/**\r
- * Shows the assign user to group form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class UserAssignToGroupForm extends ACPForm {\r
-       public $templateName = 'userAssignToGroup';\r
-       public $activeMenuItem = 'wcf.acp.menu.link.user.management';\r
-       public $neededPermissions = array('admin.user.canEditUser');\r
-       \r
-       public $userIDs = array();\r
-       public $groupIDs = array();\r
-       public $users = array();\r
-       public $groups = array();\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));\r
-               if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               parent::validate();\r
-               \r
-               if (empty($this->userIDs)) throw new IllegalLinkException();\r
-               \r
-               // groups\r
-               foreach ($this->groupIDs as $groupID) {\r
-                       $group = new UserGroup($groupID);\r
-                       if (!$group->groupID) throw new UserInputException('groupIDs');\r
-                       if (!$group->isAccessible()) {\r
-                               throw new PermissionDeniedException();\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               parent::save();\r
-               \r
-               $conditions = new PreparedStatementConditionBuilder();\r
-               $conditions->add("userID IN (?)", array($this->userIDs));\r
-               \r
-               $sql = "SELECT  userID, groupID\r
-                       FROM    wcf".WCF_N."_user_to_group\r
-                       ".$conditions;\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute($conditions->getParameters());\r
-               \r
-               $groups = array();\r
-               while ($row = $statement->fetchArray()) {\r
-                       $groups[$row['userID']][] = $row['groupID'];\r
-               }\r
-               \r
-               foreach ($this->users as $user) {\r
-                       if (!UserGroup::isAccessibleGroup($groups[$user->userID])) {\r
-                               throw new PermissionDeniedException();\r
-                       }\r
-                       \r
-                       $userEditor = new UserEditor($user);\r
-                       $userEditor->addToGroups($groups[$user->userID], false, false);\r
-               }\r
-               \r
-               // TODO: Implement unmarkAll()\r
-               //UserEditor::unmarkAll();\r
-               SessionHandler::resetSessions($this->userIDs);\r
-               $this->saved();\r
-               WCF::getTPL()->assign('message', 'wcf.acp.user.assignToGroup.success');\r
-               WCF::getTPL()->display('success');\r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               if (!count($_POST)) {\r
-                       // get marked user ids\r
-                       $markedUsers = WCF::getSession()->getVar('markedUsers');\r
-                       if (is_array($markedUsers)) {\r
-                               $this->userIDs = $markedUsers;\r
-                       }\r
-                       if (empty($this->userIDs)) throw new IllegalLinkException();\r
-               }\r
-               \r
-               $this->users = User::getUsers($this->userIDs);\r
-               $this->readGroups();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'users' => $this->users,\r
-                       'userIDs' => $this->userIDs,\r
-                       'groupIDs' => $this->groupIDs,\r
-                       'groups' => $this->groups\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * Get a list of available groups.\r
-        */\r
-       protected function readGroups() {\r
-               $this->groups = UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\UserEditor;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\PermissionDeniedException;
+use wcf\system\exception\UserInputException;
+use wcf\system\session\SessionHandler;
+use wcf\system\WCF;
+use wcf\util\ArrayUtil;
+
+/**
+ * Shows the assign user to group form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class UserAssignToGroupForm extends ACPForm {
+       public $templateName = 'userAssignToGroup';
+       public $activeMenuItem = 'wcf.acp.menu.link.user.management';
+       public $neededPermissions = array('admin.user.canEditUser');
+       
+       public $userIDs = array();
+       public $groupIDs = array();
+       public $users = array();
+       public $groups = array();
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));
+               if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               parent::validate();
+               
+               if (empty($this->userIDs)) throw new IllegalLinkException();
+               
+               // groups
+               foreach ($this->groupIDs as $groupID) {
+                       $group = new UserGroup($groupID);
+                       if (!$group->groupID) throw new UserInputException('groupIDs');
+                       if (!$group->isAccessible()) {
+                               throw new PermissionDeniedException();
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               parent::save();
+               
+               $conditions = new PreparedStatementConditionBuilder();
+               $conditions->add("userID IN (?)", array($this->userIDs));
+               
+               $sql = "SELECT  userID, groupID
+                       FROM    wcf".WCF_N."_user_to_group
+                       ".$conditions;
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute($conditions->getParameters());
+               
+               $groups = array();
+               while ($row = $statement->fetchArray()) {
+                       $groups[$row['userID']][] = $row['groupID'];
+               }
+               
+               foreach ($this->users as $user) {
+                       if (!UserGroup::isAccessibleGroup($groups[$user->userID])) {
+                               throw new PermissionDeniedException();
+                       }
+                       
+                       $userEditor = new UserEditor($user);
+                       $userEditor->addToGroups($groups[$user->userID], false, false);
+               }
+               
+               // TODO: Implement unmarkAll()
+               //UserEditor::unmarkAll();
+               SessionHandler::resetSessions($this->userIDs);
+               $this->saved();
+               WCF::getTPL()->assign('message', 'wcf.acp.user.assignToGroup.success');
+               WCF::getTPL()->display('success');
+               exit;
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               if (!count($_POST)) {
+                       // get marked user ids
+                       $markedUsers = WCF::getSession()->getVar('markedUsers');
+                       if (is_array($markedUsers)) {
+                               $this->userIDs = $markedUsers;
+                       }
+                       if (empty($this->userIDs)) throw new IllegalLinkException();
+               }
+               
+               $this->users = User::getUsers($this->userIDs);
+               $this->readGroups();
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'users' => $this->users,
+                       'userIDs' => $this->userIDs,
+                       'groupIDs' => $this->groupIDs,
+                       'groups' => $this->groups
+               ));
+       }
+       
+       /**
+        * Get a list of available groups.
+        */
+       protected function readGroups() {
+               $this->groups = UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));
+       }
+}
index d8bbd09803a86eb29d5027fd809bef974c5ea9f7..29dcb0aa991a30304b1412c91aaad3bd007c26d5 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\User;\r
-use wcf\data\user\UserAction;\r
-use wcf\data\user\UserEditor;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\PermissionDeniedException;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the user edit form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class UserEditForm extends UserAddForm {\r
-       /**\r
-        * @see UserAddForm::$menuItemName\r
-        */\r
-       public $menuItemName = 'wcf.acp.menu.link.user.management';\r
-       \r
-       /**\r
-        * @see wcf\page\AbstractPage::$neededPermissions\r
-        */\r
-       public $neededPermissions = array('admin.user.canEditUser');\r
-       \r
-       /**\r
-        * user id\r
-        * @var integer\r
-        */\r
-       public $userID = 0;\r
-       \r
-       /**\r
-        * user editor object\r
-        * @var UserEditor\r
-        */\r
-       public $user = null;\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_REQUEST['userID'])) {\r
-                       $this->userID = intval($_REQUEST['userID']);\r
-                       $user = new User($this->userID);\r
-                       if (!$user->userID) {\r
-                               throw new IllegalLinkException();\r
-                       }\r
-                       \r
-                       $this->user = new UserEditor($user);\r
-                       if (!UserGroup::isAccessibleGroup($this->user->getGroupIDs())) {\r
-                               throw new PermissionDeniedException();\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (!WCF::getSession()->getPermission('admin.user.canEditPassword')) $this->password = $this->confirmPassword = '';\r
-               if (!WCF::getSession()->getPermission('admin.user.canEditMailAddress')) $this->email = $this->confirmEmail = $this->user->email;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               if (!count($_POST)) {\r
-                       // get visible languages\r
-                       $this->readVisibleLanguages();\r
-                       \r
-                       // default values\r
-                       $this->readDefaultValues();\r
-               }\r
-               \r
-               parent::readData();\r
-       }\r
-       \r
-       /**\r
-        * Gets the selected languages.\r
-        */\r
-       protected function readVisibleLanguages() {\r
-               $this->visibleLanguages = $this->user->getLanguageIDs();\r
-       }\r
-       \r
-       /**\r
-        * Gets the default values.\r
-        */\r
-       protected function readDefaultValues() {\r
-               $this->username = $this->user->username;\r
-               $this->email = $this->confirmEmail = $this->user->email;\r
-               $this->groupIDs = $this->user->getGroupIDs();\r
-               $this->languageID = $this->user->languageID;\r
-               \r
-               foreach ($this->options as $option) {\r
-                       $value = $this->user->{'userOption'.$option->optionID};\r
-                       if ($value !== null) {\r
-                               $this->optionValues[$option->optionName] = $value;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'userID' => $this->user->userID,\r
-                       'action' => 'edit',\r
-                       'url' => '',\r
-                       'markedUsers' => 0,\r
-                       'user' => $this->user\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               AbstractForm::save();\r
-               \r
-               // add default groups\r
-               $defaultGroups = UserGroup::getAccessibleGroups(array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));\r
-               $oldGroupIDs = $this->user->getGroupIDs();\r
-               foreach ($oldGroupIDs as $oldGroupID) {\r
-                       if (isset($defaultGroups[$oldGroupID])) {\r
-                               $this->groupIDs[] = $oldGroupID;\r
-                       }\r
-               }\r
-               $this->groupIDs = array_unique($this->groupIDs);\r
-               \r
-               // save user\r
-               $saveOptions = array();\r
-               foreach ($this->options as $option) {\r
-                       $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
-               }\r
-               $this->additionalFields['languageID'] = $this->languageID;\r
-               $data = array(\r
-                       'data' => array_merge($this->additionalFields, array(\r
-                               'username' => $this->username,\r
-                               'email' => $this->email,\r
-                               'password' => $this->password,\r
-                       )),\r
-                       'groups' => $this->groupIDs,\r
-                       'languages' => $this->visibleLanguages,\r
-                       'options' => $saveOptions\r
-               );\r
-               $userAction = new UserAction(array($this->userID), 'update', $data);\r
-               $userAction->executeAction();\r
-               \r
-               $this->saved();\r
-               \r
-               // reset password\r
-               $this->password = $this->confirmPassword = '';\r
-       \r
-               // show success message\r
-               WCF::getTPL()->assign('success', true);\r
-       }\r
-       \r
-       /**\r
-        * @see UserAddForm::validateUsername()\r
-        */\r
-       protected function validateUsername($username) {\r
-               if (StringUtil::toLowerCase($this->user->username) != StringUtil::toLowerCase($username)) {\r
-                       parent::validateUsername($username);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see UserAddForm::validateEmail()\r
-        */\r
-       protected function validateEmail($email, $confirmEmail) {\r
-               if (StringUtil::toLowerCase($this->user->email) != StringUtil::toLowerCase($email)) {\r
-                       parent::validateEmail($email, $this->confirmEmail);     \r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see UserAddForm::validatePassword()\r
-        */\r
-       protected function validatePassword($password, $confirmPassword) {\r
-               if (!empty($password) || !empty($confirmPassword)) {\r
-                       parent::validatePassword($password, $confirmPassword);\r
-               }\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\User;
+use wcf\data\user\UserAction;
+use wcf\data\user\UserEditor;
+use wcf\data\user\group\UserGroup;
+use wcf\form\AbstractForm;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\PermissionDeniedException;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the user edit form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class UserEditForm extends UserAddForm {
+       /**
+        * @see UserAddForm::$menuItemName
+        */
+       public $menuItemName = 'wcf.acp.menu.link.user.management';
+       
+       /**
+        * @see wcf\page\AbstractPage::$neededPermissions
+        */
+       public $neededPermissions = array('admin.user.canEditUser');
+       
+       /**
+        * user id
+        * @var integer
+        */
+       public $userID = 0;
+       
+       /**
+        * user editor object
+        * @var UserEditor
+        */
+       public $user = null;
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_REQUEST['userID'])) {
+                       $this->userID = intval($_REQUEST['userID']);
+                       $user = new User($this->userID);
+                       if (!$user->userID) {
+                               throw new IllegalLinkException();
+                       }
+                       
+                       $this->user = new UserEditor($user);
+                       if (!UserGroup::isAccessibleGroup($this->user->getGroupIDs())) {
+                               throw new PermissionDeniedException();
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (!WCF::getSession()->getPermission('admin.user.canEditPassword')) $this->password = $this->confirmPassword = '';
+               if (!WCF::getSession()->getPermission('admin.user.canEditMailAddress')) $this->email = $this->confirmEmail = $this->user->email;
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               if (!count($_POST)) {
+                       // get visible languages
+                       $this->readVisibleLanguages();
+                       
+                       // default values
+                       $this->readDefaultValues();
+               }
+               
+               parent::readData();
+       }
+       
+       /**
+        * Gets the selected languages.
+        */
+       protected function readVisibleLanguages() {
+               $this->visibleLanguages = $this->user->getLanguageIDs();
+       }
+       
+       /**
+        * Gets the default values.
+        */
+       protected function readDefaultValues() {
+               $this->username = $this->user->username;
+               $this->email = $this->confirmEmail = $this->user->email;
+               $this->groupIDs = $this->user->getGroupIDs();
+               $this->languageID = $this->user->languageID;
+               
+               foreach ($this->options as $option) {
+                       $value = $this->user->{'userOption'.$option->optionID};
+                       if ($value !== null) {
+                               $this->optionValues[$option->optionName] = $value;
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'userID' => $this->user->userID,
+                       'action' => 'edit',
+                       'url' => '',
+                       'markedUsers' => 0,
+                       'user' => $this->user
+               ));
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               AbstractForm::save();
+               
+               // add default groups
+               $defaultGroups = UserGroup::getAccessibleGroups(array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));
+               $oldGroupIDs = $this->user->getGroupIDs();
+               foreach ($oldGroupIDs as $oldGroupID) {
+                       if (isset($defaultGroups[$oldGroupID])) {
+                               $this->groupIDs[] = $oldGroupID;
+                       }
+               }
+               $this->groupIDs = array_unique($this->groupIDs);
+               
+               // save user
+               $saveOptions = array();
+               foreach ($this->options as $option) {
+                       $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+               }
+               $this->additionalFields['languageID'] = $this->languageID;
+               $data = array(
+                       'data' => array_merge($this->additionalFields, array(
+                               'username' => $this->username,
+                               'email' => $this->email,
+                               'password' => $this->password,
+                       )),
+                       'groups' => $this->groupIDs,
+                       'languages' => $this->visibleLanguages,
+                       'options' => $saveOptions
+               );
+               $userAction = new UserAction(array($this->userID), 'update', $data);
+               $userAction->executeAction();
+               
+               $this->saved();
+               
+               // reset password
+               $this->password = $this->confirmPassword = '';
+       
+               // show success message
+               WCF::getTPL()->assign('success', true);
+       }
+       
+       /**
+        * @see UserAddForm::validateUsername()
+        */
+       protected function validateUsername($username) {
+               if (StringUtil::toLowerCase($this->user->username) != StringUtil::toLowerCase($username)) {
+                       parent::validateUsername($username);
+               }
+       }
+       
+       /**
+        * @see UserAddForm::validateEmail()
+        */
+       protected function validateEmail($email, $confirmEmail) {
+               if (StringUtil::toLowerCase($this->user->email) != StringUtil::toLowerCase($email)) {
+                       parent::validateEmail($email, $this->confirmEmail);     
+               }
+       }
+       
+       /**
+        * @see UserAddForm::validatePassword()
+        */
+       protected function validatePassword($password, $confirmPassword) {
+               if (!empty($password) || !empty($confirmPassword)) {
+                       parent::validatePassword($password, $confirmPassword);
+               }
+       }
+}
index 5e9c4cf411d4572343228893c9946870c504ffdd..3bd5cda46b55eb319d6a4dfdb5634a156759a8cd 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\User;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the export user mail addresses form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class UserEmailAddressExportForm extends ACPForm {\r
-       public $templateName = 'userEmailAddressExport';\r
-       public $activeMenuItem = 'wcf.acp.menu.link.user.management';\r
-       public $neededPermissions = array('admin.user.canMailUser');\r
-       \r
-       public $fileType = 'csv';\r
-       public $userIDs = array();\r
-       public $separator = ',';\r
-       public $textSeparator = '"'; \r
-       public $users = array();\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['fileType']) && $_POST['fileType'] == 'xml') $this->fileType = $_POST['fileType'];\r
-               if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));\r
-               if (isset($_POST['separator'])) $this->separator = $_POST['separator'];\r
-               if (isset($_POST['textSeparator'])) $this->textSeparator = $_POST['textSeparator'];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               parent::validate();\r
-               \r
-               if (empty($this->userIDs)) throw new IllegalLinkException();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               parent::save();\r
-               \r
-               // send content type\r
-               header('Content-Type: text/'.$this->fileType.'; charset=UTF-8');\r
-               header('Content-Disposition: attachment; filename="export.'.$this->fileType.'"');\r
-               \r
-               if ($this->fileType == 'xml') {\r
-                       echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<addresses>\n";\r
-               }\r
-               \r
-               $conditions = new PreparedStatementConditionBuilder();\r
-               $conditions->add("userID IN (?)", array($this->userIDs));\r
-               \r
-               // count users\r
-               $sql = "SELECT  COUNT(*) AS count\r
-                       FROM    wcf".WCF_N."_user\r
-                       ".$conditions;\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute($conditions->getParameters());\r
-               $count = $statement->fetchArray();\r
-               \r
-               // get users\r
-               $sql = "SELECT          email\r
-                       FROM            wcf".WCF_N."_user\r
-                       ".$conditions."\r
-                       ORDER BY        email";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute($conditions->getParameters());\r
-               \r
-               $i = 0;\r
-               while ($row = WCF::getDB()->fetchArray($result)) {\r
-                       if ($this->fileType == 'xml') echo "<address><![CDATA[".StringUtil::escapeCDATA($row['email'])."]]></address>\n";\r
-                       else echo $this->textSeparator . $row['email'] . $this->textSeparator . ($i < $count['count'] ? $this->separator : '');\r
-                       $i++;\r
-               }\r
-               \r
-               if ($this->fileType == 'xml') {\r
-                       echo "</addresses>";\r
-               }\r
-               \r
-               // TODO: Implement unmarkAll()\r
-               //UserEditor::unmarkAll();\r
-               $this->saved();\r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               if (!count($_POST)) {\r
-                       // get marked user ids\r
-                       $markedUsers = WCF::getSession()->getVar('markedUsers');\r
-                       if (is_array($markedUsers)) $this->userIDs = implode(',', $markedUsers);\r
-                       if (empty($this->userIDs)) throw new IllegalLinkException();\r
-               }\r
-               \r
-               $this->users = User::getUsers($this->userIDs);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'users' => $this->users,\r
-                       'userIDs' => $this->userIDs,\r
-                       'separator' => $this->separator,\r
-                       'textSeparator' => $this->textSeparator,\r
-                       'fileType' => $this->fileType\r
-               ));\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\User;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+use wcf\util\ArrayUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the export user mail addresses form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class UserEmailAddressExportForm extends ACPForm {
+       public $templateName = 'userEmailAddressExport';
+       public $activeMenuItem = 'wcf.acp.menu.link.user.management';
+       public $neededPermissions = array('admin.user.canMailUser');
+       
+       public $fileType = 'csv';
+       public $userIDs = array();
+       public $separator = ',';
+       public $textSeparator = '"'; 
+       public $users = array();
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['fileType']) && $_POST['fileType'] == 'xml') $this->fileType = $_POST['fileType'];
+               if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));
+               if (isset($_POST['separator'])) $this->separator = $_POST['separator'];
+               if (isset($_POST['textSeparator'])) $this->textSeparator = $_POST['textSeparator'];
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               parent::validate();
+               
+               if (empty($this->userIDs)) throw new IllegalLinkException();
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               parent::save();
+               
+               // send content type
+               header('Content-Type: text/'.$this->fileType.'; charset=UTF-8');
+               header('Content-Disposition: attachment; filename="export.'.$this->fileType.'"');
+               
+               if ($this->fileType == 'xml') {
+                       echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<addresses>\n";
+               }
+               
+               $conditions = new PreparedStatementConditionBuilder();
+               $conditions->add("userID IN (?)", array($this->userIDs));
+               
+               // count users
+               $sql = "SELECT  COUNT(*) AS count
+                       FROM    wcf".WCF_N."_user
+                       ".$conditions;
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute($conditions->getParameters());
+               $count = $statement->fetchArray();
+               
+               // get users
+               $sql = "SELECT          email
+                       FROM            wcf".WCF_N."_user
+                       ".$conditions."
+                       ORDER BY        email";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute($conditions->getParameters());
+               
+               $i = 0;
+               while ($row = WCF::getDB()->fetchArray($result)) {
+                       if ($this->fileType == 'xml') echo "<address><![CDATA[".StringUtil::escapeCDATA($row['email'])."]]></address>\n";
+                       else echo $this->textSeparator . $row['email'] . $this->textSeparator . ($i < $count['count'] ? $this->separator : '');
+                       $i++;
+               }
+               
+               if ($this->fileType == 'xml') {
+                       echo "</addresses>";
+               }
+               
+               // TODO: Implement unmarkAll()
+               //UserEditor::unmarkAll();
+               $this->saved();
+               exit;
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               if (!count($_POST)) {
+                       // get marked user ids
+                       $markedUsers = WCF::getSession()->getVar('markedUsers');
+                       if (is_array($markedUsers)) $this->userIDs = implode(',', $markedUsers);
+                       if (empty($this->userIDs)) throw new IllegalLinkException();
+               }
+               
+               $this->users = User::getUsers($this->userIDs);
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'users' => $this->users,
+                       'userIDs' => $this->userIDs,
+                       'separator' => $this->separator,
+                       'textSeparator' => $this->textSeparator,
+                       'fileType' => $this->fileType
+               ));
+       }
+}
index ef70f0cc60d60bb58ff5f514f7689135b1284223..a0b581735c8474219624cccbb1e2270294c7cfba 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\group\UserGroupAction;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-use wcf\util\ClassUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the group add form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class UserGroupAddForm extends AbstractOptionListForm {\r
-       /**\r
-        * @see wcf\page\AbstractPage::$neededPermissions\r
-        */\r
-       public $neededPermissions = array('admin.user.canAddGroup');\r
-       \r
-       /**\r
-        * @see wcf\page\AbstractPage::$templateName\r
-        */\r
-       public $templateName = 'userGroupAdd';\r
-       \r
-       /**\r
-        * name of the active acp menu item\r
-        * @var string\r
-        */\r
-       public $menuItemName = 'wcf.acp.menu.link.group.add';\r
-       \r
-       /**\r
-        * @see AbstractOptionListForm::$cacheName\r
-        */\r
-       public $cacheName = 'user_group-option-';\r
-       \r
-       /**\r
-        * active tab menu item name\r
-        * @var string\r
-        */\r
-       public $activeTabMenuItem = '';\r
-       \r
-       /**\r
-        * active sub tab menu item name\r
-        * @var string\r
-        */\r
-       public $activeSubTabMenuItem = '';\r
-       \r
-       /**\r
-        * the option tree\r
-        * @var array\r
-        */\r
-       public $optionTree = array();\r
-       \r
-       /**\r
-        * group name\r
-        * @var string\r
-        */\r
-       public $groupName = '';\r
-       \r
-       /**\r
-        * additional fields\r
-        * @var array\r
-        */\r
-       public $additionalFields = array();\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['groupName'])) $this->groupName = StringUtil::trim($_POST['groupName']);\r
-               if (isset($_POST['activeTabMenuItem'])) $this->activeTabMenuItem = $_POST['activeTabMenuItem'];\r
-               if (isset($_POST['activeSubTabMenuItem'])) $this->activeSubTabMenuItem = $_POST['activeSubTabMenuItem'];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               // validate dynamic options\r
-               parent::validate();\r
-               \r
-               // validate group name\r
-               try {\r
-                       if (empty($this->groupName)) {\r
-                               throw new UserInputException('groupName');\r
-                       }\r
-               }\r
-               catch (UserInputException $e) {\r
-                       $this->errorType[$e->getField()] = $e->getType();\r
-               }\r
-       \r
-               if (count($this->errorType) > 0) {\r
-                       throw new UserInputException('groupName', $this->errorType);\r
-               }               \r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               parent::save();\r
-               \r
-               // get default group\r
-               $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);\r
-               $saveOptions = array();\r
-               foreach ($this->options as $option) {\r
-                       if ($this->optionValues[$option->optionName] != $defaultGroup->getGroupOption($option->optionName)) {\r
-                               $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
-                       }\r
-               }\r
-               \r
-               $data = array(\r
-                       'data' => array_merge($this->additionalFields, array('groupName' => $this->groupName)),\r
-                       'options' => $saveOptions\r
-               );\r
-               $groupAction = new UserGroupAction(array(), 'create', $data);\r
-               $groupAction->executeAction();\r
-               $this->saved();\r
-               \r
-               // show success message\r
-               WCF::getTPL()->assign(array(\r
-                       'success' => true\r
-               ));\r
-               \r
-               // reset values\r
-               $this->groupName = '';\r
-               $this->optionValues = array();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               AbstractOptionListForm::readData();\r
-               \r
-               $this->optionTree = $this->getOptionTree();\r
-               if (!count($_POST)) {\r
-                       $this->activeTabMenuItem = $this->optionTree[0]['object']->categoryName;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'groupName' => $this->groupName,\r
-                       'optionTree' => $this->optionTree,\r
-                       'action' => 'add',\r
-                       'activeTabMenuItem' => $this->activeTabMenuItem,\r
-                       'activeSubTabMenuItem' => $this->activeSubTabMenuItem\r
-               ));\r
-       }\r
-\r
-       /**\r
-        * @see wcf\form\IForm::show()\r
-        */\r
-       public function show() {\r
-               // set active menu item\r
-               ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);\r
-               \r
-               // check master password\r
-               WCFACP::checkMasterPassword();\r
-               \r
-               // get user options and categories from cache\r
-               $this->readCache();\r
-               \r
-               // show form\r
-               parent::show();\r
-       }\r
-       \r
-       /**\r
-        * @see AbstractOptionListForm::getTypeObject()\r
-        */\r
-       protected function getTypeObject($type) {\r
-               if (!isset($this->typeObjects[$type])) {\r
-                       $className = 'wcf\system\option\group\GroupOptionType'.ucfirst($type);\r
-                       \r
-                       // create instance\r
-                       if (!class_exists($className)) {\r
-                               throw new SystemException("unable to find class '".$className."'", 11001);\r
-                       }\r
-                       if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\group\IGroupOptionType')) {\r
-                               throw new SystemException("'".$className."' should implement wcf\system\option\group\IGroupOptionType", 11001);\r
-                       }\r
-                       $this->typeObjects[$type] = new $className();\r
-               }\r
-               \r
-               return $this->typeObjects[$type];\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\group\UserGroupAction;
+use wcf\system\exception\UserInputException;
+use wcf\system\exception\SystemException;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+use wcf\util\ClassUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the group add form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class UserGroupAddForm extends AbstractOptionListForm {
+       /**
+        * @see wcf\page\AbstractPage::$neededPermissions
+        */
+       public $neededPermissions = array('admin.user.canAddGroup');
+       
+       /**
+        * @see wcf\page\AbstractPage::$templateName
+        */
+       public $templateName = 'userGroupAdd';
+       
+       /**
+        * name of the active acp menu item
+        * @var string
+        */
+       public $menuItemName = 'wcf.acp.menu.link.group.add';
+       
+       /**
+        * @see AbstractOptionListForm::$cacheName
+        */
+       public $cacheName = 'user_group-option-';
+       
+       /**
+        * active tab menu item name
+        * @var string
+        */
+       public $activeTabMenuItem = '';
+       
+       /**
+        * active sub tab menu item name
+        * @var string
+        */
+       public $activeSubTabMenuItem = '';
+       
+       /**
+        * the option tree
+        * @var array
+        */
+       public $optionTree = array();
+       
+       /**
+        * group name
+        * @var string
+        */
+       public $groupName = '';
+       
+       /**
+        * additional fields
+        * @var array
+        */
+       public $additionalFields = array();
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['groupName'])) $this->groupName = StringUtil::trim($_POST['groupName']);
+               if (isset($_POST['activeTabMenuItem'])) $this->activeTabMenuItem = $_POST['activeTabMenuItem'];
+               if (isset($_POST['activeSubTabMenuItem'])) $this->activeSubTabMenuItem = $_POST['activeSubTabMenuItem'];
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               // validate dynamic options
+               parent::validate();
+               
+               // validate group name
+               try {
+                       if (empty($this->groupName)) {
+                               throw new UserInputException('groupName');
+                       }
+               }
+               catch (UserInputException $e) {
+                       $this->errorType[$e->getField()] = $e->getType();
+               }
+       
+               if (count($this->errorType) > 0) {
+                       throw new UserInputException('groupName', $this->errorType);
+               }               
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               parent::save();
+               
+               // get default group
+               $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);
+               $saveOptions = array();
+               foreach ($this->options as $option) {
+                       if ($this->optionValues[$option->optionName] != $defaultGroup->getGroupOption($option->optionName)) {
+                               $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+                       }
+               }
+               
+               $data = array(
+                       'data' => array_merge($this->additionalFields, array('groupName' => $this->groupName)),
+                       'options' => $saveOptions
+               );
+               $groupAction = new UserGroupAction(array(), 'create', $data);
+               $groupAction->executeAction();
+               $this->saved();
+               
+               // show success message
+               WCF::getTPL()->assign(array(
+                       'success' => true
+               ));
+               
+               // reset values
+               $this->groupName = '';
+               $this->optionValues = array();
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               AbstractOptionListForm::readData();
+               
+               $this->optionTree = $this->getOptionTree();
+               if (!count($_POST)) {
+                       $this->activeTabMenuItem = $this->optionTree[0]['object']->categoryName;
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'groupName' => $this->groupName,
+                       'optionTree' => $this->optionTree,
+                       'action' => 'add',
+                       'activeTabMenuItem' => $this->activeTabMenuItem,
+                       'activeSubTabMenuItem' => $this->activeSubTabMenuItem
+               ));
+       }
+
+       /**
+        * @see wcf\form\IForm::show()
+        */
+       public function show() {
+               // set active menu item
+               ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);
+               
+               // check master password
+               WCFACP::checkMasterPassword();
+               
+               // get user options and categories from cache
+               $this->readCache();
+               
+               // show form
+               parent::show();
+       }
+       
+       /**
+        * @see AbstractOptionListForm::getTypeObject()
+        */
+       protected function getTypeObject($type) {
+               if (!isset($this->typeObjects[$type])) {
+                       $className = 'wcf\system\option\group\GroupOptionType'.ucfirst($type);
+                       
+                       // create instance
+                       if (!class_exists($className)) {
+                               throw new SystemException("unable to find class '".$className."'", 11001);
+                       }
+                       if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\group\IGroupOptionType')) {
+                               throw new SystemException("'".$className."' should implement wcf\system\option\group\IGroupOptionType", 11001);
+                       }
+                       $this->typeObjects[$type] = new $className();
+               }
+               
+               return $this->typeObjects[$type];
+       }
+}
index 5dca68448e33df14dbde10ae6937dbe6997e242b..af158470a26d47c7430fc3a8840f09c57120b5c4 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\acp\session\ACPSession;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\group\UserGroupAction;\r
-use wcf\data\user\group\UserGroupEditor;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\PermissionDeniedException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows the group edit form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class UserGroupEditForm extends UserGroupAddForm {\r
-       /**\r
-        * @see UserGroupAddForm::$menuItemName\r
-        */\r
-       public $menuItemName = 'wcf.acp.menu.link.group';\r
-       \r
-       /**\r
-        * @see wcf\page\AbstractPage::$neededPermissions\r
-        */\r
-       public $neededPermissions = array('admin.user.canEditGroup');\r
-       \r
-       /**\r
-        * group id\r
-        * @var integer\r
-        */\r
-       public $groupID = 0;\r
-       \r
-       /**\r
-        * group editor object\r
-        * @var GroupEditor\r
-        */\r
-       public $group = null;\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               // get group\r
-               if (isset($_REQUEST['groupID'])) $this->groupID = intval($_REQUEST['groupID']);\r
-               $group = new UserGroup($this->groupID);\r
-               if (!$group->groupID) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-               if (!$group->isAccessible()) {\r
-                       throw new PermissionDeniedException();\r
-               }\r
-               \r
-               $this->group = new UserGroupEditor($group);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               if (!count($_POST)) {\r
-                       $this->groupName = $this->group->groupName;\r
-                       \r
-                       // get default values\r
-                       if ($this->group->groupType != UserGroup::EVERYONE) {\r
-                               $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);\r
-                               foreach ($this->options as $option) {\r
-                                       $value = $defaultGroup->getGroupOption($option->optionName);\r
-                                       if ($value !== null) {\r
-                                               $this->optionValues[$option->optionName] = $value;\r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-                       foreach ($this->options as $option) {\r
-                               $value = $this->group->getGroupOption($option->optionName);\r
-                               if ($value !== null) {\r
-                                       $this->optionValues[$option->optionName] = $value;\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               parent::readData();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'groupID' => $this->group->groupID,\r
-                       'action' => 'edit'\r
-               ));\r
-               \r
-               // add warning when the initiator is in the group\r
-               if ($this->group->isMember($this->groupID)) {\r
-                       WCF::getTPL()->assign('warningSelfEdit', true);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               AbstractForm::save();\r
-               \r
-               // save group\r
-               $saveOptions = array();\r
-               if ($this->group->groupType == UserGroup::EVERYONE) {\r
-                       foreach ($this->options as $option) {\r
-                               $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
-                       }\r
-               }\r
-               else {\r
-                       // get default group\r
-                       $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);\r
-                       foreach ($this->options as $option) {\r
-                               if ($this->optionValues[$option->optionName] != $defaultGroup->getGroupOption($option->optionName)) {\r
-                                       $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
-                               }\r
-                       }\r
-               }\r
-               $data = array(\r
-                       'data' => array_merge(array('groupName' => $this->groupName), $this->additionalFields),\r
-                       'options' => $saveOptions\r
-               );\r
-               $groupAction = new UserGroupAction(array($this->groupID), 'update', $data);\r
-               $groupAction->executeAction();\r
-               $this->saved();\r
-               \r
-               // show success message\r
-               WCF::getTPL()->assign('success', true);\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\acp\session\ACPSession;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\group\UserGroupAction;
+use wcf\data\user\group\UserGroupEditor;
+use wcf\form\AbstractForm;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\PermissionDeniedException;
+use wcf\system\WCF;
+
+/**
+ * Shows the group edit form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class UserGroupEditForm extends UserGroupAddForm {
+       /**
+        * @see UserGroupAddForm::$menuItemName
+        */
+       public $menuItemName = 'wcf.acp.menu.link.group';
+       
+       /**
+        * @see wcf\page\AbstractPage::$neededPermissions
+        */
+       public $neededPermissions = array('admin.user.canEditGroup');
+       
+       /**
+        * group id
+        * @var integer
+        */
+       public $groupID = 0;
+       
+       /**
+        * group editor object
+        * @var GroupEditor
+        */
+       public $group = null;
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               // get group
+               if (isset($_REQUEST['groupID'])) $this->groupID = intval($_REQUEST['groupID']);
+               $group = new UserGroup($this->groupID);
+               if (!$group->groupID) {
+                       throw new IllegalLinkException();
+               }
+               if (!$group->isAccessible()) {
+                       throw new PermissionDeniedException();
+               }
+               
+               $this->group = new UserGroupEditor($group);
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               if (!count($_POST)) {
+                       $this->groupName = $this->group->groupName;
+                       
+                       // get default values
+                       if ($this->group->groupType != UserGroup::EVERYONE) {
+                               $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);
+                               foreach ($this->options as $option) {
+                                       $value = $defaultGroup->getGroupOption($option->optionName);
+                                       if ($value !== null) {
+                                               $this->optionValues[$option->optionName] = $value;
+                                       }
+                               }
+                       }
+                       
+                       foreach ($this->options as $option) {
+                               $value = $this->group->getGroupOption($option->optionName);
+                               if ($value !== null) {
+                                       $this->optionValues[$option->optionName] = $value;
+                               }
+                       }
+               }
+               
+               parent::readData();
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'groupID' => $this->group->groupID,
+                       'action' => 'edit'
+               ));
+               
+               // add warning when the initiator is in the group
+               if ($this->group->isMember($this->groupID)) {
+                       WCF::getTPL()->assign('warningSelfEdit', true);
+               }
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               AbstractForm::save();
+               
+               // save group
+               $saveOptions = array();
+               if ($this->group->groupType == UserGroup::EVERYONE) {
+                       foreach ($this->options as $option) {
+                               $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+                       }
+               }
+               else {
+                       // get default group
+                       $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);
+                       foreach ($this->options as $option) {
+                               if ($this->optionValues[$option->optionName] != $defaultGroup->getGroupOption($option->optionName)) {
+                                       $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+                               }
+                       }
+               }
+               $data = array(
+                       'data' => array_merge(array('groupName' => $this->groupName), $this->additionalFields),
+                       'options' => $saveOptions
+               );
+               $groupAction = new UserGroupAction(array($this->groupID), 'update', $data);
+               $groupAction->executeAction();
+               $this->saved();
+               
+               // show success message
+               WCF::getTPL()->assign('success', true);
+       }
+}
index e2a9390111fe74000eb284e38b8c83bb09da978a..0fc6863a8e5b9b7625bc9dcfccfed5095981914a 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\UserList;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\StringUtil;\r
-use wcf\system\WCF;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\UserInputException;\r
-\r
-/**\r
- * Shows the user mail form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class UserMailForm extends ACPForm {\r
-       // system\r
-       public $templateName = 'userMail';\r
-       public $neededPermissions = array('admin.user.canMailUser');\r
-       \r
-       // parameters\r
-       public $userIDs = array();\r
-       public $groupIDs = array();\r
-       public $subject = '';\r
-       public $text = '';\r
-       public $from = '';\r
-       public $users = array();\r
-       public $groups = array();\r
-       public $enableHTML = 0;\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               $this->activeMenuItem = ($this->action == 'all' ? 'wcf.acp.menu.link.user.mail' : ($this->action == 'group' ? 'wcf.acp.menu.link.group.mail' : 'wcf.acp.menu.link.user.management'));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));\r
-               if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);\r
-               if (isset($_POST['subject'])) $this->subject = StringUtil::trim($_POST['subject']);\r
-               if (isset($_POST['text'])) $this->text = StringUtil::trim($_POST['text']);\r
-               if (isset($_POST['from'])) $this->from = StringUtil::trim($_POST['from']);\r
-               if (isset($_POST['enableHTML'])) $this->enableHTML = intval($_POST['enableHTML']);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               parent::validate();\r
-               \r
-               if ($this->action == 'group') {\r
-                       if (!count($this->groupIDs)) {\r
-                               throw new UserInputException('groupIDs');\r
-                       }\r
-               }\r
-               if ($this->action == '') {\r
-                       if (empty($this->userIDs)) throw new IllegalLinkException();\r
-               }\r
-               \r
-               if (empty($this->subject)) {\r
-                       throw new UserInputException('subject');\r
-               }\r
-               \r
-               if (empty($this->text)) {\r
-                       throw new UserInputException('text');\r
-               }\r
-               \r
-               if (empty($this->from)) {\r
-                       throw new UserInputException('from');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               parent::save();\r
-               \r
-               // save config in session\r
-               $userMailData = WCF::getSession()->getVar('userMailData');\r
-               if ($userMailData === null) $userMailData = array();\r
-               $mailID = count($userMailData);\r
-               $userMailData[$mailID] = array(\r
-                       'action' => $this->action,\r
-                       'userIDs' => $this->userIDs,\r
-                       'groupIDs' => implode(',', $this->groupIDs),\r
-                       'subject' => $this->subject,\r
-                       'text' => $this->text,\r
-                       'from' => $this->from,\r
-                       'enableHTML' => $this->enableHTML\r
-               );\r
-               WCF::getSession()->register('userMailData', $userMailData);\r
-               $this->saved();\r
-               \r
-               // show worker template\r
-               WCF::getTPL()->assign(array(\r
-                       'pageTitle' => WCF::getLanguage()->get(($this->action == 'all' ? 'wcf.acp.user.sendMail.all' : ($this->action == 'group' ? 'wcf.acp.user.sendMail.group' : 'wcf.acp.user.sendMail'))),\r
-                       'url' => 'index.php?action=UserMail&mailID='.$mailID.''.SID_ARG_2ND_NOT_ENCODED\r
-               ));\r
-               WCF::getTPL()->display('worker');\r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               if (!count($_POST)) {\r
-                       // get marked user ids\r
-                       if (empty($this->action)) {\r
-                               $markedUsers = WCF::getSession()->getVar('markedUsers');\r
-                               if (is_array($markedUsers)) $this->userIDs = implode(',', $markedUsers);\r
-                               if (empty($this->userIDs)) throw new IllegalLinkException();\r
-                       }\r
-                       \r
-                       if (MAIL_USE_FORMATTED_ADDRESS) $this->from = MAIL_FROM_NAME . ' <' . MAIL_FROM_ADDRESS . '>';\r
-                       else $this->from = MAIL_FROM_ADDRESS;\r
-               }\r
-               \r
-               if (!empty($this->userIDs)) {\r
-                       $userList = new UserList();\r
-                       $userList->getConditionBuilder()->add("user.userID IN (?)", array($this->userIDs));\r
-                       $userList->sqlOrderBy = "user.username ASC";\r
-                       $userList->readObjects();\r
-                       \r
-                       $this->users = $userList->getObjects();\r
-               }\r
-               \r
-               $this->groups = UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'users' => $this->users,\r
-                       'groups' => $this->groups,\r
-                       'userIDs' => $this->userIDs,\r
-                       'groupIDs' => $this->groupIDs,\r
-                       'subject' => $this->subject,\r
-                       'text' => $this->text,\r
-                       'from' => $this->from,\r
-                       'enableHTML' => $this->enableHTML\r
-               ));\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\UserList;
+use wcf\util\ArrayUtil;
+use wcf\util\StringUtil;
+use wcf\system\WCF;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\UserInputException;
+
+/**
+ * Shows the user mail form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class UserMailForm extends ACPForm {
+       // system
+       public $templateName = 'userMail';
+       public $neededPermissions = array('admin.user.canMailUser');
+       
+       // parameters
+       public $userIDs = array();
+       public $groupIDs = array();
+       public $subject = '';
+       public $text = '';
+       public $from = '';
+       public $users = array();
+       public $groups = array();
+       public $enableHTML = 0;
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               $this->activeMenuItem = ($this->action == 'all' ? 'wcf.acp.menu.link.user.mail' : ($this->action == 'group' ? 'wcf.acp.menu.link.group.mail' : 'wcf.acp.menu.link.user.management'));
+       }
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));
+               if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);
+               if (isset($_POST['subject'])) $this->subject = StringUtil::trim($_POST['subject']);
+               if (isset($_POST['text'])) $this->text = StringUtil::trim($_POST['text']);
+               if (isset($_POST['from'])) $this->from = StringUtil::trim($_POST['from']);
+               if (isset($_POST['enableHTML'])) $this->enableHTML = intval($_POST['enableHTML']);
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               parent::validate();
+               
+               if ($this->action == 'group') {
+                       if (!count($this->groupIDs)) {
+                               throw new UserInputException('groupIDs');
+                       }
+               }
+               if ($this->action == '') {
+                       if (empty($this->userIDs)) throw new IllegalLinkException();
+               }
+               
+               if (empty($this->subject)) {
+                       throw new UserInputException('subject');
+               }
+               
+               if (empty($this->text)) {
+                       throw new UserInputException('text');
+               }
+               
+               if (empty($this->from)) {
+                       throw new UserInputException('from');
+               }
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               parent::save();
+               
+               // save config in session
+               $userMailData = WCF::getSession()->getVar('userMailData');
+               if ($userMailData === null) $userMailData = array();
+               $mailID = count($userMailData);
+               $userMailData[$mailID] = array(
+                       'action' => $this->action,
+                       'userIDs' => $this->userIDs,
+                       'groupIDs' => implode(',', $this->groupIDs),
+                       'subject' => $this->subject,
+                       'text' => $this->text,
+                       'from' => $this->from,
+                       'enableHTML' => $this->enableHTML
+               );
+               WCF::getSession()->register('userMailData', $userMailData);
+               $this->saved();
+               
+               // show worker template
+               WCF::getTPL()->assign(array(
+                       'pageTitle' => WCF::getLanguage()->get(($this->action == 'all' ? 'wcf.acp.user.sendMail.all' : ($this->action == 'group' ? 'wcf.acp.user.sendMail.group' : 'wcf.acp.user.sendMail'))),
+                       'url' => 'index.php?action=UserMail&mailID='.$mailID.''.SID_ARG_2ND_NOT_ENCODED
+               ));
+               WCF::getTPL()->display('worker');
+               exit;
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function readData() {
+               parent::readData();
+               
+               if (!count($_POST)) {
+                       // get marked user ids
+                       if (empty($this->action)) {
+                               $markedUsers = WCF::getSession()->getVar('markedUsers');
+                               if (is_array($markedUsers)) $this->userIDs = implode(',', $markedUsers);
+                               if (empty($this->userIDs)) throw new IllegalLinkException();
+                       }
+                       
+                       if (MAIL_USE_FORMATTED_ADDRESS) $this->from = MAIL_FROM_NAME . ' <' . MAIL_FROM_ADDRESS . '>';
+                       else $this->from = MAIL_FROM_ADDRESS;
+               }
+               
+               if (!empty($this->userIDs)) {
+                       $userList = new UserList();
+                       $userList->getConditionBuilder()->add("user.userID IN (?)", array($this->userIDs));
+                       $userList->sqlOrderBy = "user.username ASC";
+                       $userList->readObjects();
+                       
+                       $this->users = $userList->getObjects();
+               }
+               
+               $this->groups = UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE));
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'users' => $this->users,
+                       'groups' => $this->groups,
+                       'userIDs' => $this->userIDs,
+                       'groupIDs' => $this->groupIDs,
+                       'subject' => $this->subject,
+                       'text' => $this->text,
+                       'from' => $this->from,
+                       'enableHTML' => $this->enableHTML
+               ));
+       }
+}
index 6a6881c5b18a5b7d01b25beaa7992cf7d8636d1d..5ce1ae6bb5fd9475f243691ccb95bd705ecdf3c2 100755 (executable)
@@ -1,88 +1,88 @@
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\option\Option;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\system\WCF;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\language\LanguageFactory;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * This class provides default implementations for a list of dynamic user options.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-abstract class UserOptionListForm extends AbstractOptionListForm {\r
-       /**\r
-        * @see AbstractOptionListForm::$cacheName\r
-        */\r
-       public $cacheName = 'user-option-';\r
-       \r
-       /**\r
-        * Returns a list of all available user groups.\r
-        * \r
-        * @return      array\r
-        */\r
-       protected function getAvailableGroups() {\r
-               return UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));\r
-       }\r
-       \r
-       /**\r
-        * Returns a list of all available languages.\r
-        * \r
-        * @return      array\r
-        */\r
-       protected function getAvailableLanguages() {\r
-               $availableLanguages = array();\r
-               foreach (LanguageFactory::getAvailableLanguages(PACKAGE_ID) as $language) {\r
-                       $availableLanguages[$language['languageID']] = WCF::getLanguage()->get('wcf.global.language.'.$language['languageCode']);       \r
-               }\r
-               \r
-               // sort languages\r
-               StringUtil::sort($availableLanguages);\r
-               \r
-               return $availableLanguages;\r
-       }\r
-       \r
-       /**\r
-        * Returns a list of all available content languages.\r
-        * \r
-        * @return      array\r
-        */\r
-       public static function getAvailableContentLanguages() {\r
-               $availableLanguages = array();\r
-               foreach (LanguageFactory::getAvailableContentLanguages(PACKAGE_ID) as $language) {\r
-                       $availableLanguages[$language['languageID']] = WCF::getLanguage()->get('wcf.global.language.'.$language['languageCode']);       \r
-               }\r
-               \r
-               // sort languages\r
-               StringUtil::sort($availableLanguages);\r
-               \r
-               return $availableLanguages;\r
-       }\r
-       \r
-       /**\r
-        * Returns the default-form language id    \r
-        * \r
-        * @return      integer         $languageID\r
-        */\r
-       protected function getDefaultFormLanguageID() {\r
-               return LanguageFactory::getDefaultLanguageID();\r
-       }\r
-       \r
-       /**\r
-        * @see AbstractOptionListForm::validateOption()\r
-        */\r
-       protected function validateOption(Option $option) {\r
-               parent::validateOption($option);\r
-\r
-               if ($option->required && empty($this->optionValues[$option->optionName])) {\r
-                       throw new UserInputException($option->optionName);\r
-               }\r
-       }\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\option\Option;
+use wcf\data\user\group\UserGroup;
+use wcf\system\WCF;
+use wcf\system\exception\UserInputException;
+use wcf\system\language\LanguageFactory;
+use wcf\util\StringUtil;
+
+/**
+ * This class provides default implementations for a list of dynamic user options.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+abstract class UserOptionListForm extends AbstractOptionListForm {
+       /**
+        * @see AbstractOptionListForm::$cacheName
+        */
+       public $cacheName = 'user-option-';
+       
+       /**
+        * Returns a list of all available user groups.
+        * 
+        * @return      array
+        */
+       protected function getAvailableGroups() {
+               return UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));
+       }
+       
+       /**
+        * Returns a list of all available languages.
+        * 
+        * @return      array
+        */
+       protected function getAvailableLanguages() {
+               $availableLanguages = array();
+               foreach (LanguageFactory::getAvailableLanguages(PACKAGE_ID) as $language) {
+                       $availableLanguages[$language['languageID']] = WCF::getLanguage()->get('wcf.global.language.'.$language['languageCode']);       
+               }
+               
+               // sort languages
+               StringUtil::sort($availableLanguages);
+               
+               return $availableLanguages;
+       }
+       
+       /**
+        * Returns a list of all available content languages.
+        * 
+        * @return      array
+        */
+       public static function getAvailableContentLanguages() {
+               $availableLanguages = array();
+               foreach (LanguageFactory::getAvailableContentLanguages(PACKAGE_ID) as $language) {
+                       $availableLanguages[$language['languageID']] = WCF::getLanguage()->get('wcf.global.language.'.$language['languageCode']);       
+               }
+               
+               // sort languages
+               StringUtil::sort($availableLanguages);
+               
+               return $availableLanguages;
+       }
+       
+       /**
+        * Returns the default-form language id    
+        * 
+        * @return      integer         $languageID
+        */
+       protected function getDefaultFormLanguageID() {
+               return LanguageFactory::getDefaultLanguageID();
+       }
+       
+       /**
+        * @see AbstractOptionListForm::validateOption()
+        */
+       protected function validateOption(Option $option) {
+               parent::validateOption($option);
+
+               if ($option->required && empty($this->optionValues[$option->optionName])) {
+                       throw new UserInputException($option->optionName);
+               }
+       }
 }
index 9acf85ccb0b508c6028355de1cdf63f98d37b2c5..e0f4afaab4cef37241e858ea90840302c5c6c819 100755 (executable)
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\option\Option;\r
-use wcf\data\search\SearchEditor;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\wcf;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\HeaderUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the user search form.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category   Community Framework\r
- */\r
-class UserSearchForm extends UserOptionListForm {\r
-       /**\r
-        * @see wcf\page\AbstractPage::$templateName\r
-        */\r
-       public $templateName = 'userSearch';\r
-       \r
-       /**\r
-        * active menu item name\r
-        * @var string\r
-        */\r
-       public $menuItemName = 'wcf.acp.menu.link.user.search';\r
-       \r
-       /**\r
-        * @see wcf\page\AbstractPage::$neededPermissions\r
-        */\r
-       public $neededPermissions = array('admin.user.canSearchUser');\r
-       \r
-       /**\r
-        * username \r
-        * @var string\r
-        */\r
-       public $username = '';\r
-       \r
-       /**\r
-        * email address\r
-        * @var string\r
-        */\r
-       public $email = '';\r
-       \r
-       /**\r
-        * user id\r
-        * @var integer\r
-        */\r
-       public $userID = 0;\r
-\r
-       /**\r
-        * group ids\r
-        * @var array<integer>\r
-        */\r
-       public $groupIDs = array();\r
-       \r
-       /**\r
-        * true to invert the given group ids\r
-        * @var boolean\r
-        */\r
-       public $invertGroupIDs = 0;\r
-       \r
-       /**\r
-        * language ids\r
-        * @var array<integer>\r
-        */\r
-       public $languageIDs = array();\r
-       \r
-       /**\r
-        * matches\r
-        * @var array<integer>\r
-        */\r
-       public $matches = array();\r
-       \r
-       /**\r
-        * condtion builder object\r
-        * @var wcf\system\database\condition\PreparedStatementConditionBuilder\r
-        */\r
-       public $conditions = null;\r
-       \r
-       /**\r
-        * search id\r
-        * @var integer\r
-        */\r
-       public $searchID = 0;\r
-       \r
-       /**\r
-        * sort field\r
-        * @var string\r
-        */\r
-       public $sortField = 'username';\r
-       \r
-       /**\r
-        * sort order\r
-        * @var string\r
-        */\r
-       public $sortOrder = 'ASC';\r
-       \r
-       /**\r
-        * results per page\r
-        * @var integer\r
-        */\r
-       public $itemsPerPage = 50;\r
-       \r
-       /**\r
-        * shown columns\r
-        * @var array<string>\r
-        */\r
-       public $columns = array('email', 'registrationDate');\r
-       \r
-       /**\r
-        * number of results\r
-        * @var integer\r
-        */\r
-       public $maxResults = 0;\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               parent::readFormParameters();\r
-               \r
-               if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);\r
-               if (isset($_POST['email'])) $this->email = StringUtil::trim($_POST['email']);\r
-               if (isset($_POST['userID'])) $this->userID = intval($_POST['userID']);\r
-               if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);\r
-               if (isset($_POST['languageIDs']) && is_array($_POST['languageIDs'])) $this->languageIDs = ArrayUtil::toIntegerArray($_POST['languageIDs']);\r
-               if (isset($_POST['invertGroupIDs'])) $this->invertGroupIDs = intval($_POST['invertGroupIDs']);\r
-               \r
-               if (isset($_POST['itemsPerPage'])) $this->itemsPerPage = intval($_POST['itemsPerPage']);\r
-               if (isset($_POST['sortField'])) $this->sortField = $_POST['sortField'];\r
-               if (isset($_POST['sortOrder'])) $this->sortOrder = $_POST['sortOrder'];\r
-               if (isset($_POST['columns']) && is_array($_POST['columns'])) $this->columns = $_POST['columns'];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               $this->optionTree = $this->getCategoryOptions('profile');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'username' => $this->username,\r
-                       'email' => $this->email,\r
-                       'userID' => $this->userID,\r
-                       'groupIDs' => $this->groupIDs,\r
-                       'languageIDs' => $this->languageIDs,\r
-                       'optionTree' => $this->optionTree,\r
-                       'availableGroups' => $this->getAvailableGroups(),\r
-                       'availableLanguages' => $this->getAvailablelanguages(),\r
-                       'invertGroupIDs' => $this->invertGroupIDs,\r
-                       'sortField' => $this->sortField,\r
-                       'sortOrder' => $this->sortOrder,\r
-                       'itemsPerPage' => $this->itemsPerPage,\r
-                       'columns' => $this->columns\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::show()\r
-        */\r
-       public function show() {\r
-               // set active menu item\r
-               ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);\r
-               \r
-               // get user options and categories from cache\r
-               $this->readCache();\r
-               \r
-               // show form\r
-               parent::show();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */     \r
-       public function save() {\r
-               parent::save();\r
-               \r
-               // store search result in database\r
-               $data = serialize(array(\r
-                       'matches' => $this->matches,\r
-                       'itemsPerPage' => $this->itemsPerPage,\r
-                       'columns' => $this->columns\r
-               ));\r
-               \r
-               $search = SearchEditor::create(array(\r
-                       'userID' => WCF::getUser()->userID,\r
-                       'searchData' => $data,\r
-                       'searchTime' => TIME_NOW,\r
-                       'searchType' => 'users'\r
-               ));\r
-               \r
-               // get new search id\r
-               $this->searchID = $search->searchID;\r
-               $this->saved();\r
-               \r
-               // forward to result page\r
-               HeaderUtil::redirect('index.php?page=UserList&searchID='.$this->searchID.'&sortField='.rawurlencode($this->sortField).'&sortOrder='.rawurlencode($this->sortOrder).''.SID_ARG_2ND_NOT_ENCODED);\r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               AbstractForm::validate();\r
-               \r
-               // do search\r
-               $this->search();\r
-               \r
-               if (count($this->matches) == 0) {\r
-                       throw new UserInputException('search', 'noMatches');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Search for users which fit to the search values.\r
-        */\r
-       protected function search() {\r
-               $this->matches = array();\r
-               $sql = "SELECT          user_table.userID\r
-                       FROM            wcf".WCF_N."_user user_table\r
-                       LEFT JOIN       wcf".WCF_N."_user_option_value option_value \r
-                       ON              (option_value.userID = user_table.userID)";\r
-               \r
-               // build search condition\r
-               $this->conditions = new PreparedStatementConditionBuilder(); \r
-               \r
-               // static fields\r
-               $this->buildStaticConditions();\r
-               \r
-               // dynamic fields\r
-               $this->buildDynamicConditions();\r
-               \r
-               // call buildConditions event\r
-               EventHandler::getInstance()->fireAction($this, 'buildConditions');\r
-\r
-               // do search\r
-               $statement = WCF::getDB()->prepareStatement($sql.$this->conditions, $this->maxResults);\r
-               $statement->execute($this->conditions->getParameters());\r
-               while ($row = $statement->fetchArray()) {\r
-                       $this->matches[] = $row['userID'];      \r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Builds the static conditions.\r
-        */\r
-       protected function buildStaticConditions() {\r
-               if (!empty($this->username)) {\r
-                       $this->conditions->add("user_table.username LIKE ?", array('%'.addcslashes($this->username, '_%').'%'));\r
-               }\r
-               if (!empty($this->userID)) {\r
-                       $this->conditions->add("user_table.userID LIKE ?", array('%'.$this->userID.'%'));\r
-               }\r
-               if (!empty($this->email)) {\r
-                       $this->conditions->add("user_table.email LIKE ?", array('%'.addcslashes($this->email, '_%').'%'));\r
-               }\r
-               if (count($this->groupIDs)) {\r
-                       $this->conditions->add("user_table.userID ".($this->invertGroupIDs == 1 ? 'NOT ' : '')."IN (SELECT userID FROM wcf".WCF_N."_user_to_group WHERE groupID IN (?))", array($this->groupIDs));\r
-               }\r
-               if (count($this->languageIDs)) {\r
-                       $this->conditions->add("user_table.languageID IN (?)", array($this->languageIDs));\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Builds the dynamic conditions.\r
-        */\r
-       protected function buildDynamicConditions() {\r
-               foreach ($this->options as $option) {\r
-                       $value = isset($this->values[$option->optionName]) ? $this->values[$option->optionName] : null;\r
-                       $condition = $this->getTypeObject($option->optionType)->getCondition($option, $value);\r
-                       if ($condition !== false) $this->conditions->add($condition);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\SearchableOptionType::getSearchFormElement()\r
-        */\r
-       protected function getFormElement($type, Option $option) {\r
-               return $this->getTypeObject($type)->getSearchFormElement($option);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\acp\form\DynamicOptionListForm::checkOption()\r
-        */\r
-       protected static function checkOption(Option $option) {\r
-               return ($option->searchable == 1 && !$option->disabled && ($option->visible == 3 || $option->visible < 2));\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\option\Option;
+use wcf\data\search\SearchEditor;
+use wcf\form\AbstractForm;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\UserInputException;
+use wcf\system\wcf;
+use wcf\util\ArrayUtil;
+use wcf\util\HeaderUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the user search form.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.form
+ * @category   Community Framework
+ */
+class UserSearchForm extends UserOptionListForm {
+       /**
+        * @see wcf\page\AbstractPage::$templateName
+        */
+       public $templateName = 'userSearch';
+       
+       /**
+        * active menu item name
+        * @var string
+        */
+       public $menuItemName = 'wcf.acp.menu.link.user.search';
+       
+       /**
+        * @see wcf\page\AbstractPage::$neededPermissions
+        */
+       public $neededPermissions = array('admin.user.canSearchUser');
+       
+       /**
+        * username 
+        * @var string
+        */
+       public $username = '';
+       
+       /**
+        * email address
+        * @var string
+        */
+       public $email = '';
+       
+       /**
+        * user id
+        * @var integer
+        */
+       public $userID = 0;
+
+       /**
+        * group ids
+        * @var array<integer>
+        */
+       public $groupIDs = array();
+       
+       /**
+        * true to invert the given group ids
+        * @var boolean
+        */
+       public $invertGroupIDs = 0;
+       
+       /**
+        * language ids
+        * @var array<integer>
+        */
+       public $languageIDs = array();
+       
+       /**
+        * matches
+        * @var array<integer>
+        */
+       public $matches = array();
+       
+       /**
+        * condtion builder object
+        * @var wcf\system\database\condition\PreparedStatementConditionBuilder
+        */
+       public $conditions = null;
+       
+       /**
+        * search id
+        * @var integer
+        */
+       public $searchID = 0;
+       
+       /**
+        * sort field
+        * @var string
+        */
+       public $sortField = 'username';
+       
+       /**
+        * sort order
+        * @var string
+        */
+       public $sortOrder = 'ASC';
+       
+       /**
+        * results per page
+        * @var integer
+        */
+       public $itemsPerPage = 50;
+       
+       /**
+        * shown columns
+        * @var array<string>
+        */
+       public $columns = array('email', 'registrationDate');
+       
+       /**
+        * number of results
+        * @var integer
+        */
+       public $maxResults = 0;
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               parent::readFormParameters();
+               
+               if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);
+               if (isset($_POST['email'])) $this->email = StringUtil::trim($_POST['email']);
+               if (isset($_POST['userID'])) $this->userID = intval($_POST['userID']);
+               if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);
+               if (isset($_POST['languageIDs']) && is_array($_POST['languageIDs'])) $this->languageIDs = ArrayUtil::toIntegerArray($_POST['languageIDs']);
+               if (isset($_POST['invertGroupIDs'])) $this->invertGroupIDs = intval($_POST['invertGroupIDs']);
+               
+               if (isset($_POST['itemsPerPage'])) $this->itemsPerPage = intval($_POST['itemsPerPage']);
+               if (isset($_POST['sortField'])) $this->sortField = $_POST['sortField'];
+               if (isset($_POST['sortOrder'])) $this->sortOrder = $_POST['sortOrder'];
+               if (isset($_POST['columns']) && is_array($_POST['columns'])) $this->columns = $_POST['columns'];
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               $this->optionTree = $this->getCategoryOptions('profile');
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'username' => $this->username,
+                       'email' => $this->email,
+                       'userID' => $this->userID,
+                       'groupIDs' => $this->groupIDs,
+                       'languageIDs' => $this->languageIDs,
+                       'optionTree' => $this->optionTree,
+                       'availableGroups' => $this->getAvailableGroups(),
+                       'availableLanguages' => $this->getAvailablelanguages(),
+                       'invertGroupIDs' => $this->invertGroupIDs,
+                       'sortField' => $this->sortField,
+                       'sortOrder' => $this->sortOrder,
+                       'itemsPerPage' => $this->itemsPerPage,
+                       'columns' => $this->columns
+               ));
+       }
+       
+       /**
+        * @see wcf\form\IForm::show()
+        */
+       public function show() {
+               // set active menu item
+               ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);
+               
+               // get user options and categories from cache
+               $this->readCache();
+               
+               // show form
+               parent::show();
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */     
+       public function save() {
+               parent::save();
+               
+               // store search result in database
+               $data = serialize(array(
+                       'matches' => $this->matches,
+                       'itemsPerPage' => $this->itemsPerPage,
+                       'columns' => $this->columns
+               ));
+               
+               $search = SearchEditor::create(array(
+                       'userID' => WCF::getUser()->userID,
+                       'searchData' => $data,
+                       'searchTime' => TIME_NOW,
+                       'searchType' => 'users'
+               ));
+               
+               // get new search id
+               $this->searchID = $search->searchID;
+               $this->saved();
+               
+               // forward to result page
+               HeaderUtil::redirect('index.php?page=UserList&searchID='.$this->searchID.'&sortField='.rawurlencode($this->sortField).'&sortOrder='.rawurlencode($this->sortOrder).''.SID_ARG_2ND_NOT_ENCODED);
+               exit;
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               AbstractForm::validate();
+               
+               // do search
+               $this->search();
+               
+               if (count($this->matches) == 0) {
+                       throw new UserInputException('search', 'noMatches');
+               }
+       }
+       
+       /**
+        * Search for users which fit to the search values.
+        */
+       protected function search() {
+               $this->matches = array();
+               $sql = "SELECT          user_table.userID
+                       FROM            wcf".WCF_N."_user user_table
+                       LEFT JOIN       wcf".WCF_N."_user_option_value option_value 
+                       ON              (option_value.userID = user_table.userID)";
+               
+               // build search condition
+               $this->conditions = new PreparedStatementConditionBuilder(); 
+               
+               // static fields
+               $this->buildStaticConditions();
+               
+               // dynamic fields
+               $this->buildDynamicConditions();
+               
+               // call buildConditions event
+               EventHandler::getInstance()->fireAction($this, 'buildConditions');
+
+               // do search
+               $statement = WCF::getDB()->prepareStatement($sql.$this->conditions, $this->maxResults);
+               $statement->execute($this->conditions->getParameters());
+               while ($row = $statement->fetchArray()) {
+                       $this->matches[] = $row['userID'];      
+               }
+       }
+       
+       /**
+        * Builds the static conditions.
+        */
+       protected function buildStaticConditions() {
+               if (!empty($this->username)) {
+                       $this->conditions->add("user_table.username LIKE ?", array('%'.addcslashes($this->username, '_%').'%'));
+               }
+               if (!empty($this->userID)) {
+                       $this->conditions->add("user_table.userID LIKE ?", array('%'.$this->userID.'%'));
+               }
+               if (!empty($this->email)) {
+                       $this->conditions->add("user_table.email LIKE ?", array('%'.addcslashes($this->email, '_%').'%'));
+               }
+               if (count($this->groupIDs)) {
+                       $this->conditions->add("user_table.userID ".($this->invertGroupIDs == 1 ? 'NOT ' : '')."IN (SELECT userID FROM wcf".WCF_N."_user_to_group WHERE groupID IN (?))", array($this->groupIDs));
+               }
+               if (count($this->languageIDs)) {
+                       $this->conditions->add("user_table.languageID IN (?)", array($this->languageIDs));
+               }
+       }
+       
+       /**
+        * Builds the dynamic conditions.
+        */
+       protected function buildDynamicConditions() {
+               foreach ($this->options as $option) {
+                       $value = isset($this->values[$option->optionName]) ? $this->values[$option->optionName] : null;
+                       $condition = $this->getTypeObject($option->optionType)->getCondition($option, $value);
+                       if ($condition !== false) $this->conditions->add($condition);
+               }
+       }
+       
+       /**
+        * @see wcf\system\option\SearchableOptionType::getSearchFormElement()
+        */
+       protected function getFormElement($type, Option $option) {
+               return $this->getTypeObject($type)->getSearchFormElement($option);
+       }
+       
+       /**
+        * @see wcf\acp\form\DynamicOptionListForm::checkOption()
+        */
+       protected static function checkOption(Option $option) {
+               return ($option->searchable == 1 && !$option->disabled && ($option->visible == 3 || $option->visible < 2));
+       }
+}
index bd3f22f4ab08c45eaa48b7b0aff36d1b76da3e25..fc319b70ce76ec71aed129faf80781e21c0da3fa 100755 (executable)
@@ -1,58 +1,58 @@
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\page\AbstractPage;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-\r
-/**\r
- * Shows the welcome page in admin control panel.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category   Community Framework\r
- */\r
-class IndexPage extends AbstractPage {\r
-       // system\r
-       public $templateName = 'index';\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               $wcfPackageID = WCFACP::getWcfPackageID();\r
-               // check package installation queue\r
-               if ($wcfPackageID == 0) {\r
-                       $queueID = PackageInstallationDispatcher::checkPackageInstallationQueue();\r
-                       \r
-                       if ($queueID) {\r
-                               WCF::getTPL()->assign(array(\r
-                                       'queueID' => $queueID\r
-                               ));\r
-                               WCF::getTPL()->display('packageInstallationSetup');\r
-                               exit;\r
-                       }\r
-               }\r
-               \r
-               /*\r
-               if (WCFACP::getWcfPackageID() == PACKAGE_ID) {\r
-                       $packages = CacheHandler::getInstance()->get('packages');\r
-                       foreach ($packages as $packageID => $package) {\r
-                               break;\r
-                       }\r
-                       \r
-                       if (isset($packageID) && $packageID != PACKAGE_ID) {\r
-                               HeaderUtil::redirect('../'.$packages[$packageID]['packageDir'].'acp/index.php'.SID_ARG_1ST, false);\r
-                               exit;\r
-                       }\r
-               }\r
-               */\r
-               \r
-               // show page\r
-               parent::show();\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\page\AbstractPage;
+use wcf\system\cache\CacheHandler;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+
+/**
+ * Shows the welcome page in admin control panel.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.page
+ * @category   Community Framework
+ */
+class IndexPage extends AbstractPage {
+       // system
+       public $templateName = 'index';
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               $wcfPackageID = WCFACP::getWcfPackageID();
+               // check package installation queue
+               if ($wcfPackageID == 0) {
+                       $queueID = PackageInstallationDispatcher::checkPackageInstallationQueue();
+                       
+                       if ($queueID) {
+                               WCF::getTPL()->assign(array(
+                                       'queueID' => $queueID
+                               ));
+                               WCF::getTPL()->display('packageInstallationSetup');
+                               exit;
+                       }
+               }
+               
+               /*
+               if (WCFACP::getWcfPackageID() == PACKAGE_ID) {
+                       $packages = CacheHandler::getInstance()->get('packages');
+                       foreach ($packages as $packageID => $package) {
+                               break;
+                       }
+                       
+                       if (isset($packageID) && $packageID != PACKAGE_ID) {
+                               HeaderUtil::redirect('../'.$packages[$packageID]['packageDir'].'acp/index.php'.SID_ARG_1ST, false);
+                               exit;
+                       }
+               }
+               */
+               
+               // show page
+               parent::show();
+       }
+}
index 0f01d3adc2a4c828baa566889508bee7ac5e3116..725ee6d010b5c2fd01dc19715cb95e30557db120 100755 (executable)
@@ -1,94 +1,94 @@
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\package\PackageList;\r
-use wcf\page\SortablePage;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows a list of all installed packages.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category   Community Framework\r
- */\r
-class PackageListPage extends SortablePage {\r
-       // system\r
-       public $templateName = 'packageList';\r
-       public $neededPermissions = array('admin.system.package.canUpdatePackage', 'admin.system.package.canUninstallPackage');\r
-       public $itemsPerPage = 50;\r
-       public $defaultSortField = 'packageType';\r
-       public $defaultSortOrder = 'DESC';\r
-       \r
-       /**\r
-        * list of packages\r
-        * \r
-        * @var PackageList\r
-        */\r
-       public $packageList = null;\r
-       \r
-       /**\r
-        * class name for DatabaseObjectList\r
-        * \r
-        * @var string\r
-        */     \r
-       public $objectListClassName = 'wcf\data\package\PackageList';\r
-       \r
-       /**\r
-        * @see wcf\page\MuletipleLinkPage::readObjects()\r
-        */     \r
-       protected function readObjects() {\r
-               $this->sqlOrderBy = 'package.'.($this->sortField == 'packageType' ? 'standalone '.$this->sortOrder.', package.parentPackageID '.$this->sortOrder : $this->sortField.' '.$this->sortOrder).($this->sortField != 'packageName' ? ', package.packageName ASC' : '');\r
-               \r
-               parent::readObjects();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign('packages', $this->objectList->getObjects());\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               // enable menu item\r
-               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.view');\r
-               \r
-               parent::show();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\SortablePage::validateSortField()\r
-        */\r
-       public function validateSortField() {\r
-               parent::validateSortField();\r
-               \r
-               switch ($this->sortField) {\r
-                       case 'packageID':\r
-                       case 'package':\r
-                       case 'packageDir':\r
-                       case 'packageName':\r
-                       case 'instanceNo':\r
-                       case 'packageDescription':\r
-                       case 'packageVersion':\r
-                       case 'packageDate':\r
-                       case 'packageURL':\r
-                       case 'parentPackageID':\r
-                       case 'isUnique':\r
-                       case 'standalone':\r
-                       case 'author':\r
-                       case 'authorURL':\r
-                       case 'installDate':\r
-                       case 'updateDate': break;\r
-                       default: $this->sortField = $this->defaultSortField;\r
-               }\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\package\PackageList;
+use wcf\page\SortablePage;
+use wcf\system\WCF;
+
+/**
+ * Shows a list of all installed packages.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.page
+ * @category   Community Framework
+ */
+class PackageListPage extends SortablePage {
+       // system
+       public $templateName = 'packageList';
+       public $neededPermissions = array('admin.system.package.canUpdatePackage', 'admin.system.package.canUninstallPackage');
+       public $itemsPerPage = 50;
+       public $defaultSortField = 'packageType';
+       public $defaultSortOrder = 'DESC';
+       
+       /**
+        * list of packages
+        * 
+        * @var PackageList
+        */
+       public $packageList = null;
+       
+       /**
+        * class name for DatabaseObjectList
+        * 
+        * @var string
+        */     
+       public $objectListClassName = 'wcf\data\package\PackageList';
+       
+       /**
+        * @see wcf\page\MuletipleLinkPage::readObjects()
+        */     
+       protected function readObjects() {
+               $this->sqlOrderBy = 'package.'.($this->sortField == 'packageType' ? 'standalone '.$this->sortOrder.', package.parentPackageID '.$this->sortOrder : $this->sortField.' '.$this->sortOrder).($this->sortField != 'packageName' ? ', package.packageName ASC' : '');
+               
+               parent::readObjects();
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign('packages', $this->objectList->getObjects());
+       }
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               // enable menu item
+               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.view');
+               
+               parent::show();
+       }
+       
+       /**
+        * @see wcf\page\SortablePage::validateSortField()
+        */
+       public function validateSortField() {
+               parent::validateSortField();
+               
+               switch ($this->sortField) {
+                       case 'packageID':
+                       case 'package':
+                       case 'packageDir':
+                       case 'packageName':
+                       case 'instanceNo':
+                       case 'packageDescription':
+                       case 'packageVersion':
+                       case 'packageDate':
+                       case 'packageURL':
+                       case 'parentPackageID':
+                       case 'isUnique':
+                       case 'standalone':
+                       case 'author':
+                       case 'authorURL':
+                       case 'installDate':
+                       case 'updateDate': break;
+                       default: $this->sortField = $this->defaultSortField;
+               }
+       }
+}
index ce184d46edec448180f86fe91fa50f93b90bbef3..bcd0139c28670fc592d6bddbd0f5f9b96a898056 100755 (executable)
@@ -1,77 +1,77 @@
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\data\package\installation\queue\PackageInstallationQueue;\r
-use wcf\page\AbstractPage;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\system\package\PackageUninstallationDispatcher;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-\r
-/**\r
- * Handles all request on the package.php script\r
- * and executes the requested action.\r
- * TODO: split this page into separate pages / actions\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category   Community Framework\r
- */\r
-class PackagePage extends AbstractPage {\r
-       const DO_NOT_LOG = true;\r
-       public $parentQueueID = 0;\r
-       public $processNo = 0;\r
-       public $queueID = 0;\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_REQUEST['parentQueueID'])) $this->parentQueueID = intval($_REQUEST['parentQueueID']);\r
-               if (isset($_REQUEST['processNo'])) $this->processNo = intval($_REQUEST['processNo']);\r
-               if (isset($_REQUEST['queueID'])) $this->queueID = intval($_REQUEST['queueID']);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               parent::show();\r
-\r
-               // check master password\r
-               WCFACP::checkMasterPassword();\r
-               \r
-               switch ($this->action) {\r
-                       case 'install':\r
-                       case 'update':\r
-                               if ($this->action == 'install') WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));\r
-                               else WCF::getSession()->checkPermission(array('admin.system.package.canUpdatePackage'));\r
-                               \r
-                               $queue = new PackageInstallationQueue($this->queueID);\r
-                               $dispatcher = new PackageInstallationDispatcher($queue);\r
-                               $dispatcher->beginInstallation();\r
-                       break;\r
-                               \r
-                       case 'rollback':\r
-                               die('ROLLBACK');\r
-                               WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));\r
-                               require_once(WCF_DIR.'lib/acp/package/PackageInstallationRollback.class.php');\r
-                               new PackageInstallationRollback($this->queueID);\r
-                       break;\r
-                       \r
-                       case 'openQueue':\r
-                               PackageInstallationDispatcher::openQueue($this->parentQueueID, $this->processNo);\r
-                       break;\r
-                               \r
-                       case 'startUninstall':\r
-                               WCF::getSession()->checkPermission(array('admin.system.package.canUninstallPackage'));\r
-                               PackageUninstallationDispatcher::checkDependencies();\r
-                       break;\r
-               }\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\data\package\installation\queue\PackageInstallationQueue;
+use wcf\page\AbstractPage;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\system\package\PackageUninstallationDispatcher;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+
+/**
+ * Handles all request on the package.php script
+ * and executes the requested action.
+ * TODO: split this page into separate pages / actions
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.page
+ * @category   Community Framework
+ */
+class PackagePage extends AbstractPage {
+       const DO_NOT_LOG = true;
+       public $parentQueueID = 0;
+       public $processNo = 0;
+       public $queueID = 0;
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_REQUEST['parentQueueID'])) $this->parentQueueID = intval($_REQUEST['parentQueueID']);
+               if (isset($_REQUEST['processNo'])) $this->processNo = intval($_REQUEST['processNo']);
+               if (isset($_REQUEST['queueID'])) $this->queueID = intval($_REQUEST['queueID']);
+       }
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               parent::show();
+
+               // check master password
+               WCFACP::checkMasterPassword();
+               
+               switch ($this->action) {
+                       case 'install':
+                       case 'update':
+                               if ($this->action == 'install') WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));
+                               else WCF::getSession()->checkPermission(array('admin.system.package.canUpdatePackage'));
+                               
+                               $queue = new PackageInstallationQueue($this->queueID);
+                               $dispatcher = new PackageInstallationDispatcher($queue);
+                               $dispatcher->beginInstallation();
+                       break;
+                               
+                       case 'rollback':
+                               die('ROLLBACK');
+                               WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));
+                               require_once(WCF_DIR.'lib/acp/package/PackageInstallationRollback.class.php');
+                               new PackageInstallationRollback($this->queueID);
+                       break;
+                       
+                       case 'openQueue':
+                               PackageInstallationDispatcher::openQueue($this->parentQueueID, $this->processNo);
+                       break;
+                               
+                       case 'startUninstall':
+                               WCF::getSession()->checkPermission(array('admin.system.package.canUninstallPackage'));
+                               PackageUninstallationDispatcher::checkDependencies();
+                       break;
+               }
+       }
+}
index 58b580ac4995c7b93f710c3a8eb15caa6004480c..30a673914ffe49267289292007d729a92d0d6148 100755 (executable)
@@ -1,77 +1,77 @@
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\package\Package;\r
-use wcf\page\AbstractPage;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows all information about an installed package.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category   Community Framework\r
- */\r
-class PackageViewPage extends AbstractPage {\r
-       public $package;\r
-       public $packageID = 0;\r
-       public $templateName = 'packageView';\r
-       public $neededPermissions = array('admin.system.package.canUpdatePackage', 'admin.system.package.canUninstallPackage');\r
-       public $requiredPackages = array();\r
-       public $dependentPackages = array();\r
-       public $dependencies = array();\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_REQUEST['activePackageID'])) $this->packageID = intval($_REQUEST['activePackageID']);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               // get package data\r
-               try {\r
-                       $this->package = new Package($this->packageID);\r
-                       $this->requiredPackages = $this->package->getRequiredPackages();\r
-                       $this->dependentPackages = $this->package->getDependentPackages();\r
-                       $this->dependencies = $this->package->getDependencies();\r
-               }\r
-               catch (SystemException $e) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'requiredPackages' => $this->requiredPackages,\r
-                       'dependentPackages' => $this->dependentPackages,\r
-                       'dependencies' => $this->dependencies,\r
-                       'package' => $this->package\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               // enable menu item\r
-               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package');\r
-               \r
-               parent::show();\r
-       }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\package\Package;
+use wcf\page\AbstractPage;
+use wcf\system\WCF;
+
+/**
+ * Shows all information about an installed package.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.page
+ * @category   Community Framework
+ */
+class PackageViewPage extends AbstractPage {
+       public $package;
+       public $packageID = 0;
+       public $templateName = 'packageView';
+       public $neededPermissions = array('admin.system.package.canUpdatePackage', 'admin.system.package.canUninstallPackage');
+       public $requiredPackages = array();
+       public $dependentPackages = array();
+       public $dependencies = array();
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_REQUEST['activePackageID'])) $this->packageID = intval($_REQUEST['activePackageID']);
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               // get package data
+               try {
+                       $this->package = new Package($this->packageID);
+                       $this->requiredPackages = $this->package->getRequiredPackages();
+                       $this->dependentPackages = $this->package->getDependentPackages();
+                       $this->dependencies = $this->package->getDependencies();
+               }
+               catch (SystemException $e) {
+                       throw new IllegalLinkException();
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'requiredPackages' => $this->requiredPackages,
+                       'dependentPackages' => $this->dependentPackages,
+                       'dependencies' => $this->dependencies,
+                       'package' => $this->package
+               ));
+       }
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               // enable menu item
+               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package');
+               
+               parent::show();
+       }
+}
index 70015d7493680cba5c03fa6a899217d73e8857ea..6a30bf9fce6bb03341a965c5ecd5ed2e4165abe2 100755 (executable)
@@ -1,85 +1,85 @@
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\page\SortablePage;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows information about available update package servers.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category   Community Framework\r
- */\r
-class UpdateServerListPage extends SortablePage {\r
-       // system\r
-       public $templateName = 'updateServerList';\r
-       public $neededPermissions = array('admin.system.package.canEditServer');\r
-       public $defaultSortField = 'serverURL';\r
-       public $deletedPackageUpdateServerID = 0;\r
-       \r
-       /**\r
-        * @see wcf\page\MultipleLinkPage::$objectListClassName\r
-        */     \r
-       public $objectListClassName = 'wcf\data\package\update\server\PackageUpdateServerList';\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_REQUEST['deletedPackageUpdateServerID'])) $this->deletedPackageUpdateServerID = intval($_REQUEST['deletedPackageUpdateServerID']);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\MultipleLinkPage::readObjects()\r
-        */     \r
-       public function readObjects() {\r
-               $this->sqlOrderBy = ($this->sortField != 'packages' ? 'package_update_server.' : '') . $this->sortField.' '.$this->sortOrder;\r
-               \r
-               parent::readObjects();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'updateServers' => $this->objectList->getObjects(),\r
-                       'deletedPackageUpdateServerID' => $this->deletedPackageUpdateServerID\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               // enable menu item\r
-               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.server.view');\r
-               \r
-               parent::show();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\SortablePage::validateSortField()\r
-        */\r
-       public function validateSortField() {\r
-               parent::validateSortField();\r
-               \r
-               switch ($this->sortField) {\r
-                       case 'packageUpdateServerID':\r
-                       case 'serverURL':\r
-                       case 'status':\r
-                       case 'errorMessage':\r
-                       case 'lastUpdateTime':\r
-                       case 'packages': break;\r
-                       default: $this->sortField = $this->defaultSortField;\r
-               }\r
-       }\r
+<?php
+namespace wcf\acp\page;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\page\SortablePage;
+use wcf\system\WCF;
+
+/**
+ * Shows information about available update package servers.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.page
+ * @category   Community Framework
+ */
+class UpdateServerListPage extends SortablePage {
+       // system
+       public $templateName = 'updateServerList';
+       public $neededPermissions = array('admin.system.package.canEditServer');
+       public $defaultSortField = 'serverURL';
+       public $deletedPackageUpdateServerID = 0;
+       
+       /**
+        * @see wcf\page\MultipleLinkPage::$objectListClassName
+        */     
+       public $objectListClassName = 'wcf\data\package\update\server\PackageUpdateServerList';
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_REQUEST['deletedPackageUpdateServerID'])) $this->deletedPackageUpdateServerID = intval($_REQUEST['deletedPackageUpdateServerID']);
+       }
+       
+       /**
+        * @see wcf\page\MultipleLinkPage::readObjects()
+        */     
+       public function readObjects() {
+               $this->sqlOrderBy = ($this->sortField != 'packages' ? 'package_update_server.' : '') . $this->sortField.' '.$this->sortOrder;
+               
+               parent::readObjects();
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'updateServers' => $this->objectList->getObjects(),
+                       'deletedPackageUpdateServerID' => $this->deletedPackageUpdateServerID
+               ));
+       }
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               // enable menu item
+               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.server.view');
+               
+               parent::show();
+       }
+       
+       /**
+        * @see wcf\page\SortablePage::validateSortField()
+        */
+       public function validateSortField() {
+               parent::validateSortField();
+               
+               switch ($this->sortField) {
+                       case 'packageUpdateServerID':
+                       case 'serverURL':
+                       case 'status':
+                       case 'errorMessage':
+                       case 'lastUpdateTime':
+                       case 'packages': break;
+                       default: $this->sortField = $this->defaultSortField;
+               }
+       }
 }
index 76a8d1723e59b8850b8e3b8e33c54f3295c444fd..58530cdd7b2783d48fa1262dae06654a3843ad1f 100755 (executable)
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\user\User;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\page\SortablePage;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the result of a user search.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category   Community Framework\r
- */\r
-class UserListPage extends SortablePage {\r
-       // system\r
-       public $itemsPerPage = 50;\r
-       public $defaultSortField = 'username';\r
-       public $templateName = 'userList';\r
-       public $neededPermissions = array('admin.user.canSearchUser');\r
-       \r
-       // parameters\r
-       public $searchID = 0;\r
-       \r
-       // data\r
-       public $userIDs = array();\r
-       public $markedUsers = array();\r
-       public $users = array();\r
-       public $url = '';\r
-       public $columns = array('email', 'registrationDate');\r
-       public $outputObjects = array();\r
-       public $options = array();\r
-       public $columnValues = array();\r
-       public $columnHeads = array();\r
-       public $sqlConditions = '';\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               $this->conditions = new PreparedStatementConditionBuilder();\r
-               \r
-               if (!empty($_REQUEST['searchID'])) {\r
-                       $this->searchID = intval($_REQUEST['searchID']);\r
-                       if ($this->searchID) $this->readSearchResult();\r
-                       if (!count($this->userIDs)) {\r
-                               throw new IllegalLinkException();\r
-                       }\r
-                       $this->conditions->add("user_table.userID IN (?)", array($this->userIDs));\r
-               }\r
-               \r
-               // get user options\r
-               $this->readUserOptions();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\SortablePage::validateSortField()\r
-        */\r
-       public function validateSortField() {\r
-               parent::validateSortField();\r
-               \r
-               switch ($this->sortField) {\r
-                       case 'email':\r
-                       case 'userID':\r
-                       case 'registrationDate':\r
-                       case 'username': break;\r
-                       default: \r
-                               if (!isset($this->options[$this->sortField])) {\r
-                                       $this->sortField = $this->defaultSortField;\r
-                               }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               // get marked users\r
-               $this->markedUsers = WCF::getSession()->getVar('markedUsers');\r
-               if ($this->markedUsers == null || !is_array($this->markedUsers)) $this->markedUsers = array();\r
-               \r
-               // get columns heads\r
-               $this->readColumnsHeads();\r
-               \r
-               // get users\r
-               $this->readUsers();\r
-               \r
-               // build page url\r
-               $this->url = 'index.php?page=UserList&searchID='.$this->searchID.'&action='.rawurlencode($this->action).'&pageNo='.$this->pageNo.'&sortField='.$this->sortField.'&sortOrder='.$this->sortOrder.''.SID_ARG_2ND_NOT_ENCODED;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'users' => $this->users,\r
-                       'searchID' => $this->searchID,\r
-                       'markedUsers' => count($this->markedUsers),\r
-                       'url' => $this->url,\r
-                       'columnHeads' => $this->columnHeads,\r
-                       'columnValues' => $this->columnValues\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               // set active menu item\r
-               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.user.'.($this->searchID ? 'search' : 'list'));\r
-               \r
-               parent::show();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\MultipleLinkPage::countItems()\r
-        */\r
-       public function countItems() {\r
-               // call countItems event\r
-               EventHandler::getInstance()->fireAction($this, 'countItems');\r
-\r
-               $sql = "SELECT  COUNT(*) AS count\r
-                       FROM    wcf".WCF_N."_user user_table\r
-                       ".$this->conditions;\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute($this->conditions->getParameters());\r
-               $row = $statement->fetchArray();\r
-               return $row['count'];\r
-       }\r
-       \r
-       /**\r
-        * Gets the list of results.\r
-        */\r
-       protected function readUsers() {\r
-               // get user ids\r
-               $userIDs = array();\r
-               $sql = "SELECT          user_table.userID\r
-                       FROM            wcf".WCF_N."_user user_table\r
-                       ".(isset($this->options[$this->sortField]) ? "LEFT JOIN wcf".WCF_N."_user_option_value user_option_value ON (user_option_value.userID = user.userID)" : '')."\r
-                       ".$this->conditions."\r
-                       ORDER BY        ".(($this->sortField != 'email' && isset($this->options[$this->sortField])) ? 'user_option_value.userOption'.$this->options[$this->sortField]['optionID'] : $this->sortField)." ".$this->sortOrder;\r
-               $statement = WCF::getDB()->prepareStatement($sql, $this->itemsPerPage, ($this->pageNo - 1) * $this->itemsPerPage);\r
-               $statement->execute($this->conditions->getParameters());\r
-               while ($row = $statement->fetchArray()) {\r
-                       $userIDs[] = $row['userID'];\r
-               }\r
-               \r
-               // get user data\r
-               if (count($userIDs)) {\r
-                       $userToGroups = array();\r
-                       \r
-                       // get group ids\r
-                       $conditions = new PreparedStatementConditionBuilder();\r
-                       $conditions->add("user_table.userID IN (?)", array($userIDs));\r
-                       \r
-                       $sql = "SELECT  userID, groupID\r
-                               FROM    wcf".WCF_N."_user_to_group user_table\r
-                               ".$conditions;\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute($conditions->getParameters());\r
-                       while ($row = $statement->fetchArray()) {\r
-                               $userToGroups[$row['userID']][] = $row['groupID'];\r
-                       }\r
-                       \r
-                       $sql = "SELECT          option_value.*, user_table.*\r
-                               FROM            wcf".WCF_N."_user user_table\r
-                               LEFT JOIN       wcf".WCF_N."_user_option_value option_value\r
-                               ON              (option_value.userID = user_table.userID)\r
-                               ".$conditions."\r
-                               ORDER BY        ".(($this->sortField != 'email' && isset($this->options[$this->sortField])) ? 'option_value.userOption'.$this->options[$this->sortField]['optionID'] : 'user_table.'.$this->sortField)." ".$this->sortOrder;\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute($conditions->getParameters());\r
-                       while ($row = $statement->fetchArray()) {\r
-                               $row['groupIDs'] = implode(',', $userToGroups[$row['userID']]);\r
-                               $accessible = UserGroup::isAccessibleGroup($userToGroups[$row['userID']]);\r
-                               $row['accessible'] = $accessible;\r
-                               $row['deletable'] = ($accessible && WCF::getSession()->getPermission('admin.user.canDeleteUser') && $row['userID'] != WCF::getUser()->userID) ? 1 : 0;\r
-                               $row['editable'] = ($accessible && WCF::getSession()->getPermission('admin.user.canEditUser')) ? 1 : 0;\r
-                               $row['isMarked'] = intval(in_array($row['userID'], $this->markedUsers));\r
-                               \r
-                               $this->users[] = new User(null, $row);\r
-                       }\r
-                       \r
-                       // get special columns\r
-                       foreach ($this->users as $key => $user) {\r
-                               foreach ($this->columns as $column) {\r
-                                       if (isset($this->options[$column])) {\r
-                                               if ($this->options[$column]['outputClass']) {\r
-                                                       $outputObj = $this->getOutputObject($this->options[$column]['outputClass']);\r
-                                                       $this->columnValues[$user->userID][$column] = $outputObj->getOutput($user, $this->options[$column], $user->{$column});\r
-                                               }\r
-                                               else {\r
-                                                       $this->columnValues[$user->userID][$column] = StringUtil::encodeHTML($user->{$column});\r
-                                               }\r
-                                       }\r
-                                       else {\r
-                                               switch ($column) {\r
-                                                       case 'email':\r
-                                                               $this->columnValues[$user->userID][$column] = '<a href="mailto:'.StringUtil::encodeHTML($user->email).'">'.StringUtil::encodeHTML($user->email).'</a>';\r
-                                                               break;\r
-                                                       case 'registrationDate':\r
-                                                               $this->columnValues[$user->userID][$column] = DateUtil::format(DateUtil::getDateTimeByTimestamp($user->{$column}), DateUtil::DATE_FORMAT);\r
-                                                               break;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Gets the result of the search with the given search id.\r
-        */\r
-       protected function readSearchResult() {\r
-               // get user search from database\r
-               $sql = "SELECT  searchData\r
-                       FROM    wcf".WCF_N."_search\r
-                       WHERE   searchID = ?\r
-                               AND userID = ?\r
-                               AND searchType = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array(\r
-                       $this->searchID,\r
-                       WCF::getUser()->userID,\r
-                       'users'\r
-               ));\r
-               $search = $statement->fetchArray();\r
-               if (!isset($search['searchData'])) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-               \r
-               $data = unserialize($search['searchData']);\r
-               $this->userIDs = $data['matches'];\r
-               $this->itemsPerPage = $data['itemsPerPage'];\r
-               $this->columns = $data['columns'];\r
-               unset($data);\r
-       }\r
-       \r
-       /**\r
-        * Gets the user options from cache.\r
-        */\r
-       protected function readUserOptions() {\r
-               // add cache resource\r
-               $cacheName = 'user-option-'.PACKAGE_ID;\r
-               CacheHandler::getInstance()->addResource($cacheName, WCF_DIR.'cache/cache.'.$cacheName.'.php', 'wcf\system\cache\builder\CacheBuilderOption');\r
-               \r
-               // get options\r
-               $this->options = CacheHandler::getInstance()->get($cacheName, 'options');\r
-       }\r
-       \r
-       /**\r
-        * Reads the column heads.\r
-        */\r
-       protected function readColumnsHeads() {\r
-               foreach ($this->columns as $column) {\r
-                       if (isset($this->options[$column])) {\r
-                               $this->columnHeads[$column] = 'wcf.user.option.'.$column;\r
-                       }\r
-                       else {\r
-                               $this->columnHeads[$column] = 'wcf.user.'.$column;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns an object of the requested option output type.\r
-        * \r
-        * @param       string                  $type\r
-        * @return      UserOptionOutput\r
-        */\r
-       protected function getOutputObject($className) {\r
-               if (!isset($this->outputObjects[$className])) {\r
-                       // include class file\r
-                       $classPath = WCF_DIR.'lib/data/user/option/'.$className.'.class.php';\r
-                       if (!file_exists($classPath)) {\r
-                               throw new SystemException("unable to find class file '".$classPath."'", 11000);\r
-                       }\r
-                       require_once($classPath);\r
-                       \r
-                       // create instance\r
-                       if (!class_exists($className)) {\r
-                               throw new SystemException("unable to find class '".$className."'", 11001);\r
-                       }\r
-                       $this->outputObjects[$className] = new $className();\r
-               }\r
-               \r
-               return $this->outputObjects[$className];\r
-       }\r
-\r
-       /**\r
-        * @see wcf\page\MultipleLinkPage::initObjectList()\r
-        */             \r
-       protected function initObjectList() { }\r
-       \r
-       /**\r
-        * @see wcf\page\MultipleLinkPage::readObjects()\r
-        */     \r
-       protected function readObjects() { }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\user\User;
+use wcf\data\user\group\UserGroup;
+use wcf\page\SortablePage;
+use wcf\system\cache\CacheHandler;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\event\EventHandler;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the result of a user search.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage acp.page
+ * @category   Community Framework
+ */
+class UserListPage extends SortablePage {
+       // system
+       public $itemsPerPage = 50;
+       public $defaultSortField = 'username';
+       public $templateName = 'userList';
+       public $neededPermissions = array('admin.user.canSearchUser');
+       
+       // parameters
+       public $searchID = 0;
+       
+       // data
+       public $userIDs = array();
+       public $markedUsers = array();
+       public $users = array();
+       public $url = '';
+       public $columns = array('email', 'registrationDate');
+       public $outputObjects = array();
+       public $options = array();
+       public $columnValues = array();
+       public $columnHeads = array();
+       public $sqlConditions = '';
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               $this->conditions = new PreparedStatementConditionBuilder();
+               
+               if (!empty($_REQUEST['searchID'])) {
+                       $this->searchID = intval($_REQUEST['searchID']);
+                       if ($this->searchID) $this->readSearchResult();
+                       if (!count($this->userIDs)) {
+                               throw new IllegalLinkException();
+                       }
+                       $this->conditions->add("user_table.userID IN (?)", array($this->userIDs));
+               }
+               
+               // get user options
+               $this->readUserOptions();
+       }
+       
+       /**
+        * @see wcf\page\SortablePage::validateSortField()
+        */
+       public function validateSortField() {
+               parent::validateSortField();
+               
+               switch ($this->sortField) {
+                       case 'email':
+                       case 'userID':
+                       case 'registrationDate':
+                       case 'username': break;
+                       default: 
+                               if (!isset($this->options[$this->sortField])) {
+                                       $this->sortField = $this->defaultSortField;
+                               }
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               // get marked users
+               $this->markedUsers = WCF::getSession()->getVar('markedUsers');
+               if ($this->markedUsers == null || !is_array($this->markedUsers)) $this->markedUsers = array();
+               
+               // get columns heads
+               $this->readColumnsHeads();
+               
+               // get users
+               $this->readUsers();
+               
+               // build page url
+               $this->url = 'index.php?page=UserList&searchID='.$this->searchID.'&action='.rawurlencode($this->action).'&pageNo='.$this->pageNo.'&sortField='.$this->sortField.'&sortOrder='.$this->sortOrder.''.SID_ARG_2ND_NOT_ENCODED;
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               WCF::getTPL()->assign(array(
+                       'users' => $this->users,
+                       'searchID' => $this->searchID,
+                       'markedUsers' => count($this->markedUsers),
+                       'url' => $this->url,
+                       'columnHeads' => $this->columnHeads,
+                       'columnValues' => $this->columnValues
+               ));
+       }
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               // set active menu item
+               ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.user.'.($this->searchID ? 'search' : 'list'));
+               
+               parent::show();
+       }
+       
+       /**
+        * @see wcf\page\MultipleLinkPage::countItems()
+        */
+       public function countItems() {
+               // call countItems event
+               EventHandler::getInstance()->fireAction($this, 'countItems');
+
+               $sql = "SELECT  COUNT(*) AS count
+                       FROM    wcf".WCF_N."_user user_table
+                       ".$this->conditions;
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute($this->conditions->getParameters());
+               $row = $statement->fetchArray();
+               return $row['count'];
+       }
+       
+       /**
+        * Gets the list of results.
+        */
+       protected function readUsers() {
+               // get user ids
+               $userIDs = array();
+               $sql = "SELECT          user_table.userID
+                       FROM            wcf".WCF_N."_user user_table
+                       ".(isset($this->options[$this->sortField]) ? "LEFT JOIN wcf".WCF_N."_user_option_value user_option_value ON (user_option_value.userID = user.userID)" : '')."
+                       ".$this->conditions."
+                       ORDER BY        ".(($this->sortField != 'email' && isset($this->options[$this->sortField])) ? 'user_option_value.userOption'.$this->options[$this->sortField]['optionID'] : $this->sortField)." ".$this->sortOrder;
+               $statement = WCF::getDB()->prepareStatement($sql, $this->itemsPerPage, ($this->pageNo - 1) * $this->itemsPerPage);
+               $statement->execute($this->conditions->getParameters());
+               while ($row = $statement->fetchArray()) {
+                       $userIDs[] = $row['userID'];
+               }
+               
+               // get user data
+               if (count($userIDs)) {
+                       $userToGroups = array();
+                       
+                       // get group ids
+                       $conditions = new PreparedStatementConditionBuilder();
+                       $conditions->add("user_table.userID IN (?)", array($userIDs));
+                       
+                       $sql = "SELECT  userID, groupID
+                               FROM    wcf".WCF_N."_user_to_group user_table
+                               ".$conditions;
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditions->getParameters());
+                       while ($row = $statement->fetchArray()) {
+                               $userToGroups[$row['userID']][] = $row['groupID'];
+                       }
+                       
+                       $sql = "SELECT          option_value.*, user_table.*
+                               FROM            wcf".WCF_N."_user user_table
+                               LEFT JOIN       wcf".WCF_N."_user_option_value option_value
+                               ON              (option_value.userID = user_table.userID)
+                               ".$conditions."
+                               ORDER BY        ".(($this->sortField != 'email' && isset($this->options[$this->sortField])) ? 'option_value.userOption'.$this->options[$this->sortField]['optionID'] : 'user_table.'.$this->sortField)." ".$this->sortOrder;
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditions->getParameters());
+                       while ($row = $statement->fetchArray()) {
+                               $row['groupIDs'] = implode(',', $userToGroups[$row['userID']]);
+                               $accessible = UserGroup::isAccessibleGroup($userToGroups[$row['userID']]);
+                               $row['accessible'] = $accessible;
+                               $row['deletable'] = ($accessible && WCF::getSession()->getPermission('admin.user.canDeleteUser') && $row['userID'] != WCF::getUser()->userID) ? 1 : 0;
+                               $row['editable'] = ($accessible && WCF::getSession()->getPermission('admin.user.canEditUser')) ? 1 : 0;
+                               $row['isMarked'] = intval(in_array($row['userID'], $this->markedUsers));
+                               
+                               $this->users[] = new User(null, $row);
+                       }
+                       
+                       // get special columns
+                       foreach ($this->users as $key => $user) {
+                               foreach ($this->columns as $column) {
+                                       if (isset($this->options[$column])) {
+                                               if ($this->options[$column]['outputClass']) {
+                                                       $outputObj = $this->getOutputObject($this->options[$column]['outputClass']);
+                                                       $this->columnValues[$user->userID][$column] = $outputObj->getOutput($user, $this->options[$column], $user->{$column});
+                                               }
+                                               else {
+                                                       $this->columnValues[$user->userID][$column] = StringUtil::encodeHTML($user->{$column});
+                                               }
+                                       }
+                                       else {
+                                               switch ($column) {
+                                                       case 'email':
+                                                               $this->columnValues[$user->userID][$column] = '<a href="mailto:'.StringUtil::encodeHTML($user->email).'">'.StringUtil::encodeHTML($user->email).'</a>';
+                                                               break;
+                                                       case 'registrationDate':
+                                                               $this->columnValues[$user->userID][$column] = DateUtil::format(DateUtil::getDateTimeByTimestamp($user->{$column}), DateUtil::DATE_FORMAT);
+                                                               break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+       
+       /**
+        * Gets the result of the search with the given search id.
+        */
+       protected function readSearchResult() {
+               // get user search from database
+               $sql = "SELECT  searchData
+                       FROM    wcf".WCF_N."_search
+                       WHERE   searchID = ?
+                               AND userID = ?
+                               AND searchType = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array(
+                       $this->searchID,
+                       WCF::getUser()->userID,
+                       'users'
+               ));
+               $search = $statement->fetchArray();
+               if (!isset($search['searchData'])) {
+                       throw new IllegalLinkException();
+               }
+               
+               $data = unserialize($search['searchData']);
+               $this->userIDs = $data['matches'];
+               $this->itemsPerPage = $data['itemsPerPage'];
+               $this->columns = $data['columns'];
+               unset($data);
+       }
+       
+       /**
+        * Gets the user options from cache.
+        */
+       protected function readUserOptions() {
+               // add cache resource
+               $cacheName = 'user-option-'.PACKAGE_ID;
+               CacheHandler::getInstance()->addResource($cacheName, WCF_DIR.'cache/cache.'.$cacheName.'.php', 'wcf\system\cache\builder\CacheBuilderOption');
+               
+               // get options
+               $this->options = CacheHandler::getInstance()->get($cacheName, 'options');
+       }
+       
+       /**
+        * Reads the column heads.
+        */
+       protected function readColumnsHeads() {
+               foreach ($this->columns as $column) {
+                       if (isset($this->options[$column])) {
+                               $this->columnHeads[$column] = 'wcf.user.option.'.$column;
+                       }
+                       else {
+                               $this->columnHeads[$column] = 'wcf.user.'.$column;
+                       }
+               }
+       }
+       
+       /**
+        * Returns an object of the requested option output type.
+        * 
+        * @param       string                  $type
+        * @return      UserOptionOutput
+        */
+       protected function getOutputObject($className) {
+               if (!isset($this->outputObjects[$className])) {
+                       // include class file
+                       $classPath = WCF_DIR.'lib/data/user/option/'.$className.'.class.php';
+                       if (!file_exists($classPath)) {
+                               throw new SystemException("unable to find class file '".$classPath."'", 11000);
+                       }
+                       require_once($classPath);
+                       
+                       // create instance
+                       if (!class_exists($className)) {
+                               throw new SystemException("unable to find class '".$className."'", 11001);
+                       }
+                       $this->outputObjects[$className] = new $className();
+               }
+               
+               return $this->outputObjects[$className];
+       }
+
+       /**
+        * @see wcf\page\MultipleLinkPage::initObjectList()
+        */             
+       protected function initObjectList() { }
+       
+       /**
+        * @see wcf\page\MultipleLinkPage::readObjects()
+        */     
+       protected function readObjects() { }
+}
index 28ba542387c6ae7cb582231f461f28bdad80bb0d..c33b460790b0abc0aa615c090ec9cb8153800424 100644 (file)
 <?php
-namespace wcf\action;\r
-use wcf\system\exception\AJAXException;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\ClassUtil;\r
-use wcf\util\JSON;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Default implementation for object-actions using the AJAX-API.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage action\r
- * @category   Community Framework\r
- */\r
-class AJAXProxyAction extends AbstractSecureAction {\r
-       /**\r
-        * class name\r
-        * @var string\r
-        */\r
-       protected $className = '';\r
-       \r
-       /**\r
-        * action name\r
-        * @var string\r
-        */\r
-       protected $actionName = '';\r
-       \r
-       /**\r
-        * list of object ids\r
-        * @var array<integer>\r
-        */\r
-       protected $objectIDs = array();\r
-       \r
-       /**\r
-        * additional parameters\r
-        * @var array<mixed>\r
-        */\r
-       protected $parameters = array();\r
-       \r
-       /**\r
-        * object action\r
-        * @var wcf\data\IDatabaseObjectAction\r
-        */\r
-       protected $objectAction = null;\r
-       \r
-       /**\r
-        * results of the executed action\r
-        * @var mixed\r
-        */\r
-       protected $response = null;\r
-       \r
-       /**\r
-        * @see AbstractAction::_construct()\r
-        */\r
-       public function __construct() {\r
-               try {\r
-                       parent::__construct();\r
-               }\r
-               catch (\Exception $e) {\r
-                       if ($e instanceof AJAXException) {\r
-                               throw $e;\r
-                       }\r
-                       else {\r
-                               throw new AJAXException($e->getMessage());\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see Action::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_POST['className'])) {\r
-                       $this->className = StringUtil::trim($_POST['className']);\r
-               }\r
-               if (isset($_POST['actionName'])) {\r
-                       $this->actionName = StringUtil::trim($_POST['actionName']);\r
-               }\r
-               if (isset($_POST['objectIDs'])) {\r
-                       if (is_array($_POST['objectIDs'])) $this->objectIDs = ArrayUtil::toIntegerArray($_POST['objectIDs']);\r
-               }\r
-               if (isset($_POST['parameters'])) {\r
-                       if (is_array($_POST['parameters'])) $this->parameters = $parameters;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see Action::execute()\r
-        */\r
-       public function execute() {\r
-               parent::execute();\r
-               \r
-               // validate class name\r
-               if (!class_exists($this->className)) {\r
-                       throw new AJAXException("unknown class '".$this->className."'");\r
-               }\r
-               if (!ClassUtil::isInstanceOf($this->className, 'wcf\data\IDatabaseObjectAction')) {\r
-                       throw new AJAXException("'".$this->className."' should implement wcf\system\IDatabaseObjectAction");\r
-               }\r
-               \r
-               // create object action instance\r
-               $this->objectAction = new $this->className($this->objectIDs, $this->actionName, $this->parameters);\r
-               \r
-               // validate action\r
-               try {\r
-                       $this->objectAction->validateAction();\r
-               }\r
-               catch (ValidateActionException $e) {\r
-                       throw new AJAXException("validation failed: ".$e->getMessage());\r
-               }\r
-               \r
-               // execute action\r
-               try {\r
-                       $this->response = $this->objectAction->executeAction();\r
-               }\r
-               catch (\Exception $e) {\r
-                       throw new AJAXException('unknown exception caught: '.$e->getMessage());\r
-               }\r
-               $this->executed();\r
-               \r
-               // send JSON-encoded response\r
-               header('Content-type: application/json');\r
-               echo JSON::encode($this->response);\r
-               exit;\r
-       }\r
+namespace wcf\action;
+use wcf\system\exception\AJAXException;
+use wcf\system\exception\ValidateActionException;
+use wcf\util\ArrayUtil;
+use wcf\util\ClassUtil;
+use wcf\util\JSON;
+use wcf\util\StringUtil;
+
+/**
+ * Default implementation for object-actions using the AJAX-API.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage action
+ * @category   Community Framework
+ */
+class AJAXProxyAction extends AbstractSecureAction {
+       /**
+        * class name
+        * @var string
+        */
+       protected $className = '';
+       
+       /**
+        * action name
+        * @var string
+        */
+       protected $actionName = '';
+       
+       /**
+        * list of object ids
+        * @var array<integer>
+        */
+       protected $objectIDs = array();
+       
+       /**
+        * additional parameters
+        * @var array<mixed>
+        */
+       protected $parameters = array();
+       
+       /**
+        * object action
+        * @var wcf\data\IDatabaseObjectAction
+        */
+       protected $objectAction = null;
+       
+       /**
+        * results of the executed action
+        * @var mixed
+        */
+       protected $response = null;
+       
+       /**
+        * @see AbstractAction::_construct()
+        */
+       public function __construct() {
+               try {
+                       parent::__construct();
+               }
+               catch (\Exception $e) {
+                       if ($e instanceof AJAXException) {
+                               throw $e;
+                       }
+                       else {
+                               throw new AJAXException($e->getMessage());
+                       }
+               }
+       }
+       
+       /**
+        * @see Action::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_POST['className'])) {
+                       $this->className = StringUtil::trim($_POST['className']);
+               }
+               if (isset($_POST['actionName'])) {
+                       $this->actionName = StringUtil::trim($_POST['actionName']);
+               }
+               if (isset($_POST['objectIDs'])) {
+                       if (is_array($_POST['objectIDs'])) $this->objectIDs = ArrayUtil::toIntegerArray($_POST['objectIDs']);
+               }
+               if (isset($_POST['parameters'])) {
+                       if (is_array($_POST['parameters'])) $this->parameters = $parameters;
+               }
+       }
+       
+       /**
+        * @see Action::execute()
+        */
+       public function execute() {
+               parent::execute();
+               
+               // validate class name
+               if (!class_exists($this->className)) {
+                       throw new AJAXException("unknown class '".$this->className."'");
+               }
+               if (!ClassUtil::isInstanceOf($this->className, 'wcf\data\IDatabaseObjectAction')) {
+                       throw new AJAXException("'".$this->className."' should implement wcf\system\IDatabaseObjectAction");
+               }
+               
+               // create object action instance
+               $this->objectAction = new $this->className($this->objectIDs, $this->actionName, $this->parameters);
+               
+               // validate action
+               try {
+                       $this->objectAction->validateAction();
+               }
+               catch (ValidateActionException $e) {
+                       throw new AJAXException("validation failed: ".$e->getMessage());
+               }
+               
+               // execute action
+               try {
+                       $this->response = $this->objectAction->executeAction();
+               }
+               catch (\Exception $e) {
+                       throw new AJAXException('unknown exception caught: '.$e->getMessage());
+               }
+               $this->executed();
+               
+               // send JSON-encoded response
+               header('Content-type: application/json');
+               echo JSON::encode($this->response);
+               exit;
+       }
 }
index 2981a2addcd8fe7a574b09e6e4e1b28066dab6b0..e7d7d47c40997ef0d9d9d40f543ce9b2cb02ebe4 100644 (file)
@@ -1,78 +1,78 @@
-<?php\r
-namespace wcf\action;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * This class provides default implementations for the Action interface.\r
- * This includes the call of the default event listeners for an action: readParameters and execute.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage action\r
- * @category   Community Framework\r
- */\r
-abstract class AbstractAction implements IAction {\r
-       /**\r
-        * Needed modules to execute this action.\r
-        * \r
-        * @var array<string>\r
-        */\r
-       public $neededModules = array();\r
-       \r
-       /**\r
-        * Needed permissions to execute this action.\r
-        * \r
-        * @var array<string>\r
-        */\r
-       public $neededPermissions = array();\r
-       \r
-       /**\r
-        * Creates a new AbstractAction object.\r
-        * Calls the methods readParameters() and execute() automatically.\r
-        */\r
-       public function __construct() {\r
-               // call default methods\r
-               $this->readParameters();\r
-               $this->execute();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\action\IAction::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               // call readParameters event\r
-               EventHandler::getInstance()->fireAction($this, 'readParameters');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\action\IAction::execute()\r
-        */\r
-       public function execute() {\r
-               // check modules\r
-               if (count($this->neededModules)) {\r
-                       foreach ($this->neededModules as $module) {\r
-                               if (!defined($module) || !constant($module)) throw new IllegalLinkException();\r
-                       }\r
-               }\r
-               \r
-               // check permission\r
-               if (count($this->neededPermissions)) {\r
-                       WCF::getSession()->checkPermission($this->neededPermissions);\r
-               }\r
-               \r
-               // call execute event\r
-               EventHandler::getInstance()->fireAction($this, 'execute');\r
-       }\r
-       \r
-       /**\r
-        * Calls the 'executed' event after the successful execution of this action.\r
-        * This functions won't called automatically. You must do this manually, if you inherit AbstractAction.\r
-        */\r
-       protected function executed() {\r
-               EventHandler::getInstance()->fireAction($this, 'executed');\r
-       }\r
+<?php
+namespace wcf\action;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+
+/**
+ * This class provides default implementations for the Action interface.
+ * This includes the call of the default event listeners for an action: readParameters and execute.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage action
+ * @category   Community Framework
+ */
+abstract class AbstractAction implements IAction {
+       /**
+        * Needed modules to execute this action.
+        * 
+        * @var array<string>
+        */
+       public $neededModules = array();
+       
+       /**
+        * Needed permissions to execute this action.
+        * 
+        * @var array<string>
+        */
+       public $neededPermissions = array();
+       
+       /**
+        * Creates a new AbstractAction object.
+        * Calls the methods readParameters() and execute() automatically.
+        */
+       public function __construct() {
+               // call default methods
+               $this->readParameters();
+               $this->execute();
+       }
+       
+       /**
+        * @see wcf\action\IAction::readParameters()
+        */
+       public function readParameters() {
+               // call readParameters event
+               EventHandler::getInstance()->fireAction($this, 'readParameters');
+       }
+       
+       /**
+        * @see wcf\action\IAction::execute()
+        */
+       public function execute() {
+               // check modules
+               if (count($this->neededModules)) {
+                       foreach ($this->neededModules as $module) {
+                               if (!defined($module) || !constant($module)) throw new IllegalLinkException();
+                       }
+               }
+               
+               // check permission
+               if (count($this->neededPermissions)) {
+                       WCF::getSession()->checkPermission($this->neededPermissions);
+               }
+               
+               // call execute event
+               EventHandler::getInstance()->fireAction($this, 'execute');
+       }
+       
+       /**
+        * Calls the 'executed' event after the successful execution of this action.
+        * This functions won't called automatically. You must do this manually, if you inherit AbstractAction.
+        */
+       protected function executed() {
+               EventHandler::getInstance()->fireAction($this, 'executed');
+       }
 }
index c632998be903a3ee30e5752ec8ae60858e24d228..b6c084c2bf634b98a29d53ae4a9127ea066affee 100644 (file)
@@ -1,28 +1,28 @@
-<?php\r
-namespace wcf\action;\r
-\r
-/**\r
- * Provides method to send JSON-encoded responses.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage action\r
- * @category   Community Framework\r
- */\r
-class AbstractAjaxAction extends AbstractAction {\r
-       /**\r
-        * Sends a JSON-encoded response.\r
-        * \r
-        * @param       array           $data\r
-        */\r
-       protected function sendJsonResponse(array $data) {\r
-               $json = JSON::encode($data);\r
-               \r
-               // send JSON response\r
-               header('Content-type: application/json');\r
-               echo $json;\r
-               exit;\r
-       }\r
+<?php
+namespace wcf\action;
+
+/**
+ * Provides method to send JSON-encoded responses.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage action
+ * @category   Community Framework
+ */
+class AbstractAjaxAction extends AbstractAction {
+       /**
+        * Sends a JSON-encoded response.
+        * 
+        * @param       array           $data
+        */
+       protected function sendJsonResponse(array $data) {
+               $json = JSON::encode($data);
+               
+               // send JSON response
+               header('Content-type: application/json');
+               echo $json;
+               exit;
+       }
 }
index 942609f05955fdf6e950a0f2c30e9451db46d22c..8f0ad38f8b5b62928d493d3541e935fb6f9abc27 100644 (file)
@@ -1,72 +1,72 @@
-<?php\r
-namespace wcf\action;\r
-use wcf\system\exception\AJAXException;\r
-use wcf\util\JSON;\r
-use wcf\util\StringUtil;\r
-\r
-abstract class AbstractDialogAction extends AbstractSecureAction {\r
-       /**\r
-        * current step\r
-        *\r
-        * @var string\r
-        */\r
-       public $step = '';\r
-       \r
-       /**\r
-        * template name\r
-        *\r
-        * @var string\r
-        */\r
-       public $templateName = '';\r
-       \r
-       /**\r
-        * response data\r
-        *\r
-        * @var array\r
-        */\r
-       public $data = array();\r
-       \r
-       /**\r
-        * @see Action::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (empty($this->templateName)) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-               \r
-               if (isset($_REQUEST['step'])) {\r
-                       $this->step = StringUtil::trim($_REQUEST['step']);\r
-                       \r
-                       // append step as part of template name\r
-                       $this->templateName .= StringUtil::firstCharToUpperCase($this->step);\r
-               }\r
-               \r
-               $this->validateStep();\r
-       }\r
-       \r
-       public final function execute() {\r
-               parent::execute();\r
-               \r
-               $methodName = 'step' . StringUtil::firstCharToUpperCase($this->step);\r
-               if (!method_exists($this, $methodName)) {\r
-                       throw new AJAXException("Class '".get_class($this)."' does not implement the required method '".$methodName."'");\r
-               }\r
-               \r
-               // execute step\r
-               $this->{$methodName}();\r
-               \r
-               $this->executed();\r
-               \r
-               // send JSON-encoded response\r
-               header('Content-type: application/json');\r
-               echo JSON::encode($this->data);\r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * Validates current dialog step.\r
-        */\r
-       abstract protected function validateStep();\r
+<?php
+namespace wcf\action;
+use wcf\system\exception\AJAXException;
+use wcf\util\JSON;
+use wcf\util\StringUtil;
+
+abstract class AbstractDialogAction extends AbstractSecureAction {
+       /**
+        * current step
+        *
+        * @var string
+        */
+       public $step = '';
+       
+       /**
+        * template name
+        *
+        * @var string
+        */
+       public $templateName = '';
+       
+       /**
+        * response data
+        *
+        * @var array
+        */
+       public $data = array();
+       
+       /**
+        * @see Action::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (empty($this->templateName)) {
+                       throw new IllegalLinkException();
+               }
+               
+               if (isset($_REQUEST['step'])) {
+                       $this->step = StringUtil::trim($_REQUEST['step']);
+                       
+                       // append step as part of template name
+                       $this->templateName .= StringUtil::firstCharToUpperCase($this->step);
+               }
+               
+               $this->validateStep();
+       }
+       
+       public final function execute() {
+               parent::execute();
+               
+               $methodName = 'step' . StringUtil::firstCharToUpperCase($this->step);
+               if (!method_exists($this, $methodName)) {
+                       throw new AJAXException("Class '".get_class($this)."' does not implement the required method '".$methodName."'");
+               }
+               
+               // execute step
+               $this->{$methodName}();
+               
+               $this->executed();
+               
+               // send JSON-encoded response
+               header('Content-type: application/json');
+               echo JSON::encode($this->data);
+               exit;
+       }
+       
+       /**
+        * Validates current dialog step.
+        */
+       abstract protected function validateStep();
 }
index 1099ba68e52610307ea06e327bed124fece9622d..6f2260afd50ab99eae7976fa82efc964a3c80edf 100644 (file)
@@ -1,89 +1,89 @@
-<?php\r
-namespace wcf\action;\r
-\r
-/**\r
- * Abstract handler for object-actions using the AJAX-API.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage action\r
- * @category   Community Framework\r
- */\r
-abstract class AbstractSecureObjectAction extends AbstractAction {\r
-       protected $action = '';\r
-       protected $actionClass = '';\r
-       protected $actionData = array();\r
-       protected $data = array();\r
-       protected $objectAction = null;\r
-       protected $objectIDs = array();\r
-               \r
-       /**\r
-        * @see Action::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               if (isset($_POST['actionClass'])) {\r
-                       $this->actionClass = StringUtil::trim($_POST['actionClass']);\r
-               }\r
-               if (isset($_POST['data'])) {\r
-                       $data = json_decode($_POST['data'], true);\r
-                       if (is_array($data)) $this->data = $data;\r
-               }\r
-               if (isset($_POST['objectIDs'])) {\r
-                       $objectIDs = json_decode($_POST['objectIDs']);\r
-                       if (is_array($objectIDs)) $this->objectIDs = ArrayUtil::toIntegerArray($objectIDs);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see         Action::execute()\r
-        * @todo        Add validation for $actionClass, $data and $objectIDs,\r
-        *              possibly with some kind of derived exception maintaining\r
-        *              a js-readable output (do not use printable exception!)\r
-        */\r
-       public function execute() {\r
-               parent::execute();\r
-               \r
-               $className = $this->actionClass.'Action';\r
-               $classPath = $this->getClassPath().$this->actionClass.'Action.class.php';\r
-               \r
-               require_once($classPath);\r
-               $this->objectAction = new $className($this->objectIDs, $this->action, $this->actionData);\r
-       }\r
-       \r
-       /**\r
-        * Executes chosen action. This method is not called automatically,\r
-        * you must call this method in any derived class.\r
-        */\r
-       protected function executeAction() {\r
-               $this->objectAction->validateAction();\r
-               $this->objectAction->executeAction();\r
-               \r
-               $this->handleResult();\r
-       }\r
-       \r
-       /**\r
-        * Returns class path based upon object action's name (excluding Action-suffix)\r
-        * \r
-        * @return      string\r
-        */\r
-       protected function getClassPath() {\r
-               $directories = array();\r
-               $components = preg_split('~(?<=[a-z])(?=[A-Z])~', $this->actionClass);\r
-               \r
-               foreach ($components as $part) {\r
-                       $directories[] = StringUtil::toLowerCase($part);\r
-               }\r
-               \r
-               $path = WCF_DIR . 'lib/data/' . implode('/', $directories);\r
-               return FileUtil::addTrailingSlash($path);\r
-       }\r
-       \r
-       /**\r
-        * Handles action result, derived classes must implement this but leave it empty.\r
-        */\r
-       abstract protected function handleResult();\r
+<?php
+namespace wcf\action;
+
+/**
+ * Abstract handler for object-actions using the AJAX-API.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage action
+ * @category   Community Framework
+ */
+abstract class AbstractSecureObjectAction extends AbstractAction {
+       protected $action = '';
+       protected $actionClass = '';
+       protected $actionData = array();
+       protected $data = array();
+       protected $objectAction = null;
+       protected $objectIDs = array();
+               
+       /**
+        * @see Action::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               if (isset($_POST['actionClass'])) {
+                       $this->actionClass = StringUtil::trim($_POST['actionClass']);
+               }
+               if (isset($_POST['data'])) {
+                       $data = json_decode($_POST['data'], true);
+                       if (is_array($data)) $this->data = $data;
+               }
+               if (isset($_POST['objectIDs'])) {
+                       $objectIDs = json_decode($_POST['objectIDs']);
+                       if (is_array($objectIDs)) $this->objectIDs = ArrayUtil::toIntegerArray($objectIDs);
+               }
+       }
+       
+       /**
+        * @see         Action::execute()
+        * @todo        Add validation for $actionClass, $data and $objectIDs,
+        *              possibly with some kind of derived exception maintaining
+        *              a js-readable output (do not use printable exception!)
+        */
+       public function execute() {
+               parent::execute();
+               
+               $className = $this->actionClass.'Action';
+               $classPath = $this->getClassPath().$this->actionClass.'Action.class.php';
+               
+               require_once($classPath);
+               $this->objectAction = new $className($this->objectIDs, $this->action, $this->actionData);
+       }
+       
+       /**
+        * Executes chosen action. This method is not called automatically,
+        * you must call this method in any derived class.
+        */
+       protected function executeAction() {
+               $this->objectAction->validateAction();
+               $this->objectAction->executeAction();
+               
+               $this->handleResult();
+       }
+       
+       /**
+        * Returns class path based upon object action's name (excluding Action-suffix)
+        * 
+        * @return      string
+        */
+       protected function getClassPath() {
+               $directories = array();
+               $components = preg_split('~(?<=[a-z])(?=[A-Z])~', $this->actionClass);
+               
+               foreach ($components as $part) {
+                       $directories[] = StringUtil::toLowerCase($part);
+               }
+               
+               $path = WCF_DIR . 'lib/data/' . implode('/', $directories);
+               return FileUtil::addTrailingSlash($path);
+       }
+       
+       /**
+        * Handles action result, derived classes must implement this but leave it empty.
+        */
+       abstract protected function handleResult();
 }
index 534c728f54c4c6e46b6ff49a2b3c4bbde1771326..197783b5634549eefe63526cb13ef0f9e86860a7 100644 (file)
@@ -1,25 +1,25 @@
-<?php\r
-namespace wcf\action;\r
-\r
-/**\r
- * All action classes should implement this interface.\r
- * An action executes a user input without showing a result page or a form. \r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage action\r
- * @category   Community Framework\r
- */\r
-interface IAction {\r
-       /**\r
-        * Reads the given parameters.\r
-        */\r
-       public function readParameters();\r
-       \r
-       /**\r
-        * Executes this action.\r
-        */\r
-       public function execute();\r
+<?php
+namespace wcf\action;
+
+/**
+ * All action classes should implement this interface.
+ * An action executes a user input without showing a result page or a form. 
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage action
+ * @category   Community Framework
+ */
+interface IAction {
+       /**
+        * Reads the given parameters.
+        */
+       public function readParameters();
+       
+       /**
+        * Executes this action.
+        */
+       public function execute();
 }
index 11307a15826b5bd2f385324aa1d9c71b96d99b18..e818f999181c6532747f6c21e7efe000f75693d7 100644 (file)
@@ -1,24 +1,24 @@
-<?php\r
-/**\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @category   Community Framework\r
- */\r
-// set exception handler\r
-set_exception_handler(array('wcf\system\WCF', 'handleException'));\r
-\r
-// set php error handler\r
-set_error_handler(array('wcf\system\WCF', 'handleError'), E_ALL);\r
-\r
-// set shutdown function\r
-register_shutdown_function(array('wcf\system\WCF', 'destruct'));\r
-\r
-// set autoload function\r
-spl_autoload_register(array('wcf\system\WCF', 'autoload'));\r
-\r
-// define escape string shortcut\r
-function escapeString($string) {\r
-       return wcf\system\WCF::getDB()->escapeString($string);\r
+<?php
+/**
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @category   Community Framework
+ */
+// set exception handler
+set_exception_handler(array('wcf\system\WCF', 'handleException'));
+
+// set php error handler
+set_error_handler(array('wcf\system\WCF', 'handleError'), E_ALL);
+
+// set shutdown function
+register_shutdown_function(array('wcf\system\WCF', 'destruct'));
+
+// set autoload function
+spl_autoload_register(array('wcf\system\WCF', 'autoload'));
+
+// define escape string shortcut
+function escapeString($string) {
+       return wcf\system\WCF::getDB()->escapeString($string);
 }
index 6b5805943056258afa3e43c5ca29d8c884c23be1..ddfa28255e830b3bdfbba694e59a3fd3a3a230e2 100644 (file)
-<?php\r
-namespace wcf\data;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Abstract class for all data holder classes.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data\r
- * @category   Community Framework\r
- */\r
-abstract class DatabaseObject implements IStorableObject {\r
-       /**\r
-        * database table for this object\r
-        * @var string\r
-        */\r
-       protected static $databaseTableName = '';\r
-       \r
-       /**\r
-        * indicates if database table index is an identity column\r
-        * @var boolean \r
-        */     \r
-       protected static $databaseTableIndexIsIdentity = true;\r
-       \r
-       /**\r
-        * name of the primary index column\r
-        * @var string\r
-        */\r
-       protected static $databaseTableIndexName = '';\r
-       \r
-       /**\r
-        * sort field\r
-        * @var mixed\r
-        */\r
-       protected static $sortBy = null;\r
-       \r
-       /**\r
-        * sort order\r
-        * @var mixed\r
-        */\r
-       protected static $sortOrder = null;\r
-       \r
-       /**\r
-        * object data\r
-        * @var array\r
-        */\r
-       protected $data = null;\r
-       \r
-       /**\r
-        * Creates a new instance of the DatabaseObject class.\r
-        * Stores object data.\r
-        *  \r
-        * @param       mixed                   $id\r
-        * @param       array                   $row\r
-        * @param       DatabaseObject          $object\r
-        */\r
-       public function __construct($id, array $row = null, DatabaseObject $object = null) {\r
-               if ($id !== null) {\r
-                       $sql = "SELECT  *\r
-                               FROM    ".static::getDatabaseTableName()."\r
-                               WHERE   ".static::getDatabaseTableIndexName()." = ?";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute(array($id));\r
-                       $row = $statement->fetchArray();\r
-                       \r
-                       // enforce data type 'array'\r
-                       if ($row === false) $row = array();\r
-               }\r
-               else if ($object !== null) {\r
-                       $row = $object->data;\r
-               }\r
-               \r
-               $this->handleData($row);\r
-       }\r
-       \r
-       /**\r
-        * Stores the data of a database row.\r
-        * \r
-        * @param       array           $data\r
-        */\r
-       protected function handleData($data) {\r
-               // provide a logical false value for - assumed numeric - primary index\r
-               if (!isset($data[static::getDatabaseTableIndexName()])) {\r
-                       $data[static::getDatabaseTableIndexName()] = 0;\r
-               }\r
-               \r
-               $this->data = $data;\r
-       }\r
-\r
-       /**\r
-        * @see wcf\data\IStorableObject::__get()\r
-        */\r
-       public function __get($name) {\r
-               if (isset($this->data[$name])) {\r
-                       return $this->data[$name];\r
-               }\r
-               else {\r
-                       return null;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IStorableObject::__isset()\r
-        */\r
-       public function __isset($name) {\r
-               return isset($this->data[$name]);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IStorableObject::getDatabaseTableName()\r
-        */\r
-       public static function getDatabaseTableName() {\r
-               return 'wcf'.WCF_N.'_'.static::$databaseTableName;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IStorableObject::getDatabaseTableAlias()\r
-        */\r
-       public static function getDatabaseTableAlias() {\r
-               return static::$databaseTableName;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IStorableObject::getDatabaseTableIndexIsIdentity()\r
-        */     \r
-       public static function getDatabaseTableIndexIsIdentity() {\r
-               return static::$databaseTableIndexIsIdentity;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IStorableObject::getDatabaseTableIndexName()\r
-        */\r
-       public static function getDatabaseTableIndexName() {\r
-               return static::$databaseTableIndexName;\r
-       }\r
-       \r
-       /**\r
-        * Sorts a list of database objects.\r
-        *\r
-        * @param       array<DatabaseObject>   $objects\r
-        * @param       mixed                   $sortBy\r
-        * @param       string                  $sortOrder\r
-        * @return      boolean\r
-        */\r
-       public static function sort(&$objects, $sortBy, $sortOrder = 'ASC', $maintainIndexAssociation = true) {\r
-               static::$sortBy = (!is_array($sortBy) ? array($sortBy) : $sortBy);\r
-               static::$sortOrder = (!is_array($sortOrder) ? array($sortOrder) : $sortOrder);\r
-\r
-               if ($maintainIndexAssociation) {\r
-                       return uasort($objects, array('static', 'compareObjects'));\r
-               }\r
-               else {\r
-                       return usort($objects, array('static', 'compareObjects'));\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Compares to database objects.\r
-        *\r
-        * @param       DatabaseObject          $objectA\r
-        * @param       DatabaseObject          $objectB\r
-        * @return      float\r
-        */\r
-       protected static function compareObjects($objectA, $objectB) {\r
-               foreach (static::$sortBy as $key => $sortBy) {\r
-                       $sortOrder = (isset(static::$sortOrder[$key]) ? static::$sortOrder[$key] : 'ASC');\r
-                       if (is_numeric($objectA->$sortBy) && is_numeric($objectB->$sortBy)) {\r
-                               if ($objectA->$sortBy > $objectB->$sortBy) {\r
-                                       return ($sortOrder == 'ASC' ? 1 : 0);\r
-                               }\r
-                               else if ($objectA->$sortBy < $objectB->$sortBy) {\r
-                                       return ($sortOrder == 'ASC' ? 0 : 1);\r
-                               }\r
-                       }\r
-                       else {\r
-                               if ($sortOrder == 'ASC') {\r
-                                       $result =  strcoll($objectA->$sortBy, $objectB->$sortBy);\r
-                               }\r
-                               else {\r
-                                       $result = strcoll($objectB->$sortBy, $objectA->$sortBy);\r
-                               }\r
-                               \r
-                               if ($result != 0.0) {\r
-                                       return $result;\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               return 0;\r
-       }\r
+<?php
+namespace wcf\data;
+use wcf\system\WCF;
+
+/**
+ * Abstract class for all data holder classes.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data
+ * @category   Community Framework
+ */
+abstract class DatabaseObject implements IStorableObject {
+       /**
+        * database table for this object
+        * @var string
+        */
+       protected static $databaseTableName = '';
+       
+       /**
+        * indicates if database table index is an identity column
+        * @var boolean 
+        */     
+       protected static $databaseTableIndexIsIdentity = true;
+       
+       /**
+        * name of the primary index column
+        * @var string
+        */
+       protected static $databaseTableIndexName = '';
+       
+       /**
+        * sort field
+        * @var mixed
+        */
+       protected static $sortBy = null;
+       
+       /**
+        * sort order
+        * @var mixed
+        */
+       protected static $sortOrder = null;
+       
+       /**
+        * object data
+        * @var array
+        */
+       protected $data = null;
+       
+       /**
+        * Creates a new instance of the DatabaseObject class.
+        * Stores object data.
+        *  
+        * @param       mixed                   $id
+        * @param       array                   $row
+        * @param       DatabaseObject          $object
+        */
+       public function __construct($id, array $row = null, DatabaseObject $object = null) {
+               if ($id !== null) {
+                       $sql = "SELECT  *
+                               FROM    ".static::getDatabaseTableName()."
+                               WHERE   ".static::getDatabaseTableIndexName()." = ?";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute(array($id));
+                       $row = $statement->fetchArray();
+                       
+                       // enforce data type 'array'
+                       if ($row === false) $row = array();
+               }
+               else if ($object !== null) {
+                       $row = $object->data;
+               }
+               
+               $this->handleData($row);
+       }
+       
+       /**
+        * Stores the data of a database row.
+        * 
+        * @param       array           $data
+        */
+       protected function handleData($data) {
+               // provide a logical false value for - assumed numeric - primary index
+               if (!isset($data[static::getDatabaseTableIndexName()])) {
+                       $data[static::getDatabaseTableIndexName()] = 0;
+               }
+               
+               $this->data = $data;
+       }
+
+       /**
+        * @see wcf\data\IStorableObject::__get()
+        */
+       public function __get($name) {
+               if (isset($this->data[$name])) {
+                       return $this->data[$name];
+               }
+               else {
+                       return null;
+               }
+       }
+       
+       /**
+        * @see wcf\data\IStorableObject::__isset()
+        */
+       public function __isset($name) {
+               return isset($this->data[$name]);
+       }
+       
+       /**
+        * @see wcf\data\IStorableObject::getDatabaseTableName()
+        */
+       public static function getDatabaseTableName() {
+               return 'wcf'.WCF_N.'_'.static::$databaseTableName;
+       }
+       
+       /**
+        * @see wcf\data\IStorableObject::getDatabaseTableAlias()
+        */
+       public static function getDatabaseTableAlias() {
+               return static::$databaseTableName;
+       }
+       
+       /**
+        * @see wcf\data\IStorableObject::getDatabaseTableIndexIsIdentity()
+        */     
+       public static function getDatabaseTableIndexIsIdentity() {
+               return static::$databaseTableIndexIsIdentity;
+       }
+       
+       /**
+        * @see wcf\data\IStorableObject::getDatabaseTableIndexName()
+        */
+       public static function getDatabaseTableIndexName() {
+               return static::$databaseTableIndexName;
+       }
+       
+       /**
+        * Sorts a list of database objects.
+        *
+        * @param       array<DatabaseObject>   $objects
+        * @param       mixed                   $sortBy
+        * @param       string                  $sortOrder
+        * @return      boolean
+        */
+       public static function sort(&$objects, $sortBy, $sortOrder = 'ASC', $maintainIndexAssociation = true) {
+               static::$sortBy = (!is_array($sortBy) ? array($sortBy) : $sortBy);
+               static::$sortOrder = (!is_array($sortOrder) ? array($sortOrder) : $sortOrder);
+
+               if ($maintainIndexAssociation) {
+                       return uasort($objects, array('static', 'compareObjects'));
+               }
+               else {
+                       return usort($objects, array('static', 'compareObjects'));
+               }
+       }
+       
+       /**
+        * Compares to database objects.
+        *
+        * @param       DatabaseObject          $objectA
+        * @param       DatabaseObject          $objectB
+        * @return      float
+        */
+       protected static function compareObjects($objectA, $objectB) {
+               foreach (static::$sortBy as $key => $sortBy) {
+                       $sortOrder = (isset(static::$sortOrder[$key]) ? static::$sortOrder[$key] : 'ASC');
+                       if (is_numeric($objectA->$sortBy) && is_numeric($objectB->$sortBy)) {
+                               if ($objectA->$sortBy > $objectB->$sortBy) {
+                                       return ($sortOrder == 'ASC' ? 1 : 0);
+                               }
+                               else if ($objectA->$sortBy < $objectB->$sortBy) {
+                                       return ($sortOrder == 'ASC' ? 0 : 1);
+                               }
+                       }
+                       else {
+                               if ($sortOrder == 'ASC') {
+                                       $result =  strcoll($objectA->$sortBy, $objectB->$sortBy);
+                               }
+                               else {
+                                       $result = strcoll($objectB->$sortBy, $objectA->$sortBy);
+                               }
+                               
+                               if ($result != 0.0) {
+                                       return $result;
+                               }
+                       }
+               }
+               
+               return 0;
+       }
 }
index 57378c6fc629aba61c52434fe7e429fa557b8029..51978161380b0bbaf0a5c9988facfb25658fb3f3 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\acp\menu\item;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP menu item-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.menu.item\r
- * @category   Community Framework\r
- */\r
-class ACPMenuItemAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\acp\menu\item\ACPMenuItemEditor';\r
+<?php
+namespace wcf\data\acp\menu\item;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP menu item-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.menu.item
+ * @category   Community Framework
+ */
+class ACPMenuItemAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\acp\menu\item\ACPMenuItemEditor';
 }
index b4f1ef7933a278f5a194b99ad1cd8e5ef61c191a..664bd6379512c16e6083ac4e9e83f2acdf350bd9 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\acp\menu\item;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of ACP menu items.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.menu.item\r
- * @category   Community Framework\r
- */\r
-class ACPMenuItemList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\acp\menu\item\ACPMenuItem';\r
+<?php
+namespace wcf\data\acp\menu\item;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of ACP menu items.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.menu.item
+ * @category   Community Framework
+ */
+class ACPMenuItemList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\acp\menu\item\ACPMenuItem';
 }
index 7617ea6885f20df63f90506b62ce5c2d9a3e43be..57db849533e4d1133b4ecd016eaed315be55ed84 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\acp\session;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP session-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.session\r
- * @category   Community Framework\r
- */\r
-class ACPSessionAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\acp\session\ACPSessionEditor';\r
+<?php
+namespace wcf\data\acp\session;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP session-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.session
+ * @category   Community Framework
+ */
+class ACPSessionAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\acp\session\ACPSessionEditor';
 }
index dd7a282cd0bee759c3296e181926e2c2a1b4adf2..ea81d3c3ec7cddc9aef688237894f0a12f053739 100644 (file)
@@ -1,19 +1,19 @@
-<?php\r
-namespace wcf\data\acp\session;\r
-\r
-/**\r
- * Represents a list of ACP sessions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.session\r
- * @category   Community Framework\r
- */\r
-class ACPSessionList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\acp\session\ACPSession';\r
+<?php
+namespace wcf\data\acp\session;
+
+/**
+ * Represents a list of ACP sessions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.session
+ * @category   Community Framework
+ */
+class ACPSessionList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\acp\session\ACPSession';
 }
index 9a78789d3878765217c6fd28628a75e125a07c7e..5eabeb52f1f1eb45a076977aed291128d4bdf841 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\acp\session\access\log;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP session access log-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.session.access.log\r
- * @category   Community Framework\r
- */\r
-class ACPSessionAccessLogAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\acp\session\access\log\ACPSessionAccessLogEditor';\r
+<?php
+namespace wcf\data\acp\session\access\log;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP session access log-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.session.access.log
+ * @category   Community Framework
+ */
+class ACPSessionAccessLogAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\acp\session\access\log\ACPSessionAccessLogEditor';
 }
index c4f162c7ca523b7a16fac61d1adbd5199b759895..32a3df054f2582b5692be035c9c85a157898401e 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\acp\session\data;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP session data-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.session.data\r
- * @category   Community Framework\r
- */\r
-class ACPSessionDataAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\acp\session\data\ACPSessionDataEditor';\r
+<?php
+namespace wcf\data\acp\session\data;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP session data-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.session.data
+ * @category   Community Framework
+ */
+class ACPSessionDataAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\acp\session\data\ACPSessionDataEditor';
 }
index e3ecba13dafc909c3ac55dd13136a5206253354f..2ba603bc83286c9dfc2b409aabde53acc35a785a 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\acp\session\data;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of ACP session data.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.session.data\r
- * @category   Community Framework\r
- */\r
-class ACPSessionDataList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\acp\session\data\ACPSessionData';\r
+<?php
+namespace wcf\data\acp\session\data;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of ACP session data.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.session.data
+ * @category   Community Framework
+ */
+class ACPSessionDataList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\acp\session\data\ACPSessionData';
 }
index 67f2da067e52146ff26e57b6a43457a0725b97e8..0446043d29a669bf2bdf2e7a60f0780e57b1a09c 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\acp\session\log;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP session log-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.session.log\r
- * @category   Community Framework\r
- */\r
-class ACPSessionLogAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\acp\session\log\ACPSessionLogEditor';\r
+<?php
+namespace wcf\data\acp\session\log;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP session log-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.session.log
+ * @category   Community Framework
+ */
+class ACPSessionLogAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\acp\session\log\ACPSessionLogEditor';
 }
index d4ca3cecc5be1b1790bb315bb4d770faf2182ba9..dc043cefbd867e09bb9e1c83dd5f6042a831b10b 100644 (file)
@@ -1,37 +1,37 @@
-<?php\r
-namespace wcf\data\acp\template;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes ACP templates-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.template\r
- * @category   Community Framework\r
- */\r
-class ACPTemplateAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\acp\template\ACPTemplateEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.template.canAddTemplate');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.template.canDeleteTemplate');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.template.canUpdateTemplate');\r
+<?php
+namespace wcf\data\acp\template;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes ACP templates-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.template
+ * @category   Community Framework
+ */
+class ACPTemplateAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\acp\template\ACPTemplateEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.template.canAddTemplate');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.template.canDeleteTemplate');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.template.canUpdateTemplate');
 }
index b850176469175d0be9ba80d49b590e1436624e73..68696024da56724f33d5bccd94c83091d350d1f6 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\acp\template;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of ACP templates.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.template\r
- * @category   Community Framework\r
- */\r
-class ACPTemplateList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\acp\template\ACPTemplate';\r
+<?php
+namespace wcf\data\acp\template;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of ACP templates.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.template
+ * @category   Community Framework
+ */
+class ACPTemplateList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\acp\template\ACPTemplate';
 }
index 7158537692d4568bf59392f5e325686f02ddb3e8..81e269f20a025561f4d72e04dc7491d496fc129b 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\cleanup\listener;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes cleanup listener-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.cleanup.listener\r
- * @category   Community Framework\r
- */\r
-class CleanupListenerAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\cleanup\listener\CleanupListenerEditor';\r
+<?php
+namespace wcf\data\cleanup\listener;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes cleanup listener-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.cleanup.listener
+ * @category   Community Framework
+ */
+class CleanupListenerAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\cleanup\listener\CleanupListenerEditor';
 }
index af5856d77a2550f5d12e1d4e26d6998584a1238c..9aa6b701c595cee9f3e421c8903f2aa774bc9b23 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\cleanup\listener;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of cleanup listener.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.cleanup.listener\r
- * @category   Community Framework\r
- */\r
-class CleanupListenerList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\cleanup\listener\CleanupListener';\r
+<?php
+namespace wcf\data\cleanup\listener;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of cleanup listener.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.cleanup.listener
+ * @category   Community Framework
+ */
+class CleanupListenerList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\cleanup\listener\CleanupListener';
 }
index 64282ad45ac58ca5cad45e9b1a5a6ff4021c22b2..40ad9128adb0dbe4fba7c00a51848bc9ee89defa 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\core\object;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes core object-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.core.object\r
- * @category   Community Framework\r
- */\r
-class CoreObjectAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\core\object\CoreObjectEditor';\r
+<?php
+namespace wcf\data\core\object;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes core object-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.core.object
+ * @category   Community Framework
+ */
+class CoreObjectAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\core\object\CoreObjectEditor';
 }
index 36b9ddb2d8c9dfec100f9f7a8f6b7e477bbddf07..863784695bc7f0e35f0b0a5dab0120282a652050 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\core\object;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of core objects.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.event\r
- * @category   Community Framework\r
- */\r
-class CoreObjectList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\core\object\CoreObject';\r
+<?php
+namespace wcf\data\core\object;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of core objects.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.event
+ * @category   Community Framework
+ */
+class CoreObjectList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\core\object\CoreObject';
 }
index 6fc3db71cc36a21a01fc55737f8cc74d410d428f..62f7ecbffd0756e122706ea9c2e90353d52c26ea 100644 (file)
-<?php\r
-namespace wcf\data\cronjob;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes cronjob-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.cronjob\r
- * @category   Community Framework\r
- */\r
-class CronjobAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\cronjob\CronjobEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.system.cronjobs.canAddCronjob');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.system.cronjobs.canDeleteCronjob');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.system.cronjobs.canEditCronjob');\r
-       \r
-       /**\r
-        * Validates permissions and parameters\r
-        */\r
-       public function validateDelete() {\r
-               parent::validateDelete();\r
-               \r
-               foreach ($this->objects as $cronjob) {\r
-                       if (!$cronjob->isDeletable()) {\r
-                               throw new ValidateActionException('Insufficient permissions');\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Validates permissions and parameters\r
-        */\r
-       public function validateUpdate() {\r
-               parent::validateUpdate();\r
-               \r
-               foreach ($this->objects as $cronjob) {\r
-                       if (!$cronjob->isEditable()) {\r
-                               throw new ValidateActionException('Insufficient permissions');\r
-                       } \r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Validates permissions and parameters\r
-        */\r
-       public function validateToggle() {\r
-               parent::validateUpdate();\r
-               \r
-               foreach ($this->objects as $cronjob) {\r
-                       if (!$cronjob->canBeDisabled()) {\r
-                               throw new ValidateActionException('Insufficient permissions');\r
-                       } \r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Toggles status.\r
-        */\r
-       public function toggle() {\r
-               foreach ($this->objects as $cronjob) {\r
-                       $newStatus = ($cronjob->active) ? 0 : 1;\r
-                       $cronjob->update(array('active' => $newStatus));\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Validates permissions and parameters\r
-        */\r
-       public function validateExecute() {\r
-               parent::validateUpdate();\r
-       }\r
-       \r
-       /**\r
-        * Executes cronjobs.\r
-        */\r
-       public function execute() {\r
-               // TODO: implement me\r
-               foreach ($this->objects as $cronjob) {\r
-                       \r
-               }\r
-       }\r
+<?php
+namespace wcf\data\cronjob;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\WCF;
+
+/**
+ * Executes cronjob-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.cronjob
+ * @category   Community Framework
+ */
+class CronjobAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\cronjob\CronjobEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.system.cronjobs.canAddCronjob');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.system.cronjobs.canDeleteCronjob');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.system.cronjobs.canEditCronjob');
+       
+       /**
+        * Validates permissions and parameters
+        */
+       public function validateDelete() {
+               parent::validateDelete();
+               
+               foreach ($this->objects as $cronjob) {
+                       if (!$cronjob->isDeletable()) {
+                               throw new ValidateActionException('Insufficient permissions');
+                       }
+               }
+       }
+       
+       /**
+        * Validates permissions and parameters
+        */
+       public function validateUpdate() {
+               parent::validateUpdate();
+               
+               foreach ($this->objects as $cronjob) {
+                       if (!$cronjob->isEditable()) {
+                               throw new ValidateActionException('Insufficient permissions');
+                       } 
+               }
+       }
+       
+       /**
+        * Validates permissions and parameters
+        */
+       public function validateToggle() {
+               parent::validateUpdate();
+               
+               foreach ($this->objects as $cronjob) {
+                       if (!$cronjob->canBeDisabled()) {
+                               throw new ValidateActionException('Insufficient permissions');
+                       } 
+               }
+       }
+       
+       /**
+        * Toggles status.
+        */
+       public function toggle() {
+               foreach ($this->objects as $cronjob) {
+                       $newStatus = ($cronjob->active) ? 0 : 1;
+                       $cronjob->update(array('active' => $newStatus));
+               }
+       }
+       
+       /**
+        * Validates permissions and parameters
+        */
+       public function validateExecute() {
+               parent::validateUpdate();
+       }
+       
+       /**
+        * Executes cronjobs.
+        */
+       public function execute() {
+               // TODO: implement me
+               foreach ($this->objects as $cronjob) {
+                       
+               }
+       }
 }
index d61b967e29daa616c45c740e53b227db478fb4ef..a17c27bf07ce3a790adc3e090c751bd3578f4451 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\cronjob;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of cronjobs.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.cronjob\r
- * @category   Community Framework\r
- */\r
-class CronjobList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\cronjob\Cronjob';\r
+<?php
+namespace wcf\data\cronjob;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of cronjobs.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.cronjob
+ * @category   Community Framework
+ */
+class CronjobList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\cronjob\Cronjob';
 }
index 2ba425eb462e9c166a8377c07a6f8001057b755b..7656fa6680075be609a5364e0a1df3b322576c33 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\cronjob\log;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of cronjob log entries.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.acp.menu.item\r
- * @category   Community Framework\r
- */\r
-class CronjobLogList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\cronjob\log\CronjobLog';\r
+<?php
+namespace wcf\data\cronjob\log;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of cronjob log entries.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.acp.menu.item
+ * @category   Community Framework
+ */
+class CronjobLogList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\cronjob\log\CronjobLog';
 }
index cafc31e15ff6b8d827036d5de55eb7bce2726bbf..96acd32566cd0d71755f735dbbaa9ac518652e26 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\event\listener;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes event listener-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.event\r
- * @category   Community Framework\r
- */\r
-class EventListenerAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\event\listener\EventListenerEditor';\r
+<?php
+namespace wcf\data\event\listener;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes event listener-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.event
+ * @category   Community Framework
+ */
+class EventListenerAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\event\listener\EventListenerEditor';
 }
index 2334bbd235f77762c61b29888705ecc6ff449eaa..11f2f302948347039422f52a87a3200142a2dfb4 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\event\listener;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of event listener.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.event\r
- * @category   Community Framework\r
- */\r
-class EventListenerList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\event\listener\EventListener';\r
+<?php
+namespace wcf\data\event\listener;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of event listener.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.event
+ * @category   Community Framework
+ */
+class EventListenerList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\event\listener\EventListener';
 }
index 34eb82bae70fe400e4f458a94e3ee372fdd7447b..5e6a8b8cc7ff053a143d9bfc20e821ffc62cfd41 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\language;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of languages.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.language\r
- * @category   Community Framework\r
- */\r
-class LanguageList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\language\Language';\r
+<?php
+namespace wcf\data\language;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of languages.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.language
+ * @category   Community Framework
+ */
+class LanguageList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\language\Language';
 }
index 540e8e9c01f5afabf4844f65f0b32f40cc2b0189..722b5f046ad4af125af84f8a8a8513296badde9c 100644 (file)
@@ -1,37 +1,37 @@
-<?php\r
-namespace wcf\data\language\category;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes language category-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.language.category\r
- * @category   Community Framework\r
- */\r
-class LanguageCategoryAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\language\category\LanguageCategoryEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.language.canAddLanguage');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.language.canDeleteLanguage');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.language.canEditLanguage');\r
+<?php
+namespace wcf\data\language\category;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes language category-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.language.category
+ * @category   Community Framework
+ */
+class LanguageCategoryAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\language\category\LanguageCategoryEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.language.canAddLanguage');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.language.canDeleteLanguage');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.language.canEditLanguage');
 }
index 2fc1fb0cb980d13149e1aa69a4196ce7f1a2d92e..61c1c25d11abd0095e257854b207764985b7bffc 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\language\category;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of language categories.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.language.category\r
- * @category   Community Framework\r
- */\r
-class LanguageCategoryList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\language\category\LanguageCategory';\r
+<?php
+namespace wcf\data\language\category;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of language categories.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.language.category
+ * @category   Community Framework
+ */
+class LanguageCategoryList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\language\category\LanguageCategory';
 }
index f7fa41fea379287a47df8f49e1a9eee108e44e87..391f9b376033aef9e2fb0baf79494cb506b08040 100644 (file)
@@ -1,37 +1,37 @@
-<?php\r
-namespace wcf\data\language\item;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes language item-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.language.item\r
- * @category   Community Framework\r
- */\r
-class LanguageItemAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\language\item\LanguageItemEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.language.canAddLanguage');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.language.canDeleteLanguage');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.language.canEditLanguage');\r
+<?php
+namespace wcf\data\language\item;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes language item-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.language.item
+ * @category   Community Framework
+ */
+class LanguageItemAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\language\item\LanguageItemEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.language.canAddLanguage');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.language.canDeleteLanguage');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.language.canEditLanguage');
 }
index 6b4e90d268793ccf31b21fbcb591beeb81ed32c5..0152a6b0d5bf78b5fc1b076649e6aa51d9547dbc 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\language\item;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of language items.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.language.item\r
- * @category   Community Framework\r
- */\r
-class LanguageItemList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\language\item\LanguageItem';\r
+<?php
+namespace wcf\data\language\item;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of language items.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.language.item
+ * @category   Community Framework
+ */
+class LanguageItemList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\language\item\LanguageItem';
 }
index 666778f1a92c7fc7f9601188049a05d07ed9c3d9..3fd7d2ebcecf01b11f561685a66400d9f901f124 100644 (file)
@@ -1,67 +1,67 @@
-<?php\r
-namespace wcf\data\option;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes option-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.\r
- * @category   Community Framework\r
- */\r
-class OptionAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\option\OptionEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.system.canEditOption');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.system.canEditOption');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.system.canEditOption');\r
-       \r
-       /**\r
-        * Validates permissions and parameters.\r
-        */\r
-       public function validateImport() {\r
-               parent::validateCreate(); \r
-       }\r
-       \r
-       /**\r
-        * Validates permissions and parameters.\r
-        */\r
-       public function validateUpdateAll() {\r
-               parent::validateCreate(); \r
-       }\r
-       \r
-       /**\r
-        * Imports options.\r
-        */\r
-       public function import() {\r
-               // create data\r
-               call_user_func(array($this->className, 'import'), $this->parameters['data']);\r
-       }\r
-       \r
-       /**\r
-        * Updates the value of all given options.\r
-        */\r
-       public function updateAll() {\r
-               // create data\r
-               call_user_func(array($this->className, 'updateAll'), $this->parameters['data']);\r
-       }\r
+<?php
+namespace wcf\data\option;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes option-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.
+ * @category   Community Framework
+ */
+class OptionAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\option\OptionEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.system.canEditOption');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.system.canEditOption');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.system.canEditOption');
+       
+       /**
+        * Validates permissions and parameters.
+        */
+       public function validateImport() {
+               parent::validateCreate(); 
+       }
+       
+       /**
+        * Validates permissions and parameters.
+        */
+       public function validateUpdateAll() {
+               parent::validateCreate(); 
+       }
+       
+       /**
+        * Imports options.
+        */
+       public function import() {
+               // create data
+               call_user_func(array($this->className, 'import'), $this->parameters['data']);
+       }
+       
+       /**
+        * Updates the value of all given options.
+        */
+       public function updateAll() {
+               // create data
+               call_user_func(array($this->className, 'updateAll'), $this->parameters['data']);
+       }
 }
index fabdc1129a20912dce979ada42a35bffa91c5185..3318a5ba4561777cdeb32e4d7c6e8bbdbaaf9688 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\option;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of options.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.option\r
- * @category   Community Framework\r
- */\r
-class OptionList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\option\Option';\r
+<?php
+namespace wcf\data\option;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of options.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.option
+ * @category   Community Framework
+ */
+class OptionList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\option\Option';
 }
index ebc6c66d3c8690e6d52bb37d592bc01c637fb6ef..db23369ad444ec8aac9789b0b1a982016027280a 100644 (file)
@@ -1,37 +1,37 @@
-<?php\r
-namespace wcf\data\option\category;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes option categories-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.option.category\r
- * @category   Community Framework\r
- */\r
-class OptionCategoryAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\option\category\OptionCategoryEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.system.canEditOption');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.system.canEditOption');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.system.canEditOption');\r
+<?php
+namespace wcf\data\option\category;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes option categories-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.option.category
+ * @category   Community Framework
+ */
+class OptionCategoryAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\option\category\OptionCategoryEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.system.canEditOption');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.system.canEditOption');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.system.canEditOption');
 }
index 7c7a001b60a0ad792ce4d9454636e47ed5fa17ed..0941321e43ea834917b94e0d3801eea083dd789a 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\option\category;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of option categories.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.option.category\r
- * @category   Community Framework\r
- */\r
-class OptionCategoryList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\option\category\OptionCategory';\r
+<?php
+namespace wcf\data\option\category;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of option categories.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.option.category
+ * @category   Community Framework
+ */
+class OptionCategoryList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\option\category\OptionCategory';
 }
index 0713d8e1537100b57ff3078216d4cc2631d6d006..1a5bac9dc629d9ae0a5bc1010648cf58ed782be6 100644 (file)
@@ -1,35 +1,35 @@
-<?php\r
-namespace wcf\data\package;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes package-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package\r
- * @category   Community Framework\r
- */\r
-class PackageAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\package\PackageEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.system.package.canInstallPackage');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.system.package.canUninstallPackage');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.system.package.canUpdatePackage');\r
+<?php
+namespace wcf\data\package;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes package-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package
+ * @category   Community Framework
+ */
+class PackageAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\package\PackageEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.system.package.canInstallPackage');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.system.package.canUninstallPackage');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.system.package.canUpdatePackage');
 }
index 3220f67e192512a9b3500e396c5111aa58d11566..4240639b39d6db3c50f8b3b11aea079b3568c152 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\package;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of packages.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package\r
- * @category   Community Framework\r
- */\r
-class PackageList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\package\Package';\r
+<?php
+namespace wcf\data\package;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of packages.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package
+ * @category   Community Framework
+ */
+class PackageList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\package\Package';
 }
index a53680b7e682329e2ee415395770f1cd0db2ffa9..f3bbad6e2abab84aa5b6249e3020514392ccfd30 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\package\installation\plugin;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes package installation plugin-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.installation.plugin\r
- * @category   Community Framework\r
- */\r
-class PackageInstallationPluginAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\package\installation\plugin\PackageInstallationPluginEditor';\r
+<?php
+namespace wcf\data\package\installation\plugin;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes package installation plugin-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.installation.plugin
+ * @category   Community Framework
+ */
+class PackageInstallationPluginAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\package\installation\plugin\PackageInstallationPluginEditor';
 }
index f27ffe1b9f3be120c33dd48d5619284402128663..c225f18a6134c9a784baaa27b4164affb3eca2cf 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\package\installation\plugin;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package installation plugins.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.installation.plugin\r
- * @category   Community Framework\r
- */\r
-class PackageInstallationPluginList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\package\installation\plugin\PackageInstallationPluginObj';\r
+<?php
+namespace wcf\data\package\installation\plugin;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package installation plugins.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.installation.plugin
+ * @category   Community Framework
+ */
+class PackageInstallationPluginList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\package\installation\plugin\PackageInstallationPluginObj';
 }
index a5e9add8e5e69da1110f384c7ba61703a8a128c6..3d397de2f15a32f6d0d70a64f40804650f9fe530 100644 (file)
@@ -1,56 +1,56 @@
-<?php\r
-namespace wcf\data\package\installation\queue;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\data\package\Package;\r
-use wcf\system\exception\ValidateActionException;\r
-\r
-/**\r
- * Executes package installation queue-related actions.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.installation.queue\r
- * @category   Community Framework\r
- */\r
-class PackageInstallationQueueAction extends AbstractDatabaseObjectAction {\r
-       protected $package = null;\r
-       protected $packageID = 0;\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\package\installation\queue\PackageInstallationQueueEditor';\r
-       \r
-       public function validatePrepareQueue() {\r
-               if (isset($this->parameters['packageID'])) $this->packageID = intval($this->parameters['packageID']);\r
-               \r
-               $this->package = new Package($packageID);\r
-               if (!$this->package->packageID) {\r
-                       throw new ValidateActionException('Invalid package id');\r
-               }\r
-               \r
-               if (!isset($this->parameters['action']) || !in_array($this->parameters['action'], array('install', 'update', 'uninstall', 'rollback'))) {\r
-                       throw new ValidateActionException('Invalid or missing action');\r
-               }\r
-       }\r
-       \r
-       public function prepareQueue() {\r
-               $processNo = PackageInstallationQueue::getNewProcessNo();\r
-               \r
-               $queue = PackageInstallationQueueEditor::create(array(\r
-                       'processNo' => $processNo,\r
-                       'userID' => WCF::getUser()->userID,\r
-                       'package' => $this->package->package,\r
-                       'packageName' => $this->package->packageName,\r
-                       'packageID' => $this->package->packageID,\r
-                       'action' => $this->parameters['action'],\r
-                       'installationType' => 'other'\r
-               ));\r
-               \r
-               return array(\r
-                       'queueID' => $queue->queueID\r
-               );\r
-       }\r
+<?php
+namespace wcf\data\package\installation\queue;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\data\package\Package;
+use wcf\system\exception\ValidateActionException;
+
+/**
+ * Executes package installation queue-related actions.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.installation.queue
+ * @category   Community Framework
+ */
+class PackageInstallationQueueAction extends AbstractDatabaseObjectAction {
+       protected $package = null;
+       protected $packageID = 0;
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\package\installation\queue\PackageInstallationQueueEditor';
+       
+       public function validatePrepareQueue() {
+               if (isset($this->parameters['packageID'])) $this->packageID = intval($this->parameters['packageID']);
+               
+               $this->package = new Package($packageID);
+               if (!$this->package->packageID) {
+                       throw new ValidateActionException('Invalid package id');
+               }
+               
+               if (!isset($this->parameters['action']) || !in_array($this->parameters['action'], array('install', 'update', 'uninstall', 'rollback'))) {
+                       throw new ValidateActionException('Invalid or missing action');
+               }
+       }
+       
+       public function prepareQueue() {
+               $processNo = PackageInstallationQueue::getNewProcessNo();
+               
+               $queue = PackageInstallationQueueEditor::create(array(
+                       'processNo' => $processNo,
+                       'userID' => WCF::getUser()->userID,
+                       'package' => $this->package->package,
+                       'packageName' => $this->package->packageName,
+                       'packageID' => $this->package->packageID,
+                       'action' => $this->parameters['action'],
+                       'installationType' => 'other'
+               ));
+               
+               return array(
+                       'queueID' => $queue->queueID
+               );
+       }
 }
index 24817f2339b3c772e27dc13138e534c91ccf194c..139de0a154a59a18824f52742d5587840627fa1a 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\package\installation\queue;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package installation queues.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.installation.queue\r
- * @category   Community Framework\r
- */\r
-class PackageInstallationQueueList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\package\installation\queue\PackageInstallationQueue';\r
+<?php
+namespace wcf\data\package\installation\queue;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package installation queues.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.installation.queue
+ * @category   Community Framework
+ */
+class PackageInstallationQueueList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\package\installation\queue\PackageInstallationQueue';
 }
index 7453e4e12238026ac06743ffb99b982878888437..352ac3564b317f07bc32388f78dbe7a694666be9 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\package\update;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes package update-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.update\r
- * @category   Community Framework\r
- */\r
-class PackageUpdateAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\package\update\PackageUpdateEditor';\r
+<?php
+namespace wcf\data\package\update;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes package update-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.update
+ * @category   Community Framework
+ */
+class PackageUpdateAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\package\update\PackageUpdateEditor';
 }
index a1ffa720d3b6e3e7ada36ef02f39f0f8539336ea..b0681b756c71485852e7926253ad43e4823bd364 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\package\update;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package updates.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.update\r
- * @category   Community Framework\r
- */\r
-class PackageUpdateList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\package\update\PackageUpdate';\r
+<?php
+namespace wcf\data\package\update;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package updates.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.update
+ * @category   Community Framework
+ */
+class PackageUpdateList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\package\update\PackageUpdate';
 }
index f0d38332a096b61007781d814dee4adfe79b00e2..794bf64336537a79e4feccc548450cfa5a3f4084 100644 (file)
@@ -1,53 +1,53 @@
-<?php\r
-namespace wcf\data\package\update\server;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes package update server-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.update.server\r
- * @category   Community Framework\r
- */\r
-class PackageUpdateServerAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\package\update\server\PackageUpdateServerEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.system.package.canEditServer');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.system.package.canEditServer');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.system.package.canEditServer');\r
-       \r
-       /**\r
-        * Validates permissions and parameters\r
-        */\r
-       public function validateToggle() {\r
-               parent::validateUpdate();\r
-       }\r
-       \r
-       /**\r
-        * Toggles status.\r
-        */\r
-       public function toggle() {\r
-               foreach ($this->objects as $server) {\r
-                       $server->update(array('disabled' => ($server->disabled) ? 0 : 1));\r
-               }\r
-       }\r
+<?php
+namespace wcf\data\package\update\server;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes package update server-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.update.server
+ * @category   Community Framework
+ */
+class PackageUpdateServerAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\package\update\server\PackageUpdateServerEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.system.package.canEditServer');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.system.package.canEditServer');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.system.package.canEditServer');
+       
+       /**
+        * Validates permissions and parameters
+        */
+       public function validateToggle() {
+               parent::validateUpdate();
+       }
+       
+       /**
+        * Toggles status.
+        */
+       public function toggle() {
+               foreach ($this->objects as $server) {
+                       $server->update(array('disabled' => ($server->disabled) ? 0 : 1));
+               }
+       }
 }
index c92c496f80cec70c1a3daa3f7b29a209b048fe63..a0915e53eaf9b936805a4dd201018c6559945245 100644 (file)
@@ -1,30 +1,30 @@
-<?php\r
-namespace wcf\data\package\update\server;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package update servers.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.update.server\r
- * @category   Community Framework\r
- */\r
-class PackageUpdateServerList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\package\update\server\PackageUpdateServer';\r
-       \r
-       /**\r
-        * @see DatabaseObjectList::readObjects()\r
-        */\r
-       public function readObjects() {\r
-               if (!empty($this->sqlSelects)) $this->sqlSelects .= ',';\r
-               $this->sqlSelects .= "(SELECT COUNT(*) FROM wcf".WCF_N."_package_update WHERE packageUpdateServerID = ".$this->getDatabaseTableAlias().".packageUpdateServerID) AS packages";\r
-               \r
-               parent::readObjects();\r
-       }\r
+<?php
+namespace wcf\data\package\update\server;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package update servers.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.update.server
+ * @category   Community Framework
+ */
+class PackageUpdateServerList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\package\update\server\PackageUpdateServer';
+       
+       /**
+        * @see DatabaseObjectList::readObjects()
+        */
+       public function readObjects() {
+               if (!empty($this->sqlSelects)) $this->sqlSelects .= ',';
+               $this->sqlSelects .= "(SELECT COUNT(*) FROM wcf".WCF_N."_package_update WHERE packageUpdateServerID = ".$this->getDatabaseTableAlias().".packageUpdateServerID) AS packages";
+               
+               parent::readObjects();
+       }
 }
index d8411354447105c1717c5b0e83178e94114ab6bc..3e79674bb58d2350abd9807b72f164d373cb69d5 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\package\update\version;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes package update version-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.update.version\r
- * @category   Community Framework\r
- */\r
-class PackageUpdateVersionAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\package\update\version\PackageUpdateVersionEditor';\r
+<?php
+namespace wcf\data\package\update\version;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes package update version-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.update.version
+ * @category   Community Framework
+ */
+class PackageUpdateVersionAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\package\update\version\PackageUpdateVersionEditor';
 }
index 9c13ce851523ac1011fcc48c27ff865ff5da7572..ba1cba3e0cf7a57eeea876f6cc318f148bc250a6 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\package\update\version;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package update versions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.package.update.version\r
- * @category   Community Framework\r
- */\r
-class PackageUpdateVersionList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\package\update\version\PackageUpdateVersion';\r
+<?php
+namespace wcf\data\package\update\version;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package update versions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.package.update.version
+ * @category   Community Framework
+ */
+class PackageUpdateVersionList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\package\update\version\PackageUpdateVersion';
 }
index ed53e4bb4741287f96fa76e35069a3acab5ca4c8..a757621c66e739df12166d1e4e2e2a8beeb8650d 100644 (file)
@@ -1,36 +1,36 @@
-<?php\r
-namespace wcf\data\page\location;\r
-use wcf\data\IDatabaseObjectProcessor;\r
-\r
-/**\r
- * Any page location class should implement this interface.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.page.location\r
- * @category   Community Framework\r
- */\r
-interface ILocation extends IDatabaseObjectProcessor {\r
-       /**\r
-        * Caches the information of a page location.\r
-        * \r
-        * @param       array           $location\r
-        * @param       string          $requestURI\r
-        * @param       string          $requestMethod\r
-        * @param       array           $match\r
-        */\r
-       public function cache($location, $requestURI, $requestMethod, $match);\r
-       \r
-       /**\r
-        * Returns the information of a page location.\r
-        * \r
-        * @param       array           $location\r
-        * @param       string          $requestURI\r
-        * @param       string          $requestMethod\r
-        * @param       array           $match\r
-        * @return      string\r
-        */\r
-       public function get($location, $requestURI, $requestMethod, $match);\r
+<?php
+namespace wcf\data\page\location;
+use wcf\data\IDatabaseObjectProcessor;
+
+/**
+ * Any page location class should implement this interface.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.page.location
+ * @category   Community Framework
+ */
+interface ILocation extends IDatabaseObjectProcessor {
+       /**
+        * Caches the information of a page location.
+        * 
+        * @param       array           $location
+        * @param       string          $requestURI
+        * @param       string          $requestMethod
+        * @param       array           $match
+        */
+       public function cache($location, $requestURI, $requestMethod, $match);
+       
+       /**
+        * Returns the information of a page location.
+        * 
+        * @param       array           $location
+        * @param       string          $requestURI
+        * @param       string          $requestMethod
+        * @param       array           $match
+        * @return      string
+        */
+       public function get($location, $requestURI, $requestMethod, $match);
 }
index 229c8b42eac2ac94cdab28f166d2f924415e12aa..670ef4de39383547c790c779b302c56af1eaa7ad 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\page\location;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes page location-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.page.location\r
- * @category   Community Framework\r
- */\r
-class PageLocationAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\page\location\PageLocationEditor';\r
+<?php
+namespace wcf\data\page\location;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes page location-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.page.location
+ * @category   Community Framework
+ */
+class PageLocationAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\page\location\PageLocationEditor';
 }
index 76399415c5d9a63c4ba9a23cd76bb432f184eb84..bbbe63981dfe6307b83671136bf7e7e13f3d8c08 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\page\location;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of page locations.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.page.location\r
- * @category   Community Framework\r
- */\r
-class PageLocationList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\page\location\PageLocation';\r
+<?php
+namespace wcf\data\page\location;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of page locations.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.page.location
+ * @category   Community Framework
+ */
+class PageLocationList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\page\location\PageLocation';
 }
index 2dac550939d75ad2b3868de3af2493da20ace1d3..75b7f8c0a1254846d1dcb1ebdca9c213c9264793 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\page\menu\item;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes page menu item-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.page.menu.item\r
- * @category   Community Framework\r
- */\r
-class PageMenuItemAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\page\menu\item\PageMenuItemEditor';\r
+<?php
+namespace wcf\data\page\menu\item;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes page menu item-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.page.menu.item
+ * @category   Community Framework
+ */
+class PageMenuItemAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\page\menu\item\PageMenuItemEditor';
 }
index f3ddb1a7eddb2945ec4f672fe734a1b698b0e242..364482087921b8e2620e0fcd7a2269646434a1e7 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\page\menu\item;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of page menu items.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.page.menu.item\r
- * @category   Community Framework\r
- */\r
-class PageMenuItemList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\page\menu\item\PageMenuItem';\r
+<?php
+namespace wcf\data\page\menu\item;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of page menu items.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.page.menu.item
+ * @category   Community Framework
+ */
+class PageMenuItemList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\page\menu\item\PageMenuItem';
 }
index 0bc06f2fe46e1dfb9600256a7e2226d55ce4e0d6..9244d68d641890ab477ba5deeb55b90f0cc1d711 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\search;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes search-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.search\r
- * @category   Community Framework\r
- */\r
-class SearchAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\search\SearchEditor';\r
+<?php
+namespace wcf\data\search;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes search-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.search
+ * @category   Community Framework
+ */
+class SearchAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\search\SearchEditor';
 }
index 8bc542f1c4db6c4a17393ec0955c1b93858c0449..f4e5d48de06064ed003a42802bfe29c8094ee1ed 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\search;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of searches.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.search\r
- * @category   Community Framework\r
- */\r
-class SearchList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\search\Search';\r
+<?php
+namespace wcf\data\search;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of searches.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.search
+ * @category   Community Framework
+ */
+class SearchList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\search\Search';
 }
index 8f1641d8bff2104940e4aac4aace816a3b44fc9e..d232fda6d32dfd2f64f139aeda981d0a81629d15 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\session;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes session-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.session\r
- * @category   Community Framework\r
- */\r
-class SessionAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\session\SessionEditor';\r
+<?php
+namespace wcf\data\session;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes session-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.session
+ * @category   Community Framework
+ */
+class SessionAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\session\SessionEditor';
 }
index e4946f9eb01065bf25008e37ee1968ef5672c1c6..7be565ca8dc3d07373d2cbb1ce98a9a24934e939 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\session;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of sessions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.session\r
- * @category   Community Framework\r
- */\r
-class SessionList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\session\Session';\r
+<?php
+namespace wcf\data\session;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of sessions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.session
+ * @category   Community Framework
+ */
+class SessionList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\session\Session';
 }
index ba351c31f64de28b86389774c46d3171d0d98da0..4903bddeff93efb5a8240afa0697a2420495e8bd 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\session\data;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes session data-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.session.data\r
- * @category   Community Framework\r
- */\r
-class SessionDataAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\session\data\SessionDataEditor';\r
+<?php
+namespace wcf\data\session\data;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes session data-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.session.data
+ * @category   Community Framework
+ */
+class SessionDataAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\session\data\SessionDataEditor';
 }
index d3c385d063f12517981774bec3925acd655bcbcc..3279efe15f816f0c6a4306952c4adad836eedb86 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\session\data;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of session data.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.session.data\r
- * @category   Community Framework\r
- */\r
-class SessionDataList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\session\data\SessionData';\r
+<?php
+namespace wcf\data\session\data;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of session data.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.session.data
+ * @category   Community Framework
+ */
+class SessionDataList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\session\data\SessionData';
 }
index 67927725ef9f7809ddefd42894191cb7c4de6e66..f8f30c451c0076d3ab0afcc9eea13407ae5a4570 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\spider;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes spider-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.spider\r
- * @category   Community Framework\r
- */\r
-class SpiderAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\spider\SpiderEditor';\r
+<?php
+namespace wcf\data\spider;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes spider-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.spider
+ * @category   Community Framework
+ */
+class SpiderAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\spider\SpiderEditor';
 }
index d9ba63e85b1d75cccc45e5fb7cf74997b4c7cf6d..235ff7954fe66910e47b2e44b75c46c10dfa761a 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\spider;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of spiders.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.spider\r
- * @category   Community Framework\r
- */\r
-class SpiderList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\spider\Spider';\r
+<?php
+namespace wcf\data\spider;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of spiders.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.spider
+ * @category   Community Framework
+ */
+class SpiderList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\spider\Spider';
 }
index b81a8859979b27994239073762c55b531cbe4b5b..1d4a45fea2e70f4fb1db338212d56c873e01e323 100644 (file)
@@ -1,55 +1,55 @@
-<?php\r
-namespace wcf\data\style;\r
-use wcf\data\DatabaseObject;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Represents a style.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.style\r
- * @category   Community Framework\r
- */\r
-class Style extends DatabaseObject {\r
-       /**\r
-        * @see DatabaseObject::$databaseTableName\r
-        */\r
-       protected static $databaseTableName = 'style';\r
-       \r
-       /**\r
-        * @see DatabaseObject::$databaseTableIndexName\r
-        */\r
-       protected static $databaseTableIndexName = 'styleID';\r
-       \r
-       /**\r
-        * Returns the name of this style.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function __toString() {\r
-               return $this->styleName;\r
-       }\r
-       \r
-       /**\r
-        * Returns the styles variables of this style.\r
-        * \r
-        * @return      array\r
-        */\r
-       public function getVariables() {\r
-               $variables = array();\r
-               $sql = "SELECT          variableName, variableValue\r
-                       FROM            wcf".WCF_N."_style_variable\r
-                       WHERE           styleID = ?\r
-                       ORDER BY        variableName ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($this->styleID));\r
-               while ($row = $statement->fetchArray()) {\r
-                       $variables[$row['variableName']] = $row['variableValue'];\r
-               }\r
-               \r
-               return $variables;\r
-       }\r
+<?php
+namespace wcf\data\style;
+use wcf\data\DatabaseObject;
+use wcf\system\WCF;
+
+/**
+ * Represents a style.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.style
+ * @category   Community Framework
+ */
+class Style extends DatabaseObject {
+       /**
+        * @see DatabaseObject::$databaseTableName
+        */
+       protected static $databaseTableName = 'style';
+       
+       /**
+        * @see DatabaseObject::$databaseTableIndexName
+        */
+       protected static $databaseTableIndexName = 'styleID';
+       
+       /**
+        * Returns the name of this style.
+        * 
+        * @return      string
+        */
+       public function __toString() {
+               return $this->styleName;
+       }
+       
+       /**
+        * Returns the styles variables of this style.
+        * 
+        * @return      array
+        */
+       public function getVariables() {
+               $variables = array();
+               $sql = "SELECT          variableName, variableValue
+                       FROM            wcf".WCF_N."_style_variable
+                       WHERE           styleID = ?
+                       ORDER BY        variableName ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($this->styleID));
+               while ($row = $statement->fetchArray()) {
+                       $variables[$row['variableName']] = $row['variableValue'];
+               }
+               
+               return $variables;
+       }
 }
index 9ed4b8f2f237073e22b2e4733cd052ae8743c22a..7351c2eb0e0a0b96f8d0bc842e20f0732c73d797 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\style;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes style-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.style\r
- * @category   Community Framework\r
- */\r
-class StyleAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\style\StyleEditor';\r
+<?php
+namespace wcf\data\style;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes style-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.style
+ * @category   Community Framework
+ */
+class StyleAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\style\StyleEditor';
 }
index 61906318819d6fc3a43ca967f8fa4fae59145521..35015056f6e7927956e8cb00097469903c6f7cb6 100644 (file)
-<?php\r
-namespace wcf\data\style;\r
-use wcf\data\template\group\TemplateGroupEditor;\r
-use wcf\data\template\TemplateEditor;\r
-use wcf\data\DatabaseObjectEditor;\r
-use wcf\data\IEditableCachedObject;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\image\Thumbnail;\r
-use wcf\system\io\File;\r
-use wcf\system\io\Tar;\r
-use wcf\system\io\TarWriter;\r
-use wcf\system\WCF;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-use wcf\util\XML;\r
-\r
-/**\r
- * Provides functions to edit, import, export and delete a style.\r
- * \r
- * @todo       Fix usage of XML-class (API-changes)!\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.style\r
- * @category   Community Framework\r
- */\r
-class StyleEditor extends DatabaseObjectEditor implements IEditableCachedObject {\r
-       const INFO_FILE = 'style.xml';\r
-       const STYLE_PREVIEW_IMAGE_MAX_WIDTH = 185;\r
-       const STYLE_PREVIEW_IMAGE_MAX_HEIGHT = 140;\r
-       \r
-       /**\r
-        * @see DatabaseObjectDecorator::$baseClass\r
-        */\r
-       protected static $baseClass = 'wcf\data\style\Style';\r
-       \r
-       /**\r
-        * @see wcf\data\IEditableObject::update()\r
-        */\r
-       public function update(array $parameters = array()) {\r
-               $variables = null;\r
-               if (isset($parameters['variables'])) {\r
-                       $variables = $parameters['variables'];\r
-                       unset($parameters['variables']);\r
-               }\r
-\r
-               // update style data\r
-               parent::update($parameters);\r
-               \r
-               // update variables\r
-               if ($variables !== null) {\r
-                       $this->setVariables($variables);\r
-               }\r
-               \r
-               // scale preview image\r
-               if (!empty($parameters['image']) && $parameters['image'] != $this->image) {\r
-                       self::scalePreviewImage(WCF_DIR.$parameters['image']);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IEditableObject::delete()\r
-        */\r
-       public function delete() {\r
-               parent::delete();\r
-               \r
-               // delete variables\r
-               $sql = "DELETE FROM     wcf".WCF_N."_style_variable\r
-                       WHERE           styleID = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($this->styleID));\r
-               \r
-               // delete style to package\r
-               $sql = "DELETE FROM     wcf".WCF_N."_style_to_package\r
-                       WHERE           styleID = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($this->styleID));\r
-               \r
-               // delete style files\r
-               @unlink(WCF_DIR.'style/style-'.$this->styleID.'.css');\r
-               @unlink(WCF_DIR.'style/style-'.$this->styleID.'-rtl.css');\r
-               \r
-               // delete preview image\r
-               if ($this->image) {\r
-                       @unlink(WCF_DIR.$this->image);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Sets this style as default style.\r
-        */\r
-       public function setAsDefault() {\r
-               // remove old default\r
-               $sql = "UPDATE  wcf".WCF_N."_style\r
-                       SET     isDefault = ?\r
-                       WHERE   isDefault = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array(0, 1));\r
-               \r
-               // set new default\r
-               $this->update(array(\r
-                       'isDefault' => 1,\r
-                       'disabled' => 0\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * Reads the data of a style exchange format file.\r
-        * \r
-        * @param       Tar             $tar\r
-        * @return      array           data\r
-        */\r
-       public static function readStyleData(Tar $tar) {\r
-               // search style.xml\r
-               $i = $tar->getIndexByFilename(self::INFO_FILE);\r
-               if ($i === false) {\r
-                       throw new SystemException("unable to find required file '".self::INFO_FILE."' in style archive", 100001);\r
-               }\r
-               \r
-               // open style.xml\r
-               $styleXML = new XML();\r
-               $styleXML->loadString($tar->extractToString($i));\r
-               $xmlContent = $styleXML->getElementTree('style');\r
-               $data = array(\r
-                       'name' => '', 'description' => '', 'version' => '', 'image' => '', 'copyright' => '',\r
-                       'license' => '', 'authorName' => '', 'authorURL' => '', 'templates' => '', 'images' => '',\r
-                       'variables' => '', 'date' => '0000-00-00', 'icons' => ''\r
-               );\r
-               \r
-               foreach ($xmlContent['children'] as $child) {\r
-                       switch ($child['name']) {\r
-                               case 'general': \r
-                                       foreach ($child['children'] as $general) {\r
-                                               switch ($general['name']) {\r
-                                                       case 'stylename': $data['name'] = $general['cdata']; break;\r
-                                                       case 'description': case 'version': case 'date': \r
-                                                       case 'image': case 'copyright': case 'license': $data[$general['name']] = $general['cdata']; break;\r
-                                               }\r
-                                       }\r
-                                       break;\r
-                               \r
-                               case 'author':\r
-                                       foreach ($child['children'] as $author) {\r
-                                               switch ($author['name']) {\r
-                                                       case 'authorname': $data['authorName'] = $author['cdata']; break;\r
-                                                       case 'authorurl': $data['authorURL'] = $author['cdata']; break;\r
-                                               }\r
-                                       }\r
-                                       break;\r
-                               \r
-                               case 'files':\r
-                                       foreach ($child['children'] as $files) {\r
-                                               switch ($files['name']) {\r
-                                                       case 'templates': case 'images': case 'variables': case 'icons': $data[$files['name']] = $files['cdata']; break;\r
-                                               }\r
-                                       }\r
-                                       break;\r
-                       }\r
-               }\r
-               \r
-               if (empty($data['name'])) {\r
-                       throw new SystemException("required tag 'stylename' is missing in '".self::INFO_FILE."'", 100002);\r
-               }\r
-               if (empty($data['variables'])) {\r
-                       throw new SystemException("required tag 'variables' is missing in '".self::INFO_FILE."'", 100002);\r
-               }\r
-               \r
-               // search variables.xml\r
-               $i = $tar->getIndexByFilename($data['variables']);\r
-               if ($i === false) {\r
-                       throw new SystemException("unable to find required file '".$data['variables']."' in style archive", 100001);\r
-               }\r
-               \r
-               // open variables.xml\r
-               $data['variables'] = self::readVariablesData($tar->extractToString($i));\r
-               \r
-               return $data;\r
-       }\r
-       \r
-       /**\r
-        * Reads the data of a variables.xml file.\r
-        * \r
-        * @param       string          $string         contents of a variable.xml file\r
-        * @return      array           data\r
-        */\r
-       public static function readVariablesData($string) {\r
-               // open variables.xml\r
-               $variablesXML = new XML();\r
-               $variablesXML->loadString($string);\r
-               $variablesXMLContent = $variablesXML->getElementTree('variables');\r
-               \r
-               // get variables\r
-               $variables = array();\r
-               foreach ($variablesXMLContent['children'] as $variable) {\r
-                       if (isset($variable['attrs']['name'])) {\r
-                               $variables[$variable['attrs']['name']] = $variable['cdata'];\r
-                       }\r
-               }\r
-               \r
-               return $variables;\r
-       }\r
-       \r
-       /**\r
-        * Gets the data of a style exchange format file.\r
-        * \r
-        * @param       string          $filename\r
-        * @return      array           data\r
-        */\r
-       public static function getStyleData($filename) {\r
-               // open file\r
-               $tar = new Tar($filename);\r
-               \r
-               // get style data\r
-               $data = self::readStyleData($tar);\r
-               \r
-               // export preview image to temporary location\r
-               if (!empty($data['image'])) {\r
-                       $i = $tar->getIndexByFilename($data['image']);\r
-                       if ($i !== false) {\r
-                               $path = FileUtil::getTemporaryFilename('stylePreview_', $data['image'], WCF_DIR.'tmp/');\r
-                               $data['image'] = basename($path);\r
-                               $tar->extract($i, $path);\r
-                       }\r
-               }\r
-               \r
-               $tar->close();\r
-               \r
-               return $data;\r
-       }\r
-       \r
-       /**\r
-        * Imports a style.\r
-        * \r
-        * @param       string          $filename\r
-        * @param       integer         $packageID\r
-        * @param       StyleEditor     $style\r
-        * @return      StyleEditor\r
-        */\r
-       public static function import($filename, $packageID = PACKAGE_ID, StyleEditor $style = null) {\r
-               // open file\r
-               $tar = new Tar($filename);\r
-               \r
-               // get style data\r
-               $data = self::readStyleData($tar);\r
-               \r
-               // get image locations\r
-               $iconsLocation = FileUtil::addTrailingSlash($data['variables']['global.icons.location']);\r
-               $imagesLocation = $data['variables']['global.images.location'];\r
-               \r
-               // create template group\r
-               $templateGroupID = 0;\r
-               if (!empty($data['templates'])) {\r
-                       $originalTemplateGroupName = $templateGroupName = $data['name'];\r
-                       $templateGroupFolderName = preg_replace('/[^a-z0-9_-]/i', '', $templateGroupName);\r
-                       if (empty($templateGroupFolderName)) $templateGroupFolderName = 'generic'.StringUtil::substring(StringUtil::getRandomID(), 0, 8);\r
-                       $originalTemplatePackFolderName = $templateGroupFolderName;\r
-                       \r
-                       // get unique template pack name\r
-                       $i = 1;\r
-                       do {\r
-                               $sql = "SELECT  COUNT(*) AS count\r
-                                       FROM    wcf".WCF_N."_template_group\r
-                                       WHERE   templateGroupName = ?";\r
-                               $statement = WCF::getDB()->prepareStatement($sql);\r
-                               $statement->execute(array($templateGroupName));\r
-                               $row = $statement->fetchArray();\r
-                               if (!$row['count']) break;\r
-                               $templateGroupName = $originalTemplatePackName . '_' . $i;\r
-                               $i++;\r
-                       }\r
-                       while (true);\r
-                       // get unique folder name\r
-                       $i = 1;\r
-                       do {\r
-                               $sql = "SELECT  COUNT(*) AS count\r
-                                       FROM    wcf".WCF_N."_template_group\r
-                                       WHERE   templateGroupFolderName = ?\r
-                                               AND parentTemplatePackID = ?";\r
-                               $statement = WCF::getDB()->prepareStatement($sql);\r
-                               $statement->execute(array(\r
-                                       FileUtil::addTrailingSlash($templateGroupFolderName),\r
-                                       0\r
-                               ));\r
-                               $row = $statement->fetchArray();\r
-                               if (!$row['count']) break;\r
-                               $templateGroupFolderName = $originalTemplatePackFolderName . '_' . $i;\r
-                               $i++;\r
-                       }\r
-                       while (true);\r
-                       \r
-                       $templateGroup = TemplateGroupEditor::create(array(\r
-                               'templateGroupName' => $templateGroupName,\r
-                               'templateGroupFolderName' => FileUtil::addTrailingSlash($templateGroupFolderName)\r
-                       ));\r
-                       $templateGroupID = $templateGroup->templateGroupID;\r
-               }\r
-               \r
-               // save style\r
-               $styleData = array(\r
-                       'styleName' => $data['name'],\r
-                       'variables' => $data['variables'],\r
-                       'templateGroupID' => $templateGroupID,\r
-                       'styleDescription' => $data['description'],\r
-                       'styleVersion' => $data['version'],\r
-                       'styleDate' => $data['date'],\r
-                       'image' => ($data['image'] ? 'images/' : '').$data['image'],\r
-                       'copyright' => $data['copyright'],\r
-                       'license' => $data['license'],\r
-                       'authorName' => $data['authorName'],\r
-                       'authorURL' => $data['authorURL']\r
-               );\r
-               if ($style !== null) {\r
-                       $style->update($styleData);\r
-               }\r
-               else {\r
-                       $styleData['packageID'] = $packageID;\r
-                       $style = self::create($styleData);\r
-               }\r
-               \r
-               // import preview image\r
-               if (!empty($data['image'])) {\r
-                       $i = $tar->getIndexByFilename($data['image']);\r
-                       if ($i !== false) {\r
-                               $tar->extract($i, WCF_DIR.'images/'.$data['image']);\r
-                               @chmod(WCF_DIR.'images/'.$data['image'], 0777);\r
-                       }\r
-               }\r
-               \r
-               // import images\r
-               if (!empty($data['images'])) {\r
-                       // create images folder if necessary\r
-                       if (!file_exists(WCF_DIR.$imagesLocation)) {\r
-                               @mkdir(WCF_DIR.$data['variables']['global.images.location'], 0777);\r
-                               @chmod(WCF_DIR.$data['variables']['global.images.location'], 0777);\r
-                       }\r
-                       \r
-                       $i = $tar->getIndexByFilename($data['images']);\r
-                       if ($i !== false) {\r
-                               // extract images tar\r
-                               $destination = FileUtil::getTemporaryFilename('images_');\r
-                               $tar->extract($i, $destination);\r
-                               \r
-                               // open images tar\r
-                               $imagesTar = new Tar($destination);\r
-                               $contentList = $imagesTar->getContentList();\r
-                               foreach ($contentList as $key => $val) {\r
-                                       if ($val['type'] == 'file') {\r
-                                               $imagesTar->extract($key, WCF_DIR.$imagesLocation.basename($val['filename']));\r
-                                               @chmod(WCF_DIR.$imagesLocation.basename($val['filename']), 0666);\r
-                                       }\r
-                               }\r
-\r
-                               // delete tmp file\r
-                               $imagesTar->close();\r
-                               @unlink($destination);\r
-                       }\r
-               }\r
-               \r
-               // import icons\r
-               if (!empty($data['icons']) && $iconsLocation != 'icon/') {\r
-                       $i = $tar->getIndexByFilename($data['icons']);\r
-                       if ($i !== false) {\r
-                               // extract icons tar\r
-                               $destination = FileUtil::getTemporaryFilename('icons_');\r
-                               $tar->extract($i, $destination);\r
-                               \r
-                               // open icons tar and group icons by package\r
-                               $iconsTar = new Tar($destination);\r
-                               $contentList = $iconsTar->getContentList();\r
-                               $packageToIcons = array();\r
-                               foreach ($contentList as $key => $val) {\r
-                                       if ($val['type'] == 'file') {\r
-                                               $folders = explode('/', $val['filename']);\r
-                                               $packageName = array_shift($folders);\r
-                                               if (!isset($packageToIcons[$packageName])) {\r
-                                                       $packageToIcons[$packageName] = array();\r
-                                               }\r
-                                               $packageToIcons[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders));\r
-                                       }\r
-                               }\r
-                               \r
-                               // copy icons\r
-                               foreach ($packageToIcons as $package => $icons) {\r
-                                       // try to find package\r
-                                       $sql = "SELECT  *\r
-                                               FROM    wcf".WCF_N."_package\r
-                                               WHERE   package = ?\r
-                                                       AND standalone = ?";\r
-                                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                                       $statement->execute(array(\r
-                                               $package,\r
-                                               1\r
-                                       ));\r
-                                       while ($row = $statement->fetchArray()) {\r
-                                               // get icon path\r
-                                               $iconDir = FileUtil::getRealPath(WCF_DIR.$row['packageDir']).$iconsLocation;\r
-                                               \r
-                                               // create icon path\r
-                                               if (!file_exists($iconDir)) {\r
-                                                       @mkdir($iconDir, 0777);\r
-                                                       @chmod($iconDir, 0777);\r
-                                               }\r
-                                               \r
-                                               // copy icons\r
-                                               foreach ($icons as $icon) {\r
-                                                       $iconsTar->extract($icon['index'], $iconDir.$icon['filename']);\r
-                                               }\r
-                                       }\r
-                               }\r
-                               \r
-                               // delete tmp file\r
-                               $iconsTar->close();\r
-                               @unlink($destination);\r
-                       }\r
-               }\r
-               \r
-               // import templates\r
-               if (!empty($data['templates'])) {\r
-                       $i = $tar->getIndexByFilename($data['templates']);\r
-                       if ($i !== false) {\r
-                               // extract templates tar\r
-                               $destination = FileUtil::getTemporaryFilename('templates_');\r
-                               $tar->extract($i, $destination);\r
-                               \r
-                               // open templates tar and group templates by package\r
-                               $templatesTar = new Tar($destination);\r
-                               $contentList = $templatesTar->getContentList();\r
-                               $packageToTemplates = array();\r
-                               foreach ($contentList as $key => $val) {\r
-                                       if ($val['type'] == 'file') {\r
-                                               $folders = explode('/', $val['filename']);\r
-                                               $packageName = array_shift($folders);\r
-                                               if (!isset($packageToTemplates[$packageName])) {\r
-                                                       $packageToTemplates[$packageName] = array();\r
-                                               }\r
-                                               $packageToTemplates[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders));\r
-                                       }\r
-                               }\r
-                               \r
-                               // copy templates\r
-                               foreach ($packageToTemplates as $package => $templates) {\r
-                                       // try to find package\r
-                                       $sql = "SELECT  *\r
-                                               FROM    wcf".WCF_N."_package\r
-                                               WHERE   package = ?\r
-                                                       AND standalone = ?";\r
-                                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                                       $statement->execute(array(\r
-                                               $package,\r
-                                               1\r
-                                               ));\r
-                                       while ($row = $statement->fetchArray()) {\r
-                                               // get icon path\r
-                                               $templatesDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR.$row['packageDir']).'templates/'.$templateGroupFolderName);\r
-                                               \r
-                                               // create template path\r
-                                               if (!file_exists($templatesDir)) {\r
-                                                       @mkdir($templatesDir, 0777);\r
-                                                       @chmod($templatesDir, 0777);\r
-                                               }\r
-                                               \r
-                                               // copy templates\r
-                                               foreach ($templates as $template) {\r
-                                                       $templatesTar->extract($template['index'], $templatesDir.$template['filename']);\r
-                                                       \r
-                                                       TemplateEditor::create(array(\r
-                                                               'packageID' => $row['packageID'],\r
-                                                               'templateName' => StringUtil::replace('.tpl', '', $template['filename']),\r
-                                                               'templateGroupID' => $templateGroupID\r
-                                                       ));\r
-                                               }\r
-                                       }\r
-                               }\r
-                               \r
-                               // delete tmp file\r
-                               $templatesTar->close();\r
-                               @unlink($destination);\r
-                       }\r
-               }\r
-\r
-               $tar->close();\r
-               \r
-               return $style;\r
-       }\r
-       \r
-       /**\r
-        * Exports this style.\r
-        * \r
-        * @param       boolean         $templates\r
-        * @param       boolean         $images\r
-        * @param       boolean         $icons\r
-        */\r
-       public function export($templates = false, $images = false, $icons = false) {\r
-               // create style tar\r
-               $styleTarName = FileUtil::getTemporaryFilename('style_', '.tgz');\r
-               $styleTar = new TarWriter($styleTarName, true);\r
-               \r
-               // append style preview image\r
-               if ($this->image && @file_exists(WCF_DIR.$this->image)) {\r
-                       $styleTar->add(WCF_DIR.$this->image, '', FileUtil::addTrailingSlash(dirname(WCF_DIR.$this->image)));\r
-               }\r
-               \r
-               // create style info file\r
-               $string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE style SYSTEM \"http://www.woltlab.com/DTDs/SXF/style.dtd\">\n<style>\n";\r
-               \r
-               // general block\r
-               $string .= "\t<general>\n";\r
-               $string .= "\t\t<stylename><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleName) : $this->styleName))."]]></stylename>\n"; // style name\r
-               if ($this->styleDescription) $string .= "\t\t<description><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleDescription) : $this->styleDescription))."]]></description>\n"; // style description\r
-               if ($this->styleVersion) $string .= "\t\t<version><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleVersion) : $this->styleVersion))."]]></version>\n"; // style version\r
-               if ($this->styleDate) $string .= "\t\t<date><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleDate) : $this->styleDate))."]]></date>\n"; // style date\r
-               if ($this->image) $string .= "\t\t<image><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', basename($this->image)) : basename($this->image)))."]]></image>\n"; // style preview image\r
-               if ($this->copyright) $string .= "\t\t<copyright><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->copyright) : $this->copyright))."]]></copyright>\n"; // copyright\r
-               if ($this->license) $string .= "\t\t<license><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->license) : $this->license))."]]></license>\n"; // license\r
-               $string .= "\t</general>\n";\r
-               \r
-               // author block\r
-               $string .= "\t<author>\n";\r
-               if ($this->authorName) $string .= "\t\t<authorname><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->authorName) : $this->authorName))."]]></authorname>\n"; // author name\r
-               if ($this->authorURL) $string .= "\t\t<authorurl><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->authorURL) : $this->authorURL))."]]></authorurl>\n"; // author URL\r
-               $string .= "\t</author>\n";\r
-               \r
-               // files block\r
-               $string .= "\t<files>\n";\r
-               $string .= "\t\t<variables>variables.xml</variables>\n"; // variables\r
-               if ($templates && $this->templateGroupID) $string .= "\t\t<templates>templates.tar</templates>\n"; // templates\r
-               if ($images) $string .= "\t\t<images>images.tar</images>\n"; // images\r
-               if ($icons) $string .= "\t\t<icons>icons.tar</icons>\n"; // icons\r
-               $string .= "\t</files>\n";\r
-               \r
-               $string .= "</style>";\r
-               // append style info file to style tar\r
-               $styleTar->addString(self::INFO_FILE, $string);\r
-               unset($string);\r
-               \r
-               // create variable list\r
-               $string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE variables SYSTEM \"http://www.woltlab.com/DTDs/SXF/variables.dtd\">\n<variables>\n";\r
-               // get variables\r
-               $variables = $this->getVariables();\r
-               $exportImages = array();\r
-               foreach ($variables as $name => $value) {\r
-                       // search images\r
-                       if ($images && $value) {\r
-                               if (preg_match_all('~([^/\s\$]+\.(?:gif|jpg|jpeg|png))~i', $value, $matches)) {\r
-                                       $exportImages = array_merge($exportImages, $matches[1]);\r
-                               }\r
-                       }\r
-                       $string .= "\t<variable name=\"".StringUtil::encodeHTML($name)."\"><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $value) : $value))."]]></variable>\n";\r
-               }\r
-               \r
-               $string .= "</variables>";\r
-               // append variable list to style tar\r
-               $styleTar->addString('variables.xml', $string);\r
-               unset($string);\r
-\r
-               if ($templates && $this->templateGroupID) {\r
-                       $templateGroup = new TemplateGroup($this->templateGroupID);\r
-                       \r
-                       // create templates tar\r
-                       $templatesTarName = FileUtil::getTemporaryFilename('templates', '.tar');\r
-                       $templatesTar = new TarWriter($templatesTarName);\r
-                       @chmod($templatesTarName, 0777);\r
-                       \r
-                       // append templates to tar\r
-                       // get templates\r
-                       $sql = "SELECT          template.*, package.package, package.packageDir,\r
-                                               parent_package.package AS parentPackage, parent_package.packageDir AS parentPackageDir\r
-                               FROM            wcf".WCF_N."_template template\r
-                               LEFT JOIN       wcf".WCF_N."_package package\r
-                               ON              (package.packageID = template.packageID)\r
-                               LEFT JOIN       wcf".WCF_N."_package parent_package\r
-                               ON              (parent_package.packageID = package.parentPackageID)\r
-                               WHERE           template.templateGroupID = ?";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute(array($this->templateGroupID));\r
-                       while ($row = $statement->fetchArray()) {\r
-                               $packageDir = 'com.woltlab.wcf';\r
-                               if (!empty($row['parentPackageDir'])) $packageDir = $row['parentPackage'];\r
-                               else if (!empty($row['packageDir'])) $packageDir = $row['package'];\r
-                               \r
-                               $filename = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $row['packageDir'] . 'templates/' . $templateGroup->templateGroupFolderName)) . $row['templateName'] . '.tpl';\r
-                               $templatesTar->add($filename, $packageDir, dirname($filename));\r
-                       }\r
-                       \r
-                       // append templates tar to style tar\r
-                       $templatesTar->create();\r
-                       $styleTar->add($templatesTarName, 'templates.tar', $templatesTarName);\r
-                       @unlink($templatesTarName);\r
-               }\r
-\r
-               if ($images) {\r
-                       // create images tar\r
-                       $imagesTarName = FileUtil::getTemporaryFilename('images_', '.tar');\r
-                       $imagesTar = new TarWriter($imagesTarName);\r
-                       @chmod($imagesTarName, 0777);\r
-                       \r
-                       // cache rtl versions\r
-                       foreach ($exportImages as $exportImage) {\r
-                               if (strpos($exportImage, '-ltr')) $exportImages[] = str_replace('-ltr', '-rtl', $exportImage);\r
-                       }\r
-                       \r
-                       // append images to tar\r
-                       $path = WCF_DIR.$variables['global.images.location'];\r
-                       if (file_exists($path) && is_dir($path)) {\r
-                               $handle = opendir($path);\r
-                               \r
-                               while (($file = readdir($handle)) !== false) {\r
-                                       if (is_file($path.$file) && in_array($file, $exportImages)) {\r
-                                               $imagesTar->add($path.$file, '', $path);\r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-                       // append images tar to style tar\r
-                       $imagesTar->create();\r
-                       $styleTar->add($imagesTarName, 'images.tar', $imagesTarName);\r
-                       @unlink($imagesTarName);\r
-               }\r
-               \r
-               // export icons\r
-               $iconsLocation = FileUtil::addTrailingSlash($variables['global.icons.location']);\r
-               if ($icons && $iconsLocation != 'icon/') {\r
-                       // create icons tar\r
-                       $iconsTarName = FileUtil::getTemporaryFilename('icons_', '.tar');\r
-                       $iconsTar = new TarWriter($iconsTarName);\r
-                       @chmod($iconsTar, 0777);\r
-                       \r
-                       // get package dirs\r
-                       $sql = "SELECT  package, packageDir\r
-                               FROM    wcf".WCF_N."_package\r
-                               WHERE   standalone = 1\r
-                                       AND (packageDir <> '' OR package = 'com.woltlab.wcf')";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute();\r
-                       while ($row = $statement->fetchArray()) {\r
-                               $iconsDir = FileUtil::getRealPath(WCF_DIR.$row['packageDir']).$iconsLocation;\r
-                               $packageIcons = array();\r
-                               if (file_exists($iconsDir)) {\r
-                                       $icons = glob($iconsDir.'*.png');\r
-                                       if (is_array($icons)) {\r
-                                               foreach ($icons as $icon) {\r
-                                                       $packageIcons[] = $icon;\r
-                                               }\r
-                                       }\r
-                               }\r
-                               \r
-                               if (count($packageIcons)) {\r
-                                       $iconsTar->add($packageIcons, $row['package'].'/', $iconsDir);\r
-                               }\r
-                       }\r
-                       \r
-                       $iconsTar->create();\r
-                       $styleTar->add($iconsTarName, 'icons.tar', $iconsTarName);\r
-                       @unlink($iconsTarName);\r
-               }\r
-               \r
-               // output file content\r
-               $styleTar->create();\r
-               readfile($styleTarName);\r
-               @unlink($styleTarName);\r
-       }\r
-       \r
-       /**\r
-        * Sets the variables of a style.\r
-        */\r
-       public function setVariables($variables) {\r
-               // delete old variables\r
-               $sql = "DELETE FROM     wcf".WCF_N."_style_variable\r
-                       WHERE           styleID = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($this->styleID));\r
-               \r
-               // insert new variables\r
-               $statementParameters = array();\r
-               foreach ($variables as $name => $value) {\r
-                       $statementParameters[] = array(\r
-                               'name' => $name,\r
-                               'value' => $value\r
-                       );\r
-               }\r
-               \r
-               if (count($statementParameters)) {\r
-                       $sql = "INSERT INTO     wcf".WCF_N."_style_variable\r
-                                               (styleID, variableName, variableValue)\r
-                               VALUES          (?, ?, ?)";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       \r
-                       foreach ($statementParameters as $parameter) {\r
-                               $statement->execute(array(\r
-                                       $this->styleID,\r
-                                       $parameter['name'],\r
-                                       $parameter['value']\r
-                               ));\r
-                       }\r
-               }\r
-               \r
-               $this->writeStyleFile();\r
-       }\r
-       \r
-       /**\r
-        * Writes the style-*.css file.\r
-        */\r
-       public function writeStyleFile() {\r
-               // get variables\r
-               $variables = $this->getVariables();\r
-               \r
-               // parse additional styles\r
-               self::parseAdditionalStyles($variables);\r
-               \r
-               // get file handle\r
-               $file = new File(WCF_DIR . 'style/style-'.$this->styleID.'.css', 'wb');\r
-               \r
-               // include static styles\r
-               $staticStyles = glob(WCF_DIR.'style/*.css');\r
-               if ($staticStyles) {\r
-                       foreach ($staticStyles as $staticStyle) {\r
-                               if (!preg_match('/style-\d+(?:-rtl)?\.css/', $staticStyle)) {\r
-                                       $contents = file_get_contents($staticStyle);\r
-                                       $contents = StyleUtil::compressCSS($contents);\r
-                                       $file->write("/* static: ".basename($staticStyle)." */\n");\r
-                                       $file->write(StringUtil::trim($contents)."\n");\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               // get attributes\r
-               $file->write("/* dynamic style attributes */\n");\r
-               $sortedAttributes = array();\r
-               $sql = "SELECT          *\r
-                       FROM            wcf".WCF_N."_style_variable_to_attribute\r
-                       ORDER BY        variableName, attributeName, cssSelector";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               while ($row = $statement->fetchArray()) {\r
-                       if (!empty($variables[$row['variableName']])) {\r
-                               if (!isset($sortedAttributes[$row['variableName']])) $sortedAttributes[$row['variableName']] = array();\r
-                               if (!isset($sortedAttributes[$row['variableName']][$row['attributeName']])) $sortedAttributes[$row['variableName']][$row['attributeName']] = array();\r
-                               $sortedAttributes[$row['variableName']][$row['attributeName']][] = $row['cssSelector'];\r
-                       }\r
-               }\r
-               \r
-               foreach ($sortedAttributes as $variableName => $attributes) {\r
-                       foreach ($attributes as $attributeName => $cssSelectors) {\r
-                               $count = 0;\r
-                               \r
-                               // write selectors\r
-                               $css1Selectors = $css2Selectors = array();\r
-                               foreach ($cssSelectors as $cssSelector) {\r
-                                       if (empty($cssSelector)) {\r
-                                               $file->write("/* ".$variableName." */\n");\r
-                                               $file->write(StyleUtil::compressCSS($variables[$variableName]));\r
-                                               $file->write("\n");\r
-                                       }\r
-                                       else {\r
-                                               if (preg_match('/^[a-z0-9.#:_\s-*]+$/i', $cssSelector)) {\r
-                                                       $css1Selectors[] = $cssSelector;\r
-                                               }\r
-                                               else {\r
-                                                       $css2Selectors[] = $cssSelector;\r
-                                               }\r
-                                       }\r
-                               }\r
-                               \r
-                               if (count($css1Selectors)) {\r
-                                       $file->write(implode(',', $css1Selectors));\r
-                                       \r
-                                       $file->write("{");\r
-                                       \r
-                                       // write attribute\r
-                                       if (!empty($attributeName)) $file->write($attributeName .":");\r
-                               \r
-                                       // write value\r
-                                       $file->write($variables[$variableName]);\r
-                                       \r
-                                       $file->write("}\n");\r
-                               }\r
-                               \r
-                               if (count($css2Selectors)) {\r
-                                       $file->write(implode(',', $css2Selectors));\r
-                                       \r
-                                       $file->write("{");\r
-                                       \r
-                                       // write attribute\r
-                                       if (!empty($attributeName)) $file->write($attributeName .":");\r
-                               \r
-                                       // write value\r
-                                       $file->write($variables[$variableName]);\r
-                                       \r
-                                       $file->write("}\n");\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               // close file\r
-               $file->close();\r
-               @chmod(WCF_DIR . 'style/style-'.$this->styleID.'.css', 0777);\r
-               $this->writeStyleFileRTL();\r
-       }\r
-       \r
-       /**\r
-        * Converts the file of this style to a RTL ("right-to-left") version. \r
-        */\r
-       public function writeStyleFileRTL() {\r
-               // get contents of LTR version\r
-               $contents = file_get_contents(WCF_DIR . 'style/style-'.$this->styleID.'.css');\r
-               \r
-               // convert ltr to rtl\r
-               $contents = StyleUtil::convertCSSToRTL($contents);\r
-               \r
-               // write file\r
-               $file = new File(WCF_DIR . 'style/style-'.$this->styleID.'-rtl.css');\r
-               $file->write($contents);\r
-               $file->close();\r
-               @chmod(WCF_DIR . 'style/style-'.$this->styleID.'-rtl.css', 0777);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IEditableObject::create()\r
-        */\r
-       public static function create(array $parameters = array()) {\r
-               $variables = null;\r
-               if (isset($parameters['variables'])) {\r
-                       $variables = $parameters['variables'];\r
-                       unset($parameters['variables']);\r
-               }\r
-               \r
-               // default values\r
-               if (!isset($parameters['packageID'])) $parameters['packageID'] = PACKAGE_ID;\r
-               if (!isset($parameters['styleDate'])) $parameters['styleDate'] = gmdate('Y-m-d', TIME_NOW);\r
-               \r
-               // save style\r
-               $style = parent::create($parameters);           \r
-               $styleEditor = new StyleEditor($style);\r
-               \r
-               // save variables\r
-               if ($variables !== null) {\r
-                       $styleEditor->setVariables($variables);\r
-               }\r
-               \r
-               // scale preview image\r
-               if (!empty($parameters['image'])) {\r
-                       self::scalePreviewImage(WCF_DIR.$parameters['image']);\r
-               }\r
-               \r
-               return $style;\r
-       }\r
-       \r
-       /**\r
-        * @see IEditableCachedObject::resetCache()\r
-        */\r
-       public static function resetCache() {\r
-               WCF::getCache()->clear(WCF_DIR.'cache', 'cache.icon-*-'.$this->styleID.'.php');\r
-       }\r
-       \r
-       /**\r
-        * Scales the style preview image.\r
-        * \r
-        * @param       string          $filename\r
-        * @return      boolean\r
-        */\r
-       public static function scalePreviewImage($filename) {\r
-               $thumbnail = new Thumbnail($filename, self::STYLE_PREVIEW_IMAGE_MAX_WIDTH, self::STYLE_PREVIEW_IMAGE_MAX_HEIGHT);\r
-               if (($source = $thumbnail->makeThumbnail())) {\r
-                       $file = new File($filename);\r
-                       $file->write($source);\r
-                       $file->close();\r
-                       \r
-                       return true;\r
-               }\r
-               \r
-               return false;\r
-       }\r
-       \r
-       private static $variables = array();\r
-       private static function parseAdditionalStyles(&$variables) {\r
-               self::$variables = $variables;\r
-               // fix images location\r
-               if (!empty(self::$variables['global.images.location']) && !FileUtil::isURL(self::$variables['global.images.location']) && substr(self::$variables['global.images.location'], 0, 1) != '/') {\r
-                       self::$variables['global.images.location'] = '../'.self::$variables['global.images.location'];\r
-               }\r
-               // fix images location\r
-               if (!empty(self::$variables['global.icons.location']) && !FileUtil::isURL(self::$variables['global.icons.location']) && substr(self::$variables['global.icons.location'], 0, 1) != '/') {\r
-                       self::$variables['global.icons.location'] = '../'.self::$variables['global.icons.location'];\r
-               }\r
-               \r
-               // parse additional styles\r
-               if (!empty($variables['user.additional.style.input1.use'])) {\r
-                       $variables['user.additional.style.input1.use'] = preg_replace_callback('/\$([a-z0-9_\-\.]+)\$/', array('self', 'parseAdditionalStylesCallback'), $variables['user.additional.style.input1.use']);\r
-               }\r
-               if (!empty($variables['user.additional.style.input2.use'])) {\r
-                       $variables['user.additional.style.input2.use'] = preg_replace_callback('/\$([a-z0-9_\-\.]+)\$/', array('self', 'parseAdditionalStylesCallback'), $variables['user.additional.style.input2.use']);\r
-               }\r
-       }\r
-       \r
-       private static function parseAdditionalStylesCallback($match) {\r
-               if (isset(self::$variables[$match[1]])) {\r
-                       return self::$variables[$match[1]];\r
-               }\r
-               else {\r
-                       return $match[0];\r
-               }\r
-       }\r
+<?php
+namespace wcf\data\style;
+use wcf\data\template\group\TemplateGroupEditor;
+use wcf\data\template\TemplateEditor;
+use wcf\data\DatabaseObjectEditor;
+use wcf\data\IEditableCachedObject;
+use wcf\system\exception\SystemException;
+use wcf\system\image\Thumbnail;
+use wcf\system\io\File;
+use wcf\system\io\Tar;
+use wcf\system\io\TarWriter;
+use wcf\system\WCF;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+use wcf\util\XML;
+
+/**
+ * Provides functions to edit, import, export and delete a style.
+ * 
+ * @todo       Fix usage of XML-class (API-changes)!
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.style
+ * @category   Community Framework
+ */
+class StyleEditor extends DatabaseObjectEditor implements IEditableCachedObject {
+       const INFO_FILE = 'style.xml';
+       const STYLE_PREVIEW_IMAGE_MAX_WIDTH = 185;
+       const STYLE_PREVIEW_IMAGE_MAX_HEIGHT = 140;
+       
+       /**
+        * @see DatabaseObjectDecorator::$baseClass
+        */
+       protected static $baseClass = 'wcf\data\style\Style';
+       
+       /**
+        * @see wcf\data\IEditableObject::update()
+        */
+       public function update(array $parameters = array()) {
+               $variables = null;
+               if (isset($parameters['variables'])) {
+                       $variables = $parameters['variables'];
+                       unset($parameters['variables']);
+               }
+
+               // update style data
+               parent::update($parameters);
+               
+               // update variables
+               if ($variables !== null) {
+                       $this->setVariables($variables);
+               }
+               
+               // scale preview image
+               if (!empty($parameters['image']) && $parameters['image'] != $this->image) {
+                       self::scalePreviewImage(WCF_DIR.$parameters['image']);
+               }
+       }
+       
+       /**
+        * @see wcf\data\IEditableObject::delete()
+        */
+       public function delete() {
+               parent::delete();
+               
+               // delete variables
+               $sql = "DELETE FROM     wcf".WCF_N."_style_variable
+                       WHERE           styleID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($this->styleID));
+               
+               // delete style to package
+               $sql = "DELETE FROM     wcf".WCF_N."_style_to_package
+                       WHERE           styleID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($this->styleID));
+               
+               // delete style files
+               @unlink(WCF_DIR.'style/style-'.$this->styleID.'.css');
+               @unlink(WCF_DIR.'style/style-'.$this->styleID.'-rtl.css');
+               
+               // delete preview image
+               if ($this->image) {
+                       @unlink(WCF_DIR.$this->image);
+               }
+       }
+       
+       /**
+        * Sets this style as default style.
+        */
+       public function setAsDefault() {
+               // remove old default
+               $sql = "UPDATE  wcf".WCF_N."_style
+                       SET     isDefault = ?
+                       WHERE   isDefault = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array(0, 1));
+               
+               // set new default
+               $this->update(array(
+                       'isDefault' => 1,
+                       'disabled' => 0
+               ));
+       }
+       
+       /**
+        * Reads the data of a style exchange format file.
+        * 
+        * @param       Tar             $tar
+        * @return      array           data
+        */
+       public static function readStyleData(Tar $tar) {
+               // search style.xml
+               $i = $tar->getIndexByFilename(self::INFO_FILE);
+               if ($i === false) {
+                       throw new SystemException("unable to find required file '".self::INFO_FILE."' in style archive", 100001);
+               }
+               
+               // open style.xml
+               $styleXML = new XML();
+               $styleXML->loadString($tar->extractToString($i));
+               $xmlContent = $styleXML->getElementTree('style');
+               $data = array(
+                       'name' => '', 'description' => '', 'version' => '', 'image' => '', 'copyright' => '',
+                       'license' => '', 'authorName' => '', 'authorURL' => '', 'templates' => '', 'images' => '',
+                       'variables' => '', 'date' => '0000-00-00', 'icons' => ''
+               );
+               
+               foreach ($xmlContent['children'] as $child) {
+                       switch ($child['name']) {
+                               case 'general': 
+                                       foreach ($child['children'] as $general) {
+                                               switch ($general['name']) {
+                                                       case 'stylename': $data['name'] = $general['cdata']; break;
+                                                       case 'description': case 'version': case 'date': 
+                                                       case 'image': case 'copyright': case 'license': $data[$general['name']] = $general['cdata']; break;
+                                               }
+                                       }
+                                       break;
+                               
+                               case 'author':
+                                       foreach ($child['children'] as $author) {
+                                               switch ($author['name']) {
+                                                       case 'authorname': $data['authorName'] = $author['cdata']; break;
+                                                       case 'authorurl': $data['authorURL'] = $author['cdata']; break;
+                                               }
+                                       }
+                                       break;
+                               
+                               case 'files':
+                                       foreach ($child['children'] as $files) {
+                                               switch ($files['name']) {
+                                                       case 'templates': case 'images': case 'variables': case 'icons': $data[$files['name']] = $files['cdata']; break;
+                                               }
+                                       }
+                                       break;
+                       }
+               }
+               
+               if (empty($data['name'])) {
+                       throw new SystemException("required tag 'stylename' is missing in '".self::INFO_FILE."'", 100002);
+               }
+               if (empty($data['variables'])) {
+                       throw new SystemException("required tag 'variables' is missing in '".self::INFO_FILE."'", 100002);
+               }
+               
+               // search variables.xml
+               $i = $tar->getIndexByFilename($data['variables']);
+               if ($i === false) {
+                       throw new SystemException("unable to find required file '".$data['variables']."' in style archive", 100001);
+               }
+               
+               // open variables.xml
+               $data['variables'] = self::readVariablesData($tar->extractToString($i));
+               
+               return $data;
+       }
+       
+       /**
+        * Reads the data of a variables.xml file.
+        * 
+        * @param       string          $string         contents of a variable.xml file
+        * @return      array           data
+        */
+       public static function readVariablesData($string) {
+               // open variables.xml
+               $variablesXML = new XML();
+               $variablesXML->loadString($string);
+               $variablesXMLContent = $variablesXML->getElementTree('variables');
+               
+               // get variables
+               $variables = array();
+               foreach ($variablesXMLContent['children'] as $variable) {
+                       if (isset($variable['attrs']['name'])) {
+                               $variables[$variable['attrs']['name']] = $variable['cdata'];
+                       }
+               }
+               
+               return $variables;
+       }
+       
+       /**
+        * Gets the data of a style exchange format file.
+        * 
+        * @param       string          $filename
+        * @return      array           data
+        */
+       public static function getStyleData($filename) {
+               // open file
+               $tar = new Tar($filename);
+               
+               // get style data
+               $data = self::readStyleData($tar);
+               
+               // export preview image to temporary location
+               if (!empty($data['image'])) {
+                       $i = $tar->getIndexByFilename($data['image']);
+                       if ($i !== false) {
+                               $path = FileUtil::getTemporaryFilename('stylePreview_', $data['image'], WCF_DIR.'tmp/');
+                               $data['image'] = basename($path);
+                               $tar->extract($i, $path);
+                       }
+               }
+               
+               $tar->close();
+               
+               return $data;
+       }
+       
+       /**
+        * Imports a style.
+        * 
+        * @param       string          $filename
+        * @param       integer         $packageID
+        * @param       StyleEditor     $style
+        * @return      StyleEditor
+        */
+       public static function import($filename, $packageID = PACKAGE_ID, StyleEditor $style = null) {
+               // open file
+               $tar = new Tar($filename);
+               
+               // get style data
+               $data = self::readStyleData($tar);
+               
+               // get image locations
+               $iconsLocation = FileUtil::addTrailingSlash($data['variables']['global.icons.location']);
+               $imagesLocation = $data['variables']['global.images.location'];
+               
+               // create template group
+               $templateGroupID = 0;
+               if (!empty($data['templates'])) {
+                       $originalTemplateGroupName = $templateGroupName = $data['name'];
+                       $templateGroupFolderName = preg_replace('/[^a-z0-9_-]/i', '', $templateGroupName);
+                       if (empty($templateGroupFolderName)) $templateGroupFolderName = 'generic'.StringUtil::substring(StringUtil::getRandomID(), 0, 8);
+                       $originalTemplatePackFolderName = $templateGroupFolderName;
+                       
+                       // get unique template pack name
+                       $i = 1;
+                       do {
+                               $sql = "SELECT  COUNT(*) AS count
+                                       FROM    wcf".WCF_N."_template_group
+                                       WHERE   templateGroupName = ?";
+                               $statement = WCF::getDB()->prepareStatement($sql);
+                               $statement->execute(array($templateGroupName));
+                               $row = $statement->fetchArray();
+                               if (!$row['count']) break;
+                               $templateGroupName = $originalTemplatePackName . '_' . $i;
+                               $i++;
+                       }
+                       while (true);
+                       // get unique folder name
+                       $i = 1;
+                       do {
+                               $sql = "SELECT  COUNT(*) AS count
+                                       FROM    wcf".WCF_N."_template_group
+                                       WHERE   templateGroupFolderName = ?
+                                               AND parentTemplatePackID = ?";
+                               $statement = WCF::getDB()->prepareStatement($sql);
+                               $statement->execute(array(
+                                       FileUtil::addTrailingSlash($templateGroupFolderName),
+                                       0
+                               ));
+                               $row = $statement->fetchArray();
+                               if (!$row['count']) break;
+                               $templateGroupFolderName = $originalTemplatePackFolderName . '_' . $i;
+                               $i++;
+                       }
+                       while (true);
+                       
+                       $templateGroup = TemplateGroupEditor::create(array(
+                               'templateGroupName' => $templateGroupName,
+                               'templateGroupFolderName' => FileUtil::addTrailingSlash($templateGroupFolderName)
+                       ));
+                       $templateGroupID = $templateGroup->templateGroupID;
+               }
+               
+               // save style
+               $styleData = array(
+                       'styleName' => $data['name'],
+                       'variables' => $data['variables'],
+                       'templateGroupID' => $templateGroupID,
+                       'styleDescription' => $data['description'],
+                       'styleVersion' => $data['version'],
+                       'styleDate' => $data['date'],
+                       'image' => ($data['image'] ? 'images/' : '').$data['image'],
+                       'copyright' => $data['copyright'],
+                       'license' => $data['license'],
+                       'authorName' => $data['authorName'],
+                       'authorURL' => $data['authorURL']
+               );
+               if ($style !== null) {
+                       $style->update($styleData);
+               }
+               else {
+                       $styleData['packageID'] = $packageID;
+                       $style = self::create($styleData);
+               }
+               
+               // import preview image
+               if (!empty($data['image'])) {
+                       $i = $tar->getIndexByFilename($data['image']);
+                       if ($i !== false) {
+                               $tar->extract($i, WCF_DIR.'images/'.$data['image']);
+                               @chmod(WCF_DIR.'images/'.$data['image'], 0777);
+                       }
+               }
+               
+               // import images
+               if (!empty($data['images'])) {
+                       // create images folder if necessary
+                       if (!file_exists(WCF_DIR.$imagesLocation)) {
+                               @mkdir(WCF_DIR.$data['variables']['global.images.location'], 0777);
+                               @chmod(WCF_DIR.$data['variables']['global.images.location'], 0777);
+                       }
+                       
+                       $i = $tar->getIndexByFilename($data['images']);
+                       if ($i !== false) {
+                               // extract images tar
+                               $destination = FileUtil::getTemporaryFilename('images_');
+                               $tar->extract($i, $destination);
+                               
+                               // open images tar
+                               $imagesTar = new Tar($destination);
+                               $contentList = $imagesTar->getContentList();
+                               foreach ($contentList as $key => $val) {
+                                       if ($val['type'] == 'file') {
+                                               $imagesTar->extract($key, WCF_DIR.$imagesLocation.basename($val['filename']));
+                                               @chmod(WCF_DIR.$imagesLocation.basename($val['filename']), 0666);
+                                       }
+                               }
+
+                               // delete tmp file
+                               $imagesTar->close();
+                               @unlink($destination);
+                       }
+               }
+               
+               // import icons
+               if (!empty($data['icons']) && $iconsLocation != 'icon/') {
+                       $i = $tar->getIndexByFilename($data['icons']);
+                       if ($i !== false) {
+                               // extract icons tar
+                               $destination = FileUtil::getTemporaryFilename('icons_');
+                               $tar->extract($i, $destination);
+                               
+                               // open icons tar and group icons by package
+                               $iconsTar = new Tar($destination);
+                               $contentList = $iconsTar->getContentList();
+                               $packageToIcons = array();
+                               foreach ($contentList as $key => $val) {
+                                       if ($val['type'] == 'file') {
+                                               $folders = explode('/', $val['filename']);
+                                               $packageName = array_shift($folders);
+                                               if (!isset($packageToIcons[$packageName])) {
+                                                       $packageToIcons[$packageName] = array();
+                                               }
+                                               $packageToIcons[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders));
+                                       }
+                               }
+                               
+                               // copy icons
+                               foreach ($packageToIcons as $package => $icons) {
+                                       // try to find package
+                                       $sql = "SELECT  *
+                                               FROM    wcf".WCF_N."_package
+                                               WHERE   package = ?
+                                                       AND standalone = ?";
+                                       $statement = WCF::getDB()->prepareStatement($sql);
+                                       $statement->execute(array(
+                                               $package,
+                                               1
+                                       ));
+                                       while ($row = $statement->fetchArray()) {
+                                               // get icon path
+                                               $iconDir = FileUtil::getRealPath(WCF_DIR.$row['packageDir']).$iconsLocation;
+                                               
+                                               // create icon path
+                                               if (!file_exists($iconDir)) {
+                                                       @mkdir($iconDir, 0777);
+                                                       @chmod($iconDir, 0777);
+                                               }
+                                               
+                                               // copy icons
+                                               foreach ($icons as $icon) {
+                                                       $iconsTar->extract($icon['index'], $iconDir.$icon['filename']);
+                                               }
+                                       }
+                               }
+                               
+                               // delete tmp file
+                               $iconsTar->close();
+                               @unlink($destination);
+                       }
+               }
+               
+               // import templates
+               if (!empty($data['templates'])) {
+                       $i = $tar->getIndexByFilename($data['templates']);
+                       if ($i !== false) {
+                               // extract templates tar
+                               $destination = FileUtil::getTemporaryFilename('templates_');
+                               $tar->extract($i, $destination);
+                               
+                               // open templates tar and group templates by package
+                               $templatesTar = new Tar($destination);
+                               $contentList = $templatesTar->getContentList();
+                               $packageToTemplates = array();
+                               foreach ($contentList as $key => $val) {
+                                       if ($val['type'] == 'file') {
+                                               $folders = explode('/', $val['filename']);
+                                               $packageName = array_shift($folders);
+                                               if (!isset($packageToTemplates[$packageName])) {
+                                                       $packageToTemplates[$packageName] = array();
+                                               }
+                                               $packageToTemplates[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders));
+                                       }
+                               }
+                               
+                               // copy templates
+                               foreach ($packageToTemplates as $package => $templates) {
+                                       // try to find package
+                                       $sql = "SELECT  *
+                                               FROM    wcf".WCF_N."_package
+                                               WHERE   package = ?
+                                                       AND standalone = ?";
+                                       $statement = WCF::getDB()->prepareStatement($sql);
+                                       $statement->execute(array(
+                                               $package,
+                                               1
+                                               ));
+                                       while ($row = $statement->fetchArray()) {
+                                               // get icon path
+                                               $templatesDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR.$row['packageDir']).'templates/'.$templateGroupFolderName);
+                                               
+                                               // create template path
+                                               if (!file_exists($templatesDir)) {
+                                                       @mkdir($templatesDir, 0777);
+                                                       @chmod($templatesDir, 0777);
+                                               }
+                                               
+                                               // copy templates
+                                               foreach ($templates as $template) {
+                                                       $templatesTar->extract($template['index'], $templatesDir.$template['filename']);
+                                                       
+                                                       TemplateEditor::create(array(
+                                                               'packageID' => $row['packageID'],
+                                                               'templateName' => StringUtil::replace('.tpl', '', $template['filename']),
+                                                               'templateGroupID' => $templateGroupID
+                                                       ));
+                                               }
+                                       }
+                               }
+                               
+                               // delete tmp file
+                               $templatesTar->close();
+                               @unlink($destination);
+                       }
+               }
+
+               $tar->close();
+               
+               return $style;
+       }
+       
+       /**
+        * Exports this style.
+        * 
+        * @param       boolean         $templates
+        * @param       boolean         $images
+        * @param       boolean         $icons
+        */
+       public function export($templates = false, $images = false, $icons = false) {
+               // create style tar
+               $styleTarName = FileUtil::getTemporaryFilename('style_', '.tgz');
+               $styleTar = new TarWriter($styleTarName, true);
+               
+               // append style preview image
+               if ($this->image && @file_exists(WCF_DIR.$this->image)) {
+                       $styleTar->add(WCF_DIR.$this->image, '', FileUtil::addTrailingSlash(dirname(WCF_DIR.$this->image)));
+               }
+               
+               // create style info file
+               $string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE style SYSTEM \"http://www.woltlab.com/DTDs/SXF/style.dtd\">\n<style>\n";
+               
+               // general block
+               $string .= "\t<general>\n";
+               $string .= "\t\t<stylename><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleName) : $this->styleName))."]]></stylename>\n"; // style name
+               if ($this->styleDescription) $string .= "\t\t<description><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleDescription) : $this->styleDescription))."]]></description>\n"; // style description
+               if ($this->styleVersion) $string .= "\t\t<version><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleVersion) : $this->styleVersion))."]]></version>\n"; // style version
+               if ($this->styleDate) $string .= "\t\t<date><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleDate) : $this->styleDate))."]]></date>\n"; // style date
+               if ($this->image) $string .= "\t\t<image><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', basename($this->image)) : basename($this->image)))."]]></image>\n"; // style preview image
+               if ($this->copyright) $string .= "\t\t<copyright><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->copyright) : $this->copyright))."]]></copyright>\n"; // copyright
+               if ($this->license) $string .= "\t\t<license><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->license) : $this->license))."]]></license>\n"; // license
+               $string .= "\t</general>\n";
+               
+               // author block
+               $string .= "\t<author>\n";
+               if ($this->authorName) $string .= "\t\t<authorname><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->authorName) : $this->authorName))."]]></authorname>\n"; // author name
+               if ($this->authorURL) $string .= "\t\t<authorurl><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->authorURL) : $this->authorURL))."]]></authorurl>\n"; // author URL
+               $string .= "\t</author>\n";
+               
+               // files block
+               $string .= "\t<files>\n";
+               $string .= "\t\t<variables>variables.xml</variables>\n"; // variables
+               if ($templates && $this->templateGroupID) $string .= "\t\t<templates>templates.tar</templates>\n"; // templates
+               if ($images) $string .= "\t\t<images>images.tar</images>\n"; // images
+               if ($icons) $string .= "\t\t<icons>icons.tar</icons>\n"; // icons
+               $string .= "\t</files>\n";
+               
+               $string .= "</style>";
+               // append style info file to style tar
+               $styleTar->addString(self::INFO_FILE, $string);
+               unset($string);
+               
+               // create variable list
+               $string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE variables SYSTEM \"http://www.woltlab.com/DTDs/SXF/variables.dtd\">\n<variables>\n";
+               // get variables
+               $variables = $this->getVariables();
+               $exportImages = array();
+               foreach ($variables as $name => $value) {
+                       // search images
+                       if ($images && $value) {
+                               if (preg_match_all('~([^/\s\$]+\.(?:gif|jpg|jpeg|png))~i', $value, $matches)) {
+                                       $exportImages = array_merge($exportImages, $matches[1]);
+                               }
+                       }
+                       $string .= "\t<variable name=\"".StringUtil::encodeHTML($name)."\"><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $value) : $value))."]]></variable>\n";
+               }
+               
+               $string .= "</variables>";
+               // append variable list to style tar
+               $styleTar->addString('variables.xml', $string);
+               unset($string);
+
+               if ($templates && $this->templateGroupID) {
+                       $templateGroup = new TemplateGroup($this->templateGroupID);
+                       
+                       // create templates tar
+                       $templatesTarName = FileUtil::getTemporaryFilename('templates', '.tar');
+                       $templatesTar = new TarWriter($templatesTarName);
+                       @chmod($templatesTarName, 0777);
+                       
+                       // append templates to tar
+                       // get templates
+                       $sql = "SELECT          template.*, package.package, package.packageDir,
+                                               parent_package.package AS parentPackage, parent_package.packageDir AS parentPackageDir
+                               FROM            wcf".WCF_N."_template template
+                               LEFT JOIN       wcf".WCF_N."_package package
+                               ON              (package.packageID = template.packageID)
+                               LEFT JOIN       wcf".WCF_N."_package parent_package
+                               ON              (parent_package.packageID = package.parentPackageID)
+                               WHERE           template.templateGroupID = ?";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute(array($this->templateGroupID));
+                       while ($row = $statement->fetchArray()) {
+                               $packageDir = 'com.woltlab.wcf';
+                               if (!empty($row['parentPackageDir'])) $packageDir = $row['parentPackage'];
+                               else if (!empty($row['packageDir'])) $packageDir = $row['package'];
+                               
+                               $filename = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $row['packageDir'] . 'templates/' . $templateGroup->templateGroupFolderName)) . $row['templateName'] . '.tpl';
+                               $templatesTar->add($filename, $packageDir, dirname($filename));
+                       }
+                       
+                       // append templates tar to style tar
+                       $templatesTar->create();
+                       $styleTar->add($templatesTarName, 'templates.tar', $templatesTarName);
+                       @unlink($templatesTarName);
+               }
+
+               if ($images) {
+                       // create images tar
+                       $imagesTarName = FileUtil::getTemporaryFilename('images_', '.tar');
+                       $imagesTar = new TarWriter($imagesTarName);
+                       @chmod($imagesTarName, 0777);
+                       
+                       // cache rtl versions
+                       foreach ($exportImages as $exportImage) {
+                               if (strpos($exportImage, '-ltr')) $exportImages[] = str_replace('-ltr', '-rtl', $exportImage);
+                       }
+                       
+                       // append images to tar
+                       $path = WCF_DIR.$variables['global.images.location'];
+                       if (file_exists($path) && is_dir($path)) {
+                               $handle = opendir($path);
+                               
+                               while (($file = readdir($handle)) !== false) {
+                                       if (is_file($path.$file) && in_array($file, $exportImages)) {
+                                               $imagesTar->add($path.$file, '', $path);
+                                       }
+                               }
+                       }
+                       
+                       // append images tar to style tar
+                       $imagesTar->create();
+                       $styleTar->add($imagesTarName, 'images.tar', $imagesTarName);
+                       @unlink($imagesTarName);
+               }
+               
+               // export icons
+               $iconsLocation = FileUtil::addTrailingSlash($variables['global.icons.location']);
+               if ($icons && $iconsLocation != 'icon/') {
+                       // create icons tar
+                       $iconsTarName = FileUtil::getTemporaryFilename('icons_', '.tar');
+                       $iconsTar = new TarWriter($iconsTarName);
+                       @chmod($iconsTar, 0777);
+                       
+                       // get package dirs
+                       $sql = "SELECT  package, packageDir
+                               FROM    wcf".WCF_N."_package
+                               WHERE   standalone = 1
+                                       AND (packageDir <> '' OR package = 'com.woltlab.wcf')";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute();
+                       while ($row = $statement->fetchArray()) {
+                               $iconsDir = FileUtil::getRealPath(WCF_DIR.$row['packageDir']).$iconsLocation;
+                               $packageIcons = array();
+                               if (file_exists($iconsDir)) {
+                                       $icons = glob($iconsDir.'*.png');
+                                       if (is_array($icons)) {
+                                               foreach ($icons as $icon) {
+                                                       $packageIcons[] = $icon;
+                                               }
+                                       }
+                               }
+                               
+                               if (count($packageIcons)) {
+                                       $iconsTar->add($packageIcons, $row['package'].'/', $iconsDir);
+                               }
+                       }
+                       
+                       $iconsTar->create();
+                       $styleTar->add($iconsTarName, 'icons.tar', $iconsTarName);
+                       @unlink($iconsTarName);
+               }
+               
+               // output file content
+               $styleTar->create();
+               readfile($styleTarName);
+               @unlink($styleTarName);
+       }
+       
+       /**
+        * Sets the variables of a style.
+        */
+       public function setVariables($variables) {
+               // delete old variables
+               $sql = "DELETE FROM     wcf".WCF_N."_style_variable
+                       WHERE           styleID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($this->styleID));
+               
+               // insert new variables
+               $statementParameters = array();
+               foreach ($variables as $name => $value) {
+                       $statementParameters[] = array(
+                               'name' => $name,
+                               'value' => $value
+                       );
+               }
+               
+               if (count($statementParameters)) {
+                       $sql = "INSERT INTO     wcf".WCF_N."_style_variable
+                                               (styleID, variableName, variableValue)
+                               VALUES          (?, ?, ?)";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       
+                       foreach ($statementParameters as $parameter) {
+                               $statement->execute(array(
+                                       $this->styleID,
+                                       $parameter['name'],
+                                       $parameter['value']
+                               ));
+                       }
+               }
+               
+               $this->writeStyleFile();
+       }
+       
+       /**
+        * Writes the style-*.css file.
+        */
+       public function writeStyleFile() {
+               // get variables
+               $variables = $this->getVariables();
+               
+               // parse additional styles
+               self::parseAdditionalStyles($variables);
+               
+               // get file handle
+               $file = new File(WCF_DIR . 'style/style-'.$this->styleID.'.css', 'wb');
+               
+               // include static styles
+               $staticStyles = glob(WCF_DIR.'style/*.css');
+               if ($staticStyles) {
+                       foreach ($staticStyles as $staticStyle) {
+                               if (!preg_match('/style-\d+(?:-rtl)?\.css/', $staticStyle)) {
+                                       $contents = file_get_contents($staticStyle);
+                                       $contents = StyleUtil::compressCSS($contents);
+                                       $file->write("/* static: ".basename($staticStyle)." */\n");
+                                       $file->write(StringUtil::trim($contents)."\n");
+                               }
+                       }
+               }
+               
+               // get attributes
+               $file->write("/* dynamic style attributes */\n");
+               $sortedAttributes = array();
+               $sql = "SELECT          *
+                       FROM            wcf".WCF_N."_style_variable_to_attribute
+                       ORDER BY        variableName, attributeName, cssSelector";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute();
+               while ($row = $statement->fetchArray()) {
+                       if (!empty($variables[$row['variableName']])) {
+                               if (!isset($sortedAttributes[$row['variableName']])) $sortedAttributes[$row['variableName']] = array();
+                               if (!isset($sortedAttributes[$row['variableName']][$row['attributeName']])) $sortedAttributes[$row['variableName']][$row['attributeName']] = array();
+                               $sortedAttributes[$row['variableName']][$row['attributeName']][] = $row['cssSelector'];
+                       }
+               }
+               
+               foreach ($sortedAttributes as $variableName => $attributes) {
+                       foreach ($attributes as $attributeName => $cssSelectors) {
+                               $count = 0;
+                               
+                               // write selectors
+                               $css1Selectors = $css2Selectors = array();
+                               foreach ($cssSelectors as $cssSelector) {
+                                       if (empty($cssSelector)) {
+                                               $file->write("/* ".$variableName." */\n");
+                                               $file->write(StyleUtil::compressCSS($variables[$variableName]));
+                                               $file->write("\n");
+                                       }
+                                       else {
+                                               if (preg_match('/^[a-z0-9.#:_\s-*]+$/i', $cssSelector)) {
+                                                       $css1Selectors[] = $cssSelector;
+                                               }
+                                               else {
+                                                       $css2Selectors[] = $cssSelector;
+                                               }
+                                       }
+                               }
+                               
+                               if (count($css1Selectors)) {
+                                       $file->write(implode(',', $css1Selectors));
+                                       
+                                       $file->write("{");
+                                       
+                                       // write attribute
+                                       if (!empty($attributeName)) $file->write($attributeName .":");
+                               
+                                       // write value
+                                       $file->write($variables[$variableName]);
+                                       
+                                       $file->write("}\n");
+                               }
+                               
+                               if (count($css2Selectors)) {
+                                       $file->write(implode(',', $css2Selectors));
+                                       
+                                       $file->write("{");
+                                       
+                                       // write attribute
+                                       if (!empty($attributeName)) $file->write($attributeName .":");
+                               
+                                       // write value
+                                       $file->write($variables[$variableName]);
+                                       
+                                       $file->write("}\n");
+                               }
+                       }
+               }
+               
+               // close file
+               $file->close();
+               @chmod(WCF_DIR . 'style/style-'.$this->styleID.'.css', 0777);
+               $this->writeStyleFileRTL();
+       }
+       
+       /**
+        * Converts the file of this style to a RTL ("right-to-left") version. 
+        */
+       public function writeStyleFileRTL() {
+               // get contents of LTR version
+               $contents = file_get_contents(WCF_DIR . 'style/style-'.$this->styleID.'.css');
+               
+               // convert ltr to rtl
+               $contents = StyleUtil::convertCSSToRTL($contents);
+               
+               // write file
+               $file = new File(WCF_DIR . 'style/style-'.$this->styleID.'-rtl.css');
+               $file->write($contents);
+               $file->close();
+               @chmod(WCF_DIR . 'style/style-'.$this->styleID.'-rtl.css', 0777);
+       }
+       
+       /**
+        * @see wcf\data\IEditableObject::create()
+        */
+       public static function create(array $parameters = array()) {
+               $variables = null;
+               if (isset($parameters['variables'])) {
+                       $variables = $parameters['variables'];
+                       unset($parameters['variables']);
+               }
+               
+               // default values
+               if (!isset($parameters['packageID'])) $parameters['packageID'] = PACKAGE_ID;
+               if (!isset($parameters['styleDate'])) $parameters['styleDate'] = gmdate('Y-m-d', TIME_NOW);
+               
+               // save style
+               $style = parent::create($parameters);           
+               $styleEditor = new StyleEditor($style);
+               
+               // save variables
+               if ($variables !== null) {
+                       $styleEditor->setVariables($variables);
+               }
+               
+               // scale preview image
+               if (!empty($parameters['image'])) {
+                       self::scalePreviewImage(WCF_DIR.$parameters['image']);
+               }
+               
+               return $style;
+       }
+       
+       /**
+        * @see IEditableCachedObject::resetCache()
+        */
+       public static function resetCache() {
+               WCF::getCache()->clear(WCF_DIR.'cache', 'cache.icon-*-'.$this->styleID.'.php');
+       }
+       
+       /**
+        * Scales the style preview image.
+        * 
+        * @param       string          $filename
+        * @return      boolean
+        */
+       public static function scalePreviewImage($filename) {
+               $thumbnail = new Thumbnail($filename, self::STYLE_PREVIEW_IMAGE_MAX_WIDTH, self::STYLE_PREVIEW_IMAGE_MAX_HEIGHT);
+               if (($source = $thumbnail->makeThumbnail())) {
+                       $file = new File($filename);
+                       $file->write($source);
+                       $file->close();
+                       
+                       return true;
+               }
+               
+               return false;
+       }
+       
+       private static $variables = array();
+       private static function parseAdditionalStyles(&$variables) {
+               self::$variables = $variables;
+               // fix images location
+               if (!empty(self::$variables['global.images.location']) && !FileUtil::isURL(self::$variables['global.images.location']) && substr(self::$variables['global.images.location'], 0, 1) != '/') {
+                       self::$variables['global.images.location'] = '../'.self::$variables['global.images.location'];
+               }
+               // fix images location
+               if (!empty(self::$variables['global.icons.location']) && !FileUtil::isURL(self::$variables['global.icons.location']) && substr(self::$variables['global.icons.location'], 0, 1) != '/') {
+                       self::$variables['global.icons.location'] = '../'.self::$variables['global.icons.location'];
+               }
+               
+               // parse additional styles
+               if (!empty($variables['user.additional.style.input1.use'])) {
+                       $variables['user.additional.style.input1.use'] = preg_replace_callback('/\$([a-z0-9_\-\.]+)\$/', array('self', 'parseAdditionalStylesCallback'), $variables['user.additional.style.input1.use']);
+               }
+               if (!empty($variables['user.additional.style.input2.use'])) {
+                       $variables['user.additional.style.input2.use'] = preg_replace_callback('/\$([a-z0-9_\-\.]+)\$/', array('self', 'parseAdditionalStylesCallback'), $variables['user.additional.style.input2.use']);
+               }
+       }
+       
+       private static function parseAdditionalStylesCallback($match) {
+               if (isset(self::$variables[$match[1]])) {
+                       return self::$variables[$match[1]];
+               }
+               else {
+                       return $match[0];
+               }
+       }
 }
index 788fa4d867bb574556038caab497b41b7d68d9b8..e02888313de310445d316ea3cc4d737516da76e1 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\style;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of styles.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.style\r
- * @category   Community Framework\r
- */\r
-class StyleList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\style\Style';\r
+<?php
+namespace wcf\data\style;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of styles.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.style
+ * @category   Community Framework
+ */
+class StyleList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\style\Style';
 }
index 77ec3e4ba49958fd69c97251c8aa1390857b4542..567f1c581a99ea0747501bd25b7d96def4af4aaf 100644 (file)
@@ -1,37 +1,37 @@
-<?php\r
-namespace wcf\data\template;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes template-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.template\r
- * @category   Community Framework\r
- */\r
-class TemplateAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\template\TemplateEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.template.canAddTemplate');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.template.canDeleteTemplate');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.template.canEditTemplate');\r
+<?php
+namespace wcf\data\template;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes template-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.template
+ * @category   Community Framework
+ */
+class TemplateAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\template\TemplateEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.template.canAddTemplate');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.template.canDeleteTemplate');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.template.canEditTemplate');
 }
index 8ab731132fe80d6e773f769b136554d470a2f5b8..f5c2b5c785300e8a6c999371f07961470a969f8d 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\template;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of templates.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.template\r
- * @category   Community Framework\r
- */\r
-class TemplateList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\template\Template';\r
+<?php
+namespace wcf\data\template;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of templates.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.template
+ * @category   Community Framework
+ */
+class TemplateList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\template\Template';
 }
index d4bf2ca95648ce29db76d51d580a90450b282cee..35c13ead12d3796d063f0a1f47127a98d60c763e 100644 (file)
@@ -1,37 +1,37 @@
-<?php\r
-namespace wcf\data\template\group;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes template group-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.template.group\r
- * @category   Community Framework\r
- */\r
-class TemplateGroupAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\template\group\TemplateGroupEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.template.canAddTemplateGroup');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.template.canDeleteTemplateGroup');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.template.canEditTemplateGroup');\r
+<?php
+namespace wcf\data\template\group;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes template group-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.template.group
+ * @category   Community Framework
+ */
+class TemplateGroupAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\template\group\TemplateGroupEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.template.canAddTemplateGroup');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.template.canDeleteTemplateGroup');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.template.canEditTemplateGroup');
 }
index 99575204e5e054256fa6bc6914045d221eafbd85..50c83ff2a76d1a318cf65541571e98c7279aad04 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\template\group;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of template groups.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.template.group\r
- * @category   Community Framework\r
- */\r
-class TemplateGroupList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\template\group\TemplateGroup';\r
+<?php
+namespace wcf\data\template\group;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of template groups.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.template.group
+ * @category   Community Framework
+ */
+class TemplateGroupList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\template\group\TemplateGroup';
 }
index 19576edf283227e0ed3d637fa548e3c0d959414a..c7cc862bf09ecb70bbf7873483741cbff09abfcb 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\template\listener;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes template listener-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.template.listener\r
- * @category   Community Framework\r
- */\r
-class TemplateListenerAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\template\listener\TemplateListenerEditor';\r
+<?php
+namespace wcf\data\template\listener;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes template listener-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.template.listener
+ * @category   Community Framework
+ */
+class TemplateListenerAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\template\listener\TemplateListenerEditor';
 }
index c5b83efda8fd907e0ba61be5303e2f62b9b01ca0..0537d4623ebc07a2ccc4b9cf3eebf2bb51803425 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\template\listener;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of template listener.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.template.listener\r
- * @category   Community Framework\r
- */\r
-class TemplateListenerList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\template\listener\TemplateListener';\r
+<?php
+namespace wcf\data\template\listener;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of template listener.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.template.listener
+ * @category   Community Framework
+ */
+class TemplateListenerList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\template\listener\TemplateListener';
 }
index 47c39aec26c6e5d6f04e87221fc0618466c0eb18..49e96a9f4ca49e864f83b682271850148837efa9 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of users.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user\r
- * @category   Community Framework\r
- */\r
-class UserList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\user\User';\r
+<?php
+namespace wcf\data\user;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of users.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user
+ * @category   Community Framework
+ */
+class UserList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\user\User';
 }
index 2415eef970f9eee993ab36e17aa898fd9145a62d..72734b53644bd5de9fcbff6fac8f22f9cd0c523a 100644 (file)
@@ -1,63 +1,63 @@
-<?php\r
-namespace wcf\data\user\group;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user group-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.group\r
- * @category   Community Framework\r
- */\r
-class UserGroupAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       public $className = 'wcf\data\user\group\UserGroupEditor';\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsCreate\r
-        */\r
-       protected $permissionsCreate = array('admin.user.canAddGroup');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsDelete\r
-        */\r
-       protected $permissionsDelete = array('admin.user.canDeleteGroup');\r
-       \r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
-        */\r
-       protected $permissionsUpdate = array('admin.user.canEditGroup');\r
-       \r
-       /**\r
-        * Creates a new group.\r
-        * \r
-        * @return      UserGroup\r
-        */\r
-       public function create() {\r
-               $group = parent::create();\r
-               \r
-               $groupEditor = new UserGroupEditor($group);\r
-               $groupEditor->updateGroupOptions($this->parameters['options']);\r
-               \r
-               return $group;\r
-       }\r
-       \r
-       /**\r
-        * Updates groups.\r
-        */\r
-       public function update() {\r
-               if (!count($this->objects)) {\r
-                       $this->readObjects();\r
-               }\r
-               \r
-               foreach ($this->objects as $object) {\r
-                       $object->update($this->parameters['data']);\r
-                       $object->updateGroupOptions($this->parameters['options']);\r
-               }\r
-       }\r
+<?php
+namespace wcf\data\user\group;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user group-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.group
+ * @category   Community Framework
+ */
+class UserGroupAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       public $className = 'wcf\data\user\group\UserGroupEditor';
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsCreate
+        */
+       protected $permissionsCreate = array('admin.user.canAddGroup');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsDelete
+        */
+       protected $permissionsDelete = array('admin.user.canDeleteGroup');
+       
+       /**
+        * @see AbstractDatabaseObjectAction::$permissionsUpdate
+        */
+       protected $permissionsUpdate = array('admin.user.canEditGroup');
+       
+       /**
+        * Creates a new group.
+        * 
+        * @return      UserGroup
+        */
+       public function create() {
+               $group = parent::create();
+               
+               $groupEditor = new UserGroupEditor($group);
+               $groupEditor->updateGroupOptions($this->parameters['options']);
+               
+               return $group;
+       }
+       
+       /**
+        * Updates groups.
+        */
+       public function update() {
+               if (!count($this->objects)) {
+                       $this->readObjects();
+               }
+               
+               foreach ($this->objects as $object) {
+                       $object->update($this->parameters['data']);
+                       $object->updateGroupOptions($this->parameters['options']);
+               }
+       }
 }
index 02401379f8b8a3b7403298bfaea0e8d3bbb60b93..e81aaaa1cd67cb23ea2e7b031eae9005900b426f 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user\group;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of user groups.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.group\r
- * @category   Community Framework\r
- */\r
-class UserGroupList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\user\group\UserGroup';\r
+<?php
+namespace wcf\data\user\group;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of user groups.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.group
+ * @category   Community Framework
+ */
+class UserGroupList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\user\group\UserGroup';
 }
index 1617df752e81e8bd359d3055a10c5395c88cfbde..1140fd9ded217ca915add5d55b516d717faafe54 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user\group\option;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user group option-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.group.option\r
- * @category   Community Framework\r
- */\r
-class UserGroupOptionAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\user\group\option\UserGroupOptionEditor';\r
+<?php
+namespace wcf\data\user\group\option;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user group option-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.group.option
+ * @category   Community Framework
+ */
+class UserGroupOptionAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\user\group\option\UserGroupOptionEditor';
 }
index 7a089fef83c7ac74a07ff2ab688d85934fb9567d..98dcdbbae2e6df9b2d272f271cd3f684de641c64 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user\group\option;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of user group options.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.group.option\r
- * @category   Community Framework\r
- */\r
-class UserGroupOptionList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\user\group\option\UserGroupOption';\r
+<?php
+namespace wcf\data\user\group\option;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of user group options.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.group.option
+ * @category   Community Framework
+ */
+class UserGroupOptionList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\user\group\option\UserGroupOption';
 }
index ba7d4cba755f919f7b043cec08f59cdff2a5a936..cf51df0a671e31a4acea54ddf98bcd5010b3917a 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user\group\option\category;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user group option category-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.group.option.category\r
- * @category   Community Framework\r
- */\r
-class UserGroupOptionCategoryAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\user\group\option\category\UserGroupOptionCategoryEditor';\r
+<?php
+namespace wcf\data\user\group\option\category;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user group option category-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.group.option.category
+ * @category   Community Framework
+ */
+class UserGroupOptionCategoryAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\user\group\option\category\UserGroupOptionCategoryEditor';
 }
index c6dd3b200fa1f1cd44021dafc35e65980e0e0b83..b6dd14f2f8d8a5d98057b727cace2901df17283f 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user\group\option\category;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of user group option categories.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.group.option.category\r
- * @category   Community Framework\r
- */\r
-class UserGroupOptionCategoryList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\user\group\option\category\UserGroupOptionCategory';\r
+<?php
+namespace wcf\data\user\group\option\category;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of user group option categories.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.group.option.category
+ * @category   Community Framework
+ */
+class UserGroupOptionCategoryList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\user\group\option\category\UserGroupOptionCategory';
 }
index c6a67d6fa2de4e6c85d07b97a30e3a38d1fd5618..eb4d7815b1ab962c9baaf2eb4dc37e05bde8f2da 100644 (file)
@@ -1,45 +1,45 @@
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\User;\r
-\r
-/**\r
- * Any user option output class should implement this interface.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category   Community Framework\r
- */\r
-interface IUserOptionOutput {\r
-       /**\r
-        * Returns a short version of the html code for the output of the given user option.\r
-        * \r
-        * @param       User            $user\r
-        * @param       array           $optionData\r
-        * @param       string          $value\r
-        * @return      string\r
-        */\r
-       public function getShortOutput(User $user, $optionData, $value);\r
-       \r
-       /**\r
-        * Returns a medium version of the html code for the output of the given user option.\r
-        * \r
-        * @param       User            $user\r
-        * @param       array           $optionData\r
-        * @param       string          $value\r
-        * @return      string\r
-        */\r
-       public function getMediumOutput(User $user, $optionData, $value);\r
-       \r
-       /**\r
-        * Returns the html code for the output of the given user option.\r
-        * \r
-        * @param       User            $user\r
-        * @param       array           $optionData\r
-        * @param       string          $value\r
-        * @return      string\r
-        */\r
-       public function getOutput(User $user, $optionData, $value);\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\User;
+
+/**
+ * Any user option output class should implement this interface.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category   Community Framework
+ */
+interface IUserOptionOutput {
+       /**
+        * Returns a short version of the html code for the output of the given user option.
+        * 
+        * @param       User            $user
+        * @param       array           $optionData
+        * @param       string          $value
+        * @return      string
+        */
+       public function getShortOutput(User $user, $optionData, $value);
+       
+       /**
+        * Returns a medium version of the html code for the output of the given user option.
+        * 
+        * @param       User            $user
+        * @param       array           $optionData
+        * @param       string          $value
+        * @return      string
+        */
+       public function getMediumOutput(User $user, $optionData, $value);
+       
+       /**
+        * Returns the html code for the output of the given user option.
+        * 
+        * @param       User            $user
+        * @param       array           $optionData
+        * @param       string          $value
+        * @return      string
+        */
+       public function getOutput(User $user, $optionData, $value);
 }
index 76e3e795b8f9061bae42f954f66c32994ebd18b7..7f66ee6b4b71b88ef643bd197f58791473e6fc45 100644 (file)
@@ -1,25 +1,25 @@
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\option\Option;\r
-\r
-/**\r
- * Represents a user option.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category   Community Framework\r
- */\r
-class UserOption extends Option {\r
-       /**\r
-        * @see DatabaseObject::$databaseTableName\r
-        */\r
-       protected static $databaseTableName = 'user_option';\r
-       \r
-       /**\r
-        * @see DatabaseObject::$databaseTableIndexName\r
-        */\r
-       protected static $databaseTableIndexName = 'optionID';\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\option\Option;
+
+/**
+ * Represents a user option.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category   Community Framework
+ */
+class UserOption extends Option {
+       /**
+        * @see DatabaseObject::$databaseTableName
+        */
+       protected static $databaseTableName = 'user_option';
+       
+       /**
+        * @see DatabaseObject::$databaseTableIndexName
+        */
+       protected static $databaseTableIndexName = 'optionID';
 }
index 719933e68694418fe3dc2683450c8c65bc2e661e..5ec3e81623188fb6711169e56e8e6697403ed8c4 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user option-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category   Community Framework\r
- */\r
-class UserOptionAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\user\option\UserOptionEditor';\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user option-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category   Community Framework
+ */
+class UserOptionAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\user\option\UserOptionEditor';
 }
index caf9e043776dadb526c32831ebac3b96dff66c3f..2a816e2c66b382d1da2dda32f947f5137884b619 100644 (file)
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\DatabaseObjectEditor;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Provides functions to edit user options.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category   Community Framework\r
- */\r
-class UserOptionEditor extends DatabaseObjectEditor {\r
-       /**\r
-        * @see DatabaseObjectDecorator::$baseClass\r
-        */\r
-       protected static $baseClass = 'wcf\data\user\option\UserOption';\r
-       \r
-       /**\r
-        * @see wcf\data\IEditableObject::create()\r
-        */\r
-       public static function create(array $parameters = array()) {\r
-               $userOption = parent::create($parameters);\r
-               \r
-               // alter the table "wcf".WCF_N."_user_option_value" with this new option\r
-               WCF::getDB()->getEditor()->addColumn('wcf'.WCF_N.'_user_option_value', 'userOption'.$userOption->optionID, self::getColumnDefinition($parameters['optionType']));\r
-               \r
-               // add the default value to this column\r
-               if (isset($parameters['$defaultValue'])) {\r
-                       $sql = "UPDATE  wcf".WCF_N."_user_option_value\r
-                               SET     userOption".$userOption->optionID." = ?";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute(array($parameters['defaultValue']));\r
-               }\r
-               \r
-               return $userOption;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IEditableObject::update()\r
-        */\r
-       public function update(array $parameters = array()) {\r
-               parent::update($parameters);\r
-               \r
-               // alter the table "wcf".WCF_N."_user_option_value" with this new option\r
-               $sql = WCF::getDB()->getEditor()->updateColumn(\r
-                       'wcf'.WCF_N.'_user_option_value',\r
-                       'userOption'.$this->optionID,\r
-                       'userOption'.$this->optionID,\r
-                       self::getColumnDefinition($parameters['optionType'])\r
-               );\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\data\IEditableObject::delete()\r
-        */\r
-       public function delete() {\r
-               $sql = "DELETE FROM     wcf".WCF_N."_user_option\r
-                       WHERE           optionID = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($this->optionID));\r
-               \r
-               $sql = WCF::getDB()->getEditor()->dropColumn('wcf'.WCF_N.'_user_option_value', 'userOption'.$this->optionID);\r
-       }\r
-       \r
-       /**\r
-        * Disables this option.\r
-        */\r
-       public function disable() {\r
-               $this->enable(false);\r
-       }\r
-       \r
-       /**\r
-        * Enables this option.\r
-        * \r
-        * @param       boolean         $enable\r
-        */\r
-       public function enable($enable = true) {\r
-               $value = intval(!$enable);\r
-               \r
-               $sql = "UPDATE  wcf".WCF_N."_user_option\r
-                       SET     disabled = ?\r
-                       WHERE   optionID = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($value, $this->optionID));\r
-       }\r
-       \r
-       /**\r
-        * Determines the needed sql statement to modify column definitions.\r
-        * \r
-        * @param       string          $optionType\r
-        * @return      array           column definition\r
-        */\r
-       public static function getColumnDefinition($optionType) {\r
-               $column = array(\r
-                       'autoIncrement' => false,\r
-                       'key' => false,\r
-                       'notNull' => false,\r
-                       'type' => 'text'\r
-               );\r
-               \r
-               switch ($optionType) {\r
-                       case 'boolean':\r
-                               $column['notNull'] = true;\r
-                               $column['default'] = 0;\r
-                               $column['length'] = 1;\r
-                               $column['type'] = 'tinyint';\r
-                       break;\r
-                       \r
-                       case 'integer':\r
-                               $column['notNull'] = true;\r
-                               $column['default'] = 0;\r
-                               $column['length'] = 10;\r
-                               $column['type'] = 'int';\r
-                       break;\r
-                       \r
-                       case 'float':\r
-                               $column['notNull'] = true;\r
-                               $column['default'] = 0.0;\r
-                               $column['type'] = 'float';\r
-                       break;\r
-                       \r
-                       case 'textarea':\r
-                               $column['type'] = 'mediumtext';\r
-                       break;\r
-                       \r
-                       case 'birthday':\r
-                       case 'date':\r
-                               $column['notNull'] = true;\r
-                               $column['default'] = '0000-00-00';\r
-                               $column['length'] = 10;\r
-                               $column['type'] = 'char';\r
-                       break;\r
-               }\r
-               \r
-               return $column;\r
-       }\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\DatabaseObjectEditor;
+use wcf\system\WCF;
+
+/**
+ * Provides functions to edit user options.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category   Community Framework
+ */
+class UserOptionEditor extends DatabaseObjectEditor {
+       /**
+        * @see DatabaseObjectDecorator::$baseClass
+        */
+       protected static $baseClass = 'wcf\data\user\option\UserOption';
+       
+       /**
+        * @see wcf\data\IEditableObject::create()
+        */
+       public static function create(array $parameters = array()) {
+               $userOption = parent::create($parameters);
+               
+               // alter the table "wcf".WCF_N."_user_option_value" with this new option
+               WCF::getDB()->getEditor()->addColumn('wcf'.WCF_N.'_user_option_value', 'userOption'.$userOption->optionID, self::getColumnDefinition($parameters['optionType']));
+               
+               // add the default value to this column
+               if (isset($parameters['$defaultValue'])) {
+                       $sql = "UPDATE  wcf".WCF_N."_user_option_value
+                               SET     userOption".$userOption->optionID." = ?";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute(array($parameters['defaultValue']));
+               }
+               
+               return $userOption;
+       }
+       
+       /**
+        * @see wcf\data\IEditableObject::update()
+        */
+       public function update(array $parameters = array()) {
+               parent::update($parameters);
+               
+               // alter the table "wcf".WCF_N."_user_option_value" with this new option
+               $sql = WCF::getDB()->getEditor()->updateColumn(
+                       'wcf'.WCF_N.'_user_option_value',
+                       'userOption'.$this->optionID,
+                       'userOption'.$this->optionID,
+                       self::getColumnDefinition($parameters['optionType'])
+               );
+       }
+       
+       /**
+        * @see wcf\data\IEditableObject::delete()
+        */
+       public function delete() {
+               $sql = "DELETE FROM     wcf".WCF_N."_user_option
+                       WHERE           optionID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($this->optionID));
+               
+               $sql = WCF::getDB()->getEditor()->dropColumn('wcf'.WCF_N.'_user_option_value', 'userOption'.$this->optionID);
+       }
+       
+       /**
+        * Disables this option.
+        */
+       public function disable() {
+               $this->enable(false);
+       }
+       
+       /**
+        * Enables this option.
+        * 
+        * @param       boolean         $enable
+        */
+       public function enable($enable = true) {
+               $value = intval(!$enable);
+               
+               $sql = "UPDATE  wcf".WCF_N."_user_option
+                       SET     disabled = ?
+                       WHERE   optionID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($value, $this->optionID));
+       }
+       
+       /**
+        * Determines the needed sql statement to modify column definitions.
+        * 
+        * @param       string          $optionType
+        * @return      array           column definition
+        */
+       public static function getColumnDefinition($optionType) {
+               $column = array(
+                       'autoIncrement' => false,
+                       'key' => false,
+                       'notNull' => false,
+                       'type' => 'text'
+               );
+               
+               switch ($optionType) {
+                       case 'boolean':
+                               $column['notNull'] = true;
+                               $column['default'] = 0;
+                               $column['length'] = 1;
+                               $column['type'] = 'tinyint';
+                       break;
+                       
+                       case 'integer':
+                               $column['notNull'] = true;
+                               $column['default'] = 0;
+                               $column['length'] = 10;
+                               $column['type'] = 'int';
+                       break;
+                       
+                       case 'float':
+                               $column['notNull'] = true;
+                               $column['default'] = 0.0;
+                               $column['type'] = 'float';
+                       break;
+                       
+                       case 'textarea':
+                               $column['type'] = 'mediumtext';
+                       break;
+                       
+                       case 'birthday':
+                       case 'date':
+                               $column['notNull'] = true;
+                               $column['default'] = '0000-00-00';
+                               $column['length'] = 10;
+                               $column['type'] = 'char';
+                       break;
+               }
+               
+               return $column;
+       }
 }
\ No newline at end of file
index 68119f1acb7f523ec5c9b4d3dc5606d199b0e37d..21788352b2948b0ce7690e379fe22544abae08fa 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of user options.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category   Community Framework\r
- */\r
-class UserOptionList extends DatabaseObjectList {\r
-       /**\r
-        * @see DatabaseObjectList::$className\r
-        */\r
-       public $className = 'wcf\data\user\option\UserOption';\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of user options.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category   Community Framework
+ */
+class UserOptionList extends DatabaseObjectList {
+       /**
+        * @see DatabaseObjectList::$className
+        */
+       public $className = 'wcf\data\user\option\UserOption';
 }
index 0c7779d7bfb982ca763385467941fd843f0dc010..693e4b06b98277bf94eed52aca4252a5f77b6276 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\data\user\option\category;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user option category-related actions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.option.category\r
- * @category   Community Framework\r
- */\r
-class UserOptionCategoryAction extends AbstractDatabaseObjectAction {\r
-       /**\r
-        * @see AbstractDatabaseObjectAction::$className\r
-        */\r
-       protected $className = 'wcf\data\user\option\category\UserOptionCategoryEditor';\r
+<?php
+namespace wcf\data\user\option\category;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user option category-related actions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.option.category
+ * @category   Community Framework
+ */
+class UserOptionCategoryAction extends AbstractDatabaseObjectAction {
+       /**
+        * @see AbstractDatabaseObjectAction::$className
+        */
+       protected $className = 'wcf\data\user\option\category\UserOptionCategoryEditor';
 }
index 540eb7b25a3570921c32a52f1e2e94a7af1b2a51..f2cf89644482a18874c0348e3ce9d59d9d86b5c0 100644 (file)
@@ -1,30 +1,30 @@
-<?php\r
-namespace wcf\data\user\option\category;\r
-use wcf\data\DatabaseObjectEditor;\r
-\r
-/**\r
- * Provides functions to add, edit and delete user option categories.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.user.option.category\r
- * @category   Community Framework\r
- */\r
-class UserOptionCategoryEditor extends DatabaseObjectEditor {\r
-       /**\r
-        * @see UserOptionCategory::$baseClass\r
-        */\r
-       protected static $baseClass = 'wcf\data\user\option\category\UserOptionCategory';\r
-       \r
-       /**\r
-        * @see wcf\data\IEditableObject::create()\r
-        */\r
-       public static function create(array $parameters = array()) {\r
-               // obtain default values\r
-               if (!isset($parameters['packageID'])) $parameters['packageID'] = PACKAGE_ID;\r
-               \r
-               return parent::create($parameters);\r
-       }\r
+<?php
+namespace wcf\data\user\option\category;
+use wcf\data\DatabaseObjectEditor;
+
+/**
+ * Provides functions to add, edit and delete user option categories.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.user.option.category
+ * @category   Community Framework
+ */
+class UserOptionCategoryEditor extends DatabaseObjectEditor {
+       /**
+        * @see UserOptionCategory::$baseClass
+        */
+       protected static $baseClass = 'wcf\data\user\option\category\UserOptionCategory';
+       
+       /**
+        * @see wcf\data\IEditableObject::create()
+        */
+       public static function create(array $parameters = array()) {
+               // obtain default values
+               if (!isset($parameters['packageID'])) $parameters['packageID'] = PACKAGE_ID;
+               
+               return parent::create($parameters);
+       }
 }
index b2329565ec80ccbe23edcaf73dd045413abdd2ed..b19feac7d147294a9bca8a8539eca5f07d367aae 100644 (file)
-<?php\r
-namespace wcf\form;\r
-use wcf\page\AbstractPage;\r
-use wcf\system\WCF;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\exception\UserInputException;\r
-\r
-/**\r
- * This class provides default implementations for the Form interface.\r
- * This includes the default event listener for a form: readFormParameters, validate, save.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage form\r
- * @category   Community Framework\r
- */\r
-abstract class AbstractForm extends AbstractPage implements IForm {\r
-       /**\r
-        * Name of error field.\r
-        *\r
-        * @var string\r
-        */\r
-       public $errorField = '';\r
-       \r
-       /**\r
-        * Name of error type.\r
-        *\r
-        * @var string\r
-        */\r
-       public $errorType = '';\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::submit()\r
-        */\r
-       public function submit() {\r
-               // call submit event\r
-               EventHandler::getInstance()->fireAction($this, 'submit');\r
-               \r
-               $this->readFormParameters();\r
-               \r
-               try {\r
-                       $this->validate();\r
-                       // no errors\r
-                       $this->save();\r
-               }\r
-               catch (UserInputException $e) {\r
-                       $this->errorField = $e->getField();\r
-                       $this->errorType = $e->getType();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::readFormParameters()\r
-        */\r
-       public function readFormParameters() {\r
-               // call readFormParameters event\r
-               EventHandler::getInstance()->fireAction($this, 'readFormParameters');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::validate()\r
-        */\r
-       public function validate() {\r
-               // call validate event\r
-               EventHandler::getInstance()->fireAction($this, 'validate');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\form\IForm::save()\r
-        */\r
-       public function save() {\r
-               // call save event\r
-               EventHandler::getInstance()->fireAction($this, 'save');\r
-       }\r
-       \r
-       /**\r
-        * Calls the 'saved' event after the successful call of the save method.\r
-        * This functions won't called automatically. You must do this manually, if you inherit AbstractForm.\r
-        */\r
-       protected function saved() {\r
-               EventHandler::getInstance()->fireAction($this, 'saved');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               if (count($_POST) || count($_FILES)) {\r
-                       $this->submit();\r
-               }\r
-               \r
-               parent::readData();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               // assign default variables\r
-               WCF::getTPL()->assign(array(\r
-                       'errorField' => $this->errorField,\r
-                       'errorType' => $this->errorType\r
-               ));\r
-       }\r
+<?php
+namespace wcf\form;
+use wcf\page\AbstractPage;
+use wcf\system\WCF;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\UserInputException;
+
+/**
+ * This class provides default implementations for the Form interface.
+ * This includes the default event listener for a form: readFormParameters, validate, save.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage form
+ * @category   Community Framework
+ */
+abstract class AbstractForm extends AbstractPage implements IForm {
+       /**
+        * Name of error field.
+        *
+        * @var string
+        */
+       public $errorField = '';
+       
+       /**
+        * Name of error type.
+        *
+        * @var string
+        */
+       public $errorType = '';
+       
+       /**
+        * @see wcf\form\IForm::submit()
+        */
+       public function submit() {
+               // call submit event
+               EventHandler::getInstance()->fireAction($this, 'submit');
+               
+               $this->readFormParameters();
+               
+               try {
+                       $this->validate();
+                       // no errors
+                       $this->save();
+               }
+               catch (UserInputException $e) {
+                       $this->errorField = $e->getField();
+                       $this->errorType = $e->getType();
+               }
+       }
+       
+       /**
+        * @see wcf\form\IForm::readFormParameters()
+        */
+       public function readFormParameters() {
+               // call readFormParameters event
+               EventHandler::getInstance()->fireAction($this, 'readFormParameters');
+       }
+       
+       /**
+        * @see wcf\form\IForm::validate()
+        */
+       public function validate() {
+               // call validate event
+               EventHandler::getInstance()->fireAction($this, 'validate');
+       }
+       
+       /**
+        * @see wcf\form\IForm::save()
+        */
+       public function save() {
+               // call save event
+               EventHandler::getInstance()->fireAction($this, 'save');
+       }
+       
+       /**
+        * Calls the 'saved' event after the successful call of the save method.
+        * This functions won't called automatically. You must do this manually, if you inherit AbstractForm.
+        */
+       protected function saved() {
+               EventHandler::getInstance()->fireAction($this, 'saved');
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               if (count($_POST) || count($_FILES)) {
+                       $this->submit();
+               }
+               
+               parent::readData();
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               // assign default variables
+               WCF::getTPL()->assign(array(
+                       'errorField' => $this->errorField,
+                       'errorType' => $this->errorType
+               ));
+       }
 }
index ad2a4489455bc40bdfb490a308e1e9c8a08f5e27..444303fae45e8dd5ad58190c3b43399e9d404453 100644 (file)
@@ -1,35 +1,35 @@
-<?php\r
-namespace wcf\form;\r
-use wcf\page\IPage;\r
-\r
-/**\r
- * All form classes should implement this interface. \r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage form\r
- * @category   Community Framework\r
- */\r
-interface IForm extends IPage {\r
-       /**\r
-        * Is called when the form was submitted.\r
-        */\r
-       public function submit();\r
-       \r
-       /**\r
-        * Validates form inputs.\r
-        */\r
-       public function validate();\r
-       \r
-       /**\r
-        * Saves the data of the form.\r
-        */\r
-       public function save();\r
-       \r
-       /**\r
-        * Reads the given form parameters.\r
-        */\r
-       public function readFormParameters();\r
+<?php
+namespace wcf\form;
+use wcf\page\IPage;
+
+/**
+ * All form classes should implement this interface. 
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage form
+ * @category   Community Framework
+ */
+interface IForm extends IPage {
+       /**
+        * Is called when the form was submitted.
+        */
+       public function submit();
+       
+       /**
+        * Validates form inputs.
+        */
+       public function validate();
+       
+       /**
+        * Saves the data of the form.
+        */
+       public function save();
+       
+       /**
+        * Reads the given form parameters.
+        */
+       public function readFormParameters();
 }
index 4f5e383827e6810133b17f4be637bf0ce7d309f3..93de49b6bda1b50bb9d5156f3a24e8d932ece47c 100644 (file)
-<?php\r
-namespace wcf\page;\r
-use wcf\system\WCF;\r
-use wcf\system\event\EventHandler;\r
-\r
-/**\r
- * This class provides default implementations for the Page interface.\r
- * This includes the call of the default event listeners for a page: readParameters, readData, assignVariables and show.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage page\r
- * @category   Community Framework\r
- */\r
-abstract class AbstractPage implements IPage {\r
-       /**\r
-        * Name of the template for the called page.\r
-        * \r
-        * @var string\r
-        */\r
-       public $templateName = '';\r
-       \r
-       /**\r
-        * Value of the given action parameter.\r
-        * \r
-        * @var string\r
-        */\r
-       public $action = '';\r
-       \r
-       /**\r
-        * Needed modules to view this page.\r
-        * \r
-        * @var array<string>\r
-        */\r
-       public $neededModules = array();\r
-       \r
-       /**\r
-        * Needed permissions to view this page.\r
-        * \r
-        * @var array<string>\r
-        */\r
-       public $neededPermissions = array();\r
-       \r
-       /**\r
-        * Creates a new AbstractPage object.\r
-        * Calls the readParameters() and show() methods automatically.\r
-        */\r
-       public function __construct() {\r
-               // call default methods\r
-               $this->readParameters();\r
-               $this->show();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               // call readParameters event\r
-               EventHandler::getInstance()->fireAction($this, 'readParameters');\r
-               \r
-               // read action parameter\r
-               if (isset($_REQUEST['action'])) $this->action = $_REQUEST['action'];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               // call readData event\r
-               EventHandler::getInstance()->fireAction($this, 'readData');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               // call assignVariables event\r
-               EventHandler::getInstance()->fireAction($this, 'assignVariables');\r
-               \r
-               // assign parameters\r
-               WCF::getTPL()->assign(array(\r
-                       'action' => $this->action,\r
-                       'templateName' => $this->templateName\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::checkModules()\r
-        */\r
-       public function checkModules() {\r
-               // call checkModules event\r
-               EventHandler::getInstance()->fireAction($this, 'checkModules');\r
-               \r
-               // check modules\r
-               if (count($this->neededModules)) {\r
-                       foreach ($this->neededModules as $module) {\r
-                               if (!defined($module) || !constant($module)) {\r
-                                       throw new wcf\system\exception\IllegalLinkException();\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::checkPermissions()\r
-        */\r
-       public function checkPermissions() {\r
-               // call checkPermissions event\r
-               EventHandler::getInstance()->fireAction($this, 'checkPermissions');\r
-               \r
-               // check permission\r
-               if (count($this->neededPermissions)) {\r
-                       WCF::getSession()->checkPermission($this->neededPermissions);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::show()\r
-        */\r
-       public function show() {\r
-               // check modules\r
-               $this->checkModules();\r
-               \r
-               // check permission\r
-               $this->checkPermissions();\r
-               \r
-               // read data\r
-               $this->readData();\r
-\r
-               // assign variables\r
-               $this->assignVariables();               \r
-               \r
-               // call show event\r
-               EventHandler::getInstance()->fireAction($this, 'show');\r
-               \r
-               // show template\r
-               if (!empty($this->templateName)) {\r
-                       WCF::getTPL()->display($this->templateName);\r
-               }\r
-       }\r
+<?php
+namespace wcf\page;
+use wcf\system\WCF;
+use wcf\system\event\EventHandler;
+
+/**
+ * This class provides default implementations for the Page interface.
+ * This includes the call of the default event listeners for a page: readParameters, readData, assignVariables and show.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage page
+ * @category   Community Framework
+ */
+abstract class AbstractPage implements IPage {
+       /**
+        * Name of the template for the called page.
+        * 
+        * @var string
+        */
+       public $templateName = '';
+       
+       /**
+        * Value of the given action parameter.
+        * 
+        * @var string
+        */
+       public $action = '';
+       
+       /**
+        * Needed modules to view this page.
+        * 
+        * @var array<string>
+        */
+       public $neededModules = array();
+       
+       /**
+        * Needed permissions to view this page.
+        * 
+        * @var array<string>
+        */
+       public $neededPermissions = array();
+       
+       /**
+        * Creates a new AbstractPage object.
+        * Calls the readParameters() and show() methods automatically.
+        */
+       public function __construct() {
+               // call default methods
+               $this->readParameters();
+               $this->show();
+       }
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               // call readParameters event
+               EventHandler::getInstance()->fireAction($this, 'readParameters');
+               
+               // read action parameter
+               if (isset($_REQUEST['action'])) $this->action = $_REQUEST['action'];
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               // call readData event
+               EventHandler::getInstance()->fireAction($this, 'readData');
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               // call assignVariables event
+               EventHandler::getInstance()->fireAction($this, 'assignVariables');
+               
+               // assign parameters
+               WCF::getTPL()->assign(array(
+                       'action' => $this->action,
+                       'templateName' => $this->templateName
+               ));
+       }
+       
+       /**
+        * @see wcf\page\IPage::checkModules()
+        */
+       public function checkModules() {
+               // call checkModules event
+               EventHandler::getInstance()->fireAction($this, 'checkModules');
+               
+               // check modules
+               if (count($this->neededModules)) {
+                       foreach ($this->neededModules as $module) {
+                               if (!defined($module) || !constant($module)) {
+                                       throw new wcf\system\exception\IllegalLinkException();
+                               }
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::checkPermissions()
+        */
+       public function checkPermissions() {
+               // call checkPermissions event
+               EventHandler::getInstance()->fireAction($this, 'checkPermissions');
+               
+               // check permission
+               if (count($this->neededPermissions)) {
+                       WCF::getSession()->checkPermission($this->neededPermissions);
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::show()
+        */
+       public function show() {
+               // check modules
+               $this->checkModules();
+               
+               // check permission
+               $this->checkPermissions();
+               
+               // read data
+               $this->readData();
+
+               // assign variables
+               $this->assignVariables();               
+               
+               // call show event
+               EventHandler::getInstance()->fireAction($this, 'show');
+               
+               // show template
+               if (!empty($this->templateName)) {
+                       WCF::getTPL()->display($this->templateName);
+               }
+       }
 }
index 8350670920a7d5ee8f0b0b0884587e37a78cb357..752f8d46e5ee4f117467481f4aca3f7c98c19642 100644 (file)
@@ -1,44 +1,44 @@
-<?php\r
-namespace wcf\page;\r
-\r
-/**\r
- * All page classes should implement this interface. \r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage page\r
- * @category   Community Framework\r
- */\r
-interface IPage {\r
-       /**\r
-        * Reads the given parameters.\r
-        */\r
-       public function readParameters();\r
-       \r
-       /**\r
-        * Checks the modules of this page.\r
-        */\r
-       public function checkModules();\r
-       \r
-       /**\r
-        * Checks the permissions of this page.\r
-        */\r
-       public function checkPermissions();\r
-       \r
-       /**\r
-        * Reads/Gets the data to be displayed on this page.\r
-        */\r
-       public function readData();\r
-       \r
-       /**\r
-        * Assigns variables to the template engine.\r
-        */\r
-       public function assignVariables();\r
-       \r
-       /**\r
-        * Shows the requested page.\r
-        */\r
-       public function show();\r
+<?php
+namespace wcf\page;
+
+/**
+ * All page classes should implement this interface. 
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage page
+ * @category   Community Framework
+ */
+interface IPage {
+       /**
+        * Reads the given parameters.
+        */
+       public function readParameters();
+       
+       /**
+        * Checks the modules of this page.
+        */
+       public function checkModules();
+       
+       /**
+        * Checks the permissions of this page.
+        */
+       public function checkPermissions();
+       
+       /**
+        * Reads/Gets the data to be displayed on this page.
+        */
+       public function readData();
+       
+       /**
+        * Assigns variables to the template engine.
+        */
+       public function assignVariables();
+       
+       /**
+        * Shows the requested page.
+        */
+       public function show();
 }
index 03116730f226218aa4360d0690c938993d09cbcc..563c8548021b1f025991aac8f6a98e82c3dee170 100644 (file)
-<?php\r
-namespace wcf\page;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\WCF;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * Provides default implementations for a multiple link page.\r
- * Handles the page number parameter automatically.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage page\r
- * @category   Community Framework\r
- */\r
-abstract class MultipleLinkPage extends AbstractPage {\r
-       /**\r
-        * The current page number.\r
-        * \r
-        * @var integer\r
-        */\r
-       public $pageNo = 0;\r
-       \r
-       /**\r
-        * The number of all pages.\r
-        * \r
-        * @var integer\r
-        */\r
-       public $pages = 0;\r
-       \r
-       /**\r
-        * The number of items shown per page.\r
-        * \r
-        * @var integer\r
-        */\r
-       public $itemsPerPage = 20;\r
-       \r
-       /**\r
-        * The number of all items.\r
-        * \r
-        * @var integer\r
-        */\r
-       public $items = 0;\r
-       \r
-       /**\r
-        * Indicates the range of the listed items.\r
-        * \r
-        * @var integer\r
-        */\r
-       public $startIndex = 0;\r
-       \r
-       /**\r
-        * Indicates the range of the listed items.\r
-        * \r
-        * @var integer\r
-        */\r
-       public $endIndex = 0;\r
-       \r
-       /**\r
-        * DatabaseObjectList object\r
-        * \r
-        * @var wcf\data\DatabaseObjectList\r
-        */     \r
-       public $objectList = null;\r
-       \r
-       /**\r
-        * class name for DatabaseObjectList\r
-        * \r
-        * @var string\r
-        */     \r
-       public $objectListClassName = '';\r
-       \r
-       /**\r
-        * list of DatabaseObject objects\r
-        * \r
-        * @var array<wcf\data\DatabaseObject>\r
-        */     \r
-       public $objects = array();\r
-       \r
-       /**\r
-        * @see wcf\data\DatabaseObjectList::$sqlLimit\r
-        */     \r
-       public $sqlLimit = 0;\r
-       \r
-       /**\r
-        * @see wcf\data\DatabaseObjectList::$sqlOffset\r
-        */\r
-       public $sqlOffset = '';\r
-       \r
-       /**\r
-        * @see wcf\data\DatabaseObjectList::$sqlOrderBy\r
-        */     \r
-       public $sqlOrderBy = '';\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               // read page number parameter\r
-               if (isset($_REQUEST['pageNo'])) $this->pageNo = intval($_REQUEST['pageNo']);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               parent::readData();\r
-               \r
-               // initialize database object list\r
-               $this->initObjectList();\r
-               \r
-               // calculates page number\r
-               $this->calculateNumberOfPages();\r
-               \r
-               // read objects\r
-               if ($this->items) {\r
-                       $this->sqlLimit = $this->itemsPerPage;\r
-                       $this->sqlOffset = ($this->pageNo - 1) * $this->itemsPerPage;\r
-                       $this->sqlOrderBy = $this->sortField." ".$this->sortOrder;\r
-                       $this->readObjects();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Initializes DatabaseObjectList instance.\r
-        */     \r
-       protected function initObjectList() {\r
-               if (empty($this->objectListClassName)) {\r
-                       throw new SystemException('DatabaseObjectList class name not specified.');\r
-               }\r
-               \r
-               if (!ClassUtil::isInstanceOf($this->objectListClassName, 'wcf\data\DatabaseObjectList')) {\r
-                       throw new SystemException("Class '".$this->objectListClassName."' does not extend 'wcf\data\DatabaseObjectList'");\r
-               }\r
-               \r
-               $this->objectList = new $this->objectListClassName();\r
-       }\r
-       \r
-       /**\r
-        * Reads object list.\r
-        */     \r
-       protected function readObjects() {\r
-               $this->objectList->sqlLimit = $this->sqlLimit;\r
-               $this->objectList->sqlOffset = $this->sqlOffset;\r
-               $this->objectList->sqlOrderBy = $this->sqlOrderBy;\r
-               $this->objectList->readObjects();\r
-               \r
-               $this->objects = $this->objectList->getObjects();\r
-       }\r
-       \r
-       /**\r
-        * Calculates the number of pages and\r
-        * handles the given page number parameter.\r
-        */\r
-       public function calculateNumberOfPages() {\r
-               // call calculateNumberOfPages event\r
-               EventHandler::getInstance()->fireAction($this, 'calculateNumberOfPages');\r
-               \r
-               // calculate number of pages\r
-               $this->items = $this->countItems();\r
-               $this->pages = intval(ceil($this->items / $this->itemsPerPage));\r
-               \r
-               // correct active page number\r
-               if ($this->pageNo > $this->pages) $this->pageNo = $this->pages;\r
-               if ($this->pageNo < 1) $this->pageNo = 1;\r
-               \r
-               // calculate start and end index\r
-               $this->startIndex = ($this->pageNo - 1) * $this->itemsPerPage;\r
-               $this->endIndex = $this->startIndex + $this->itemsPerPage;\r
-               $this->startIndex++;\r
-               if ($this->endIndex > $this->items) $this->endIndex = $this->items;\r
-       }\r
-       \r
-       /**\r
-        * Counts the displayed items.\r
-        * \r
-        * @return      integer\r
-        */\r
-       public function countItems() {\r
-               // call countItems event\r
-               EventHandler::getInstance()->fireAction($this, 'countItems');\r
-               \r
-               return $this->objectList->countObjects();\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               // assign page parameters\r
-               WCF::getTPL()->assign(array(\r
-                       'pageNo' => $this->pageNo,\r
-                       'pages' => $this->pages,\r
-                       'items' => $this->items,\r
-                       'itemsPerPage' => $this->itemsPerPage,\r
-                       'startIndex' => $this->startIndex,\r
-                       'endIndex' => $this->endIndex,\r
-                       'objects' => $this->objects\r
-               ));\r
-       }\r
+<?php
+namespace wcf\page;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\SystemException;
+use wcf\system\WCF;
+use wcf\util\ClassUtil;
+
+/**
+ * Provides default implementations for a multiple link page.
+ * Handles the page number parameter automatically.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage page
+ * @category   Community Framework
+ */
+abstract class MultipleLinkPage extends AbstractPage {
+       /**
+        * The current page number.
+        * 
+        * @var integer
+        */
+       public $pageNo = 0;
+       
+       /**
+        * The number of all pages.
+        * 
+        * @var integer
+        */
+       public $pages = 0;
+       
+       /**
+        * The number of items shown per page.
+        * 
+        * @var integer
+        */
+       public $itemsPerPage = 20;
+       
+       /**
+        * The number of all items.
+        * 
+        * @var integer
+        */
+       public $items = 0;
+       
+       /**
+        * Indicates the range of the listed items.
+        * 
+        * @var integer
+        */
+       public $startIndex = 0;
+       
+       /**
+        * Indicates the range of the listed items.
+        * 
+        * @var integer
+        */
+       public $endIndex = 0;
+       
+       /**
+        * DatabaseObjectList object
+        * 
+        * @var wcf\data\DatabaseObjectList
+        */     
+       public $objectList = null;
+       
+       /**
+        * class name for DatabaseObjectList
+        * 
+        * @var string
+        */     
+       public $objectListClassName = '';
+       
+       /**
+        * list of DatabaseObject objects
+        * 
+        * @var array<wcf\data\DatabaseObject>
+        */     
+       public $objects = array();
+       
+       /**
+        * @see wcf\data\DatabaseObjectList::$sqlLimit
+        */     
+       public $sqlLimit = 0;
+       
+       /**
+        * @see wcf\data\DatabaseObjectList::$sqlOffset
+        */
+       public $sqlOffset = '';
+       
+       /**
+        * @see wcf\data\DatabaseObjectList::$sqlOrderBy
+        */     
+       public $sqlOrderBy = '';
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               // read page number parameter
+               if (isset($_REQUEST['pageNo'])) $this->pageNo = intval($_REQUEST['pageNo']);
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               parent::readData();
+               
+               // initialize database object list
+               $this->initObjectList();
+               
+               // calculates page number
+               $this->calculateNumberOfPages();
+               
+               // read objects
+               if ($this->items) {
+                       $this->sqlLimit = $this->itemsPerPage;
+                       $this->sqlOffset = ($this->pageNo - 1) * $this->itemsPerPage;
+                       $this->sqlOrderBy = $this->sortField." ".$this->sortOrder;
+                       $this->readObjects();
+               }
+       }
+       
+       /**
+        * Initializes DatabaseObjectList instance.
+        */     
+       protected function initObjectList() {
+               if (empty($this->objectListClassName)) {
+                       throw new SystemException('DatabaseObjectList class name not specified.');
+               }
+               
+               if (!ClassUtil::isInstanceOf($this->objectListClassName, 'wcf\data\DatabaseObjectList')) {
+                       throw new SystemException("Class '".$this->objectListClassName."' does not extend 'wcf\data\DatabaseObjectList'");
+               }
+               
+               $this->objectList = new $this->objectListClassName();
+       }
+       
+       /**
+        * Reads object list.
+        */     
+       protected function readObjects() {
+               $this->objectList->sqlLimit = $this->sqlLimit;
+               $this->objectList->sqlOffset = $this->sqlOffset;
+               $this->objectList->sqlOrderBy = $this->sqlOrderBy;
+               $this->objectList->readObjects();
+               
+               $this->objects = $this->objectList->getObjects();
+       }
+       
+       /**
+        * Calculates the number of pages and
+        * handles the given page number parameter.
+        */
+       public function calculateNumberOfPages() {
+               // call calculateNumberOfPages event
+               EventHandler::getInstance()->fireAction($this, 'calculateNumberOfPages');
+               
+               // calculate number of pages
+               $this->items = $this->countItems();
+               $this->pages = intval(ceil($this->items / $this->itemsPerPage));
+               
+               // correct active page number
+               if ($this->pageNo > $this->pages) $this->pageNo = $this->pages;
+               if ($this->pageNo < 1) $this->pageNo = 1;
+               
+               // calculate start and end index
+               $this->startIndex = ($this->pageNo - 1) * $this->itemsPerPage;
+               $this->endIndex = $this->startIndex + $this->itemsPerPage;
+               $this->startIndex++;
+               if ($this->endIndex > $this->items) $this->endIndex = $this->items;
+       }
+       
+       /**
+        * Counts the displayed items.
+        * 
+        * @return      integer
+        */
+       public function countItems() {
+               // call countItems event
+               EventHandler::getInstance()->fireAction($this, 'countItems');
+               
+               return $this->objectList->countObjects();
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               // assign page parameters
+               WCF::getTPL()->assign(array(
+                       'pageNo' => $this->pageNo,
+                       'pages' => $this->pages,
+                       'items' => $this->items,
+                       'itemsPerPage' => $this->itemsPerPage,
+                       'startIndex' => $this->startIndex,
+                       'endIndex' => $this->endIndex,
+                       'objects' => $this->objects
+               ));
+       }
 }
index 9baed8f81bea2a7897a2f2cd2be57687b4449311..76a0014dab4bf85b50ac011f7be500a9161e20bf 100644 (file)
-<?php\r
-namespace wcf\page;\r
-use wcf\system\WCF;\r
-use wcf\system\event\EventHandler;\r
-\r
-/**\r
- * Provides default implementations for a sortable page of listed items.\r
- * Handles the sorting parameters automatically.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage page\r
- * @category   Community Framework\r
- */\r
-abstract class SortablePage extends MultipleLinkPage {\r
-       /**\r
-        * The selected sort field.\r
-        * \r
-        * @var string\r
-        */\r
-       public $sortField = '';\r
-       \r
-       /**\r
-        * The selected sort order.\r
-        * \r
-        * @var string\r
-        */\r
-       public $sortOrder = '';\r
-       \r
-       /**\r
-        * The default sort field.\r
-        * \r
-        * @var string\r
-        */\r
-       public $defaultSortField = '';\r
-       \r
-       /**\r
-        * The default sort order.\r
-        * \r
-        * @var string\r
-        */\r
-       public $defaultSortOrder = 'ASC';\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readParameters()\r
-        */\r
-       public function readParameters() {\r
-               parent::readParameters();\r
-               \r
-               // read sorting parameter\r
-               if (isset($_REQUEST['sortField'])) $this->sortField = $_REQUEST['sortField'];\r
-               if (isset($_REQUEST['sortOrder'])) $this->sortOrder = $_REQUEST['sortOrder'];\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::readData()\r
-        */\r
-       public function readData() {\r
-               $this->validateSortOrder();\r
-               $this->validateSortField();\r
-                               \r
-               parent::readData();\r
-       }\r
-       \r
-       /**\r
-        * Validates the given sort field parameter. \r
-        */\r
-       public function validateSortField() {\r
-               // call validateSortField event\r
-               EventHandler::getInstance()->fireAction($this, 'validateSortField');\r
-       }\r
-       \r
-       /**\r
-        * Validates the given sort order parameter. \r
-        */\r
-       public function validateSortOrder() {\r
-               // call validateSortOrder event\r
-               EventHandler::getInstance()->fireAction($this, 'validateSortOrder');\r
-               \r
-               switch ($this->sortOrder) {\r
-                       case 'ASC':\r
-                       case 'DESC': break;\r
-                       default: $this->sortOrder = $this->defaultSortOrder;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public function assignVariables() {\r
-               parent::assignVariables();\r
-               \r
-               // assign sorting parameters\r
-               WCF::getTPL()->assign(array(\r
-                       'sortField' => $this->sortField,\r
-                       'sortOrder' => $this->sortOrder\r
-               ));\r
-       }\r
+<?php
+namespace wcf\page;
+use wcf\system\WCF;
+use wcf\system\event\EventHandler;
+
+/**
+ * Provides default implementations for a sortable page of listed items.
+ * Handles the sorting parameters automatically.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage page
+ * @category   Community Framework
+ */
+abstract class SortablePage extends MultipleLinkPage {
+       /**
+        * The selected sort field.
+        * 
+        * @var string
+        */
+       public $sortField = '';
+       
+       /**
+        * The selected sort order.
+        * 
+        * @var string
+        */
+       public $sortOrder = '';
+       
+       /**
+        * The default sort field.
+        * 
+        * @var string
+        */
+       public $defaultSortField = '';
+       
+       /**
+        * The default sort order.
+        * 
+        * @var string
+        */
+       public $defaultSortOrder = 'ASC';
+       
+       /**
+        * @see wcf\page\IPage::readParameters()
+        */
+       public function readParameters() {
+               parent::readParameters();
+               
+               // read sorting parameter
+               if (isset($_REQUEST['sortField'])) $this->sortField = $_REQUEST['sortField'];
+               if (isset($_REQUEST['sortOrder'])) $this->sortOrder = $_REQUEST['sortOrder'];
+       }
+       
+       /**
+        * @see wcf\page\IPage::readData()
+        */
+       public function readData() {
+               $this->validateSortOrder();
+               $this->validateSortField();
+                               
+               parent::readData();
+       }
+       
+       /**
+        * Validates the given sort field parameter. 
+        */
+       public function validateSortField() {
+               // call validateSortField event
+               EventHandler::getInstance()->fireAction($this, 'validateSortField');
+       }
+       
+       /**
+        * Validates the given sort order parameter. 
+        */
+       public function validateSortOrder() {
+               // call validateSortOrder event
+               EventHandler::getInstance()->fireAction($this, 'validateSortOrder');
+               
+               switch ($this->sortOrder) {
+                       case 'ASC':
+                       case 'DESC': break;
+                       default: $this->sortOrder = $this->defaultSortOrder;
+               }
+       }
+       
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public function assignVariables() {
+               parent::assignVariables();
+               
+               // assign sorting parameters
+               WCF::getTPL()->assign(array(
+                       'sortField' => $this->sortField,
+                       'sortOrder' => $this->sortOrder
+               ));
+       }
 }
index 563c8aa57b76e1d2d951365ce92cabed97b667f1..95ee017402f0861508d71207889eadda535da24a 100644 (file)
@@ -1,58 +1,58 @@
-<?php\r
-namespace wcf\page\util;\r
-\r
-/**\r
- * Assigns default variables for the usage of the inline (javascript) calendar.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage page.util\r
- * @category   Community Framework\r
- */\r
-class InlineCalendar {\r
-       /**\r
-        * @see wcf\page\IPage::assignVariables()\r
-        */\r
-       public static function assignVariables() {\r
-               // create calendar data\r
-               $dayOptions = array(0 => '');\r
-               $hourOptions = $minuteOptions = array('' => '');\r
-               $monthList = $weekdayList = '';\r
-               $weekdays = $monthOptions = array();\r
-               \r
-               // days\r
-               for ($i = 1; $i <= 31; $i++) $dayOptions[$i] = $i;\r
-               // months\r
-               $monthFormat = (Language::$dateFormatLocalized ? '%B' : '%m');\r
-               for ($i = 1; $i <= 12; $i++) $monthOptions[$i] = DateUtil::formatDate($monthFormat, gmmktime(0, 0, 0, $i, 15, 2000), false, true);\r
-               $monthList = implode(',', $monthOptions);\r
-               $monthOptions[0] = '';\r
-               ksort($monthOptions);\r
-               \r
-               // weekdays\r
-               for ($i = 1; $i <= 7; $i++) {\r
-                       $weekdayNumber = intval(DateUtil::formatDate('%w', gmmktime(0, 0, 0, 1, $i, 2000), false, true));\r
-                       $weekdays[$weekdayNumber] = DateUtil::formatDate('%a', gmmktime(0, 0, 0, 1, $i, 2000), false, true);\r
-               }\r
-               ksort($weekdays);\r
-               $weekdayList = implode(',', $weekdays);\r
-               \r
-               // hours\r
-               for ($i = 0; $i < 24; $i++) $hourOptions[$i] = $i < 10 ? "0" . $i : $i;\r
-               \r
-               // minutes\r
-               for ($i = 0; $i < 60; $i += 5) $minuteOptions[$i] = $i < 10 ? "0" . $i : $i;\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'monthOptions' => $monthOptions,\r
-                       'monthList' => $monthList,\r
-                       'dayOptions' => $dayOptions,\r
-                       'weekdayList' => $weekdayList,\r
-                       'startOfWeek' => (WCF::getUser()->firstDayOfWeek == '' ? 1 : intval(WCF::getUser()->firstDayOfWeek)),\r
-                       'hourOptions' => $hourOptions,\r
-                       'minuteOptions' => $minuteOptions\r
-               ));\r
-       }\r
+<?php
+namespace wcf\page\util;
+
+/**
+ * Assigns default variables for the usage of the inline (javascript) calendar.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage page.util
+ * @category   Community Framework
+ */
+class InlineCalendar {
+       /**
+        * @see wcf\page\IPage::assignVariables()
+        */
+       public static function assignVariables() {
+               // create calendar data
+               $dayOptions = array(0 => '');
+               $hourOptions = $minuteOptions = array('' => '');
+               $monthList = $weekdayList = '';
+               $weekdays = $monthOptions = array();
+               
+               // days
+               for ($i = 1; $i <= 31; $i++) $dayOptions[$i] = $i;
+               // months
+               $monthFormat = (Language::$dateFormatLocalized ? '%B' : '%m');
+               for ($i = 1; $i <= 12; $i++) $monthOptions[$i] = DateUtil::formatDate($monthFormat, gmmktime(0, 0, 0, $i, 15, 2000), false, true);
+               $monthList = implode(',', $monthOptions);
+               $monthOptions[0] = '';
+               ksort($monthOptions);
+               
+               // weekdays
+               for ($i = 1; $i <= 7; $i++) {
+                       $weekdayNumber = intval(DateUtil::formatDate('%w', gmmktime(0, 0, 0, 1, $i, 2000), false, true));
+                       $weekdays[$weekdayNumber] = DateUtil::formatDate('%a', gmmktime(0, 0, 0, 1, $i, 2000), false, true);
+               }
+               ksort($weekdays);
+               $weekdayList = implode(',', $weekdays);
+               
+               // hours
+               for ($i = 0; $i < 24; $i++) $hourOptions[$i] = $i < 10 ? "0" . $i : $i;
+               
+               // minutes
+               for ($i = 0; $i < 60; $i += 5) $minuteOptions[$i] = $i < 10 ? "0" . $i : $i;
+               
+               WCF::getTPL()->assign(array(
+                       'monthOptions' => $monthOptions,
+                       'monthList' => $monthList,
+                       'dayOptions' => $dayOptions,
+                       'weekdayList' => $weekdayList,
+                       'startOfWeek' => (WCF::getUser()->firstDayOfWeek == '' ? 1 : intval(WCF::getUser()->firstDayOfWeek)),
+                       'hourOptions' => $hourOptions,
+                       'minuteOptions' => $minuteOptions
+               ));
+       }
 }
index 6bec4163d956aa0adcbb89f9d602772decc70bab..719bffd89b9d120f4571619b192082720ac0b6b3 100644 (file)
-<?php\r
-namespace wcf\system;\r
-use wcf\data\application\Application;\r
-use wcf\data\package\Package;\r
-use wcf\system\application\ApplicationHandler;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\database\statement\PreparedStatement;\r
-use wcf\system\language\LanguageFactory;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\system\session\SessionFactory;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\storage\StorageHandler;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\exception;\r
-use wcf\util;\r
-\r
-// try to disable execution time limit\r
-@set_time_limit(0);\r
-\r
-// define current wcf version\r
-define('WCF_VERSION', '2.0.0 Alpha 1 (Maelstrom)');\r
-\r
-// define current unix timestamp\r
-define('TIME_NOW', time());\r
-\r
-// wcf imports\r
-if (!defined('NO_IMPORTS')) {\r
-       require_once(WCF_DIR.'lib/core.functions.php');\r
-}\r
-\r
-/**\r
- * WCF is the central class for the community framework.\r
- * It holds the database connection, access to template and language engine.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system\r
- * @category   Community Framework\r
- */\r
-class WCF {\r
-       /**\r
-        * list of autoload directories\r
-        *\r
-        * @var array\r
-        */\r
-       protected static $autoloadDirectories = array();\r
-       \r
-       /**\r
-        * list of unique instances of each core object\r
-        *\r
-        * @var array<wcf\system\SingletonFactory>\r
-        */\r
-       protected static $coreObject = array();\r
-       \r
-       /**\r
-        * list of cached core objects\r
-        *\r
-        * @var array<array>\r
-        */\r
-       protected static $coreObjectCache = array();\r
-       \r
-       /**\r
-        * list of package dependencies\r
-        *\r
-        * @var array\r
-        */     \r
-       protected static $packageDependencies = array();\r
-       \r
-       /**\r
-        * database object\r
-        *\r
-        * @var wcf\system\database\Database\r
-        */\r
-       protected static $dbObj = null;\r
-       \r
-       /**\r
-        * language object\r
-        *\r
-        * @var wcf\system\language\Language\r
-        */\r
-       protected static $languageObj = null;\r
-       \r
-       /**\r
-        * session object\r
-        *\r
-        * @var wcf\system\session\SessionHandler\r
-        */\r
-       protected static $sessionObj = null;\r
-       \r
-       /**\r
-        * template object\r
-        *\r
-        * @var wcf\system\template\TemplateEngine\r
-        */\r
-       protected static $tplObj = null;\r
-       \r
-       /**\r
-        * current user object\r
-        *\r
-        * @var wcf\data\user\User\r
-        */\r
-       protected static $userObj = null;\r
-       \r
-       /**\r
-        * Calls all init functions of the WCF class.\r
-        */\r
-       public function __construct() {\r
-               // add autoload directory\r
-               self::$autoloadDirectories['wcf'] = WCF_DIR . 'lib/';\r
-               \r
-               // define tmp directory\r
-               if (!defined('TMP_DIR')) define('TMP_DIR', util\BasicFileUtil::getTempFolder());\r
-               \r
-               // start initialization\r
-               $this->initMagicQuotes();\r
-               $this->initDB();\r
-               $this->initOptions();\r
-               $this->initCache();\r
-               $this->initSession();\r
-               $this->initLanguage();\r
-               $this->initTPL();\r
-               $this->initBlacklist();\r
-               $this->initApplications();\r
-               $this->initCoreObjects();\r
-       }\r
-       \r
-       /**\r
-        * Replacement of the "__destruct()" method.\r
-        * Seems that under specific conditions (windows) the destructor is not called automatically.\r
-        * So we use the php register_shutdown_function to register an own destructor method.\r
-        * Flushs the output, updates the session and executes the shutdown queries.\r
-        */\r
-       public static function destruct() {\r
-               // flush ouput\r
-               if (ob_get_level() && ini_get('output_handler')) {\r
-                       ob_flush();\r
-               }\r
-               else {\r
-                       flush();\r
-               }\r
-               \r
-               // update session\r
-               if (is_object(self::getSession())) {\r
-                       self::getSession()->update();\r
-               }\r
-               \r
-               // close cache source\r
-               if (is_object(CacheHandler::getInstance()) && is_object(CacheHandler::getInstance()->getCacheSource())) {\r
-                       CacheHandler::getInstance()->getCacheSource()->close();\r
-               }\r
-               \r
-               // execute shutdown actions\r
-               StorageHandler::getInstance()->shutdown();\r
-       }\r
-       \r
-       /**\r
-        * Removes slashes in superglobal gpc data arrays if 'magic quotes gpc' is enabled.\r
-        */\r
-       protected function initMagicQuotes() {\r
-               if (function_exists('get_magic_quotes_gpc')) {\r
-                       if (@get_magic_quotes_gpc()) {\r
-                               if (count($_REQUEST)) {\r
-                                       $_REQUEST = util\ArrayUtil::stripslashes($_REQUEST);\r
-                               }\r
-                               if (count($_POST)) {\r
-                                       $_POST = util\ArrayUtil::stripslashes($_POST);\r
-                               }\r
-                               if (count($_GET)) {\r
-                                       $_GET = util\ArrayUtil::stripslashes($_GET);\r
-                               }\r
-                               if (count($_COOKIE)) {\r
-                                       $_COOKIE = util\ArrayUtil::stripslashes($_COOKIE);\r
-                               }\r
-                               if (count($_FILES)) {\r
-                                       foreach ($_FILES as $name => $attributes) {\r
-                                               foreach ($attributes as $key => $value) {\r
-                                                       if ($key != 'tmp_name') {\r
-                                                               $_FILES[$name][$key] = util\ArrayUtil::stripslashes($value);\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       \r
-               if (function_exists('set_magic_quotes_runtime')) {\r
-                       @set_magic_quotes_runtime(0);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the database object.\r
-        *\r
-        * @return      wcf\system\database\Database\r
-        */\r
-       public static final function getDB() {\r
-               return self::$dbObj;\r
-       }\r
-       \r
-       /**\r
-        * Returns the session object.\r
-        *\r
-        * @return      wcf\system\session\SessionHandler\r
-        */\r
-       public static final function getSession() {\r
-               return self::$sessionObj;\r
-       }\r
-       \r
-       /**\r
-        * Returns the user object.\r
-        *\r
-        * @return      wcf\data\user\User\r
-        */\r
-       public static final function getUser() {\r
-               return self::$userObj;\r
-       }\r
-       \r
-       /**\r
-        * Returns the language object.\r
-        *\r
-        * @return      wcf\data\language\Language\r
-        */\r
-       public static final function getLanguage() {\r
-               return self::$languageObj;\r
-       }\r
-       \r
-       /**\r
-        * Returns the template object.\r
-        *\r
-        * @return      wcf\system\template\TemplateEngine\r
-        */\r
-       public static final function getTPL() {\r
-               return self::$tplObj;\r
-       }\r
-       \r
-       /**\r
-        * Calls the show method on the given exception.\r
-        *\r
-        * @param       \Exception      $e\r
-        */\r
-       public static final function handleException(\Exception $e) {\r
-               if ($e instanceof exception\IPrintableException) {\r
-                       $e->show();\r
-                       exit;\r
-               }\r
-               \r
-               print $e;\r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * Catches php errors and throws instead a system exception.\r
-        *\r
-        * @param       integer         $errorNo\r
-        * @param       string          $message\r
-        * @param       string          $filename\r
-        * @param       integer         $lineNo\r
-        */\r
-       public static final function handleError($errorNo, $message, $filename, $lineNo) {\r
-               if (error_reporting() != 0) {\r
-                       $type = 'error';\r
-                       switch ($errorNo) {\r
-                               case 2: $type = 'warning';\r
-                                       break;\r
-                               case 8: $type = 'notice';\r
-                                       break;\r
-                       }\r
-                       \r
-                       throw new exception\SystemException('PHP '.$type.' in file '.$filename.' ('.$lineNo.'): '.$message, 0);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Loads the database configuration and creates a new connection to the database.\r
-        */\r
-       protected function initDB() {\r
-               // get configuration\r
-               $dbHost = $dbUser = $dbPassword = $dbName = '';\r
-               $dbPort = 0;\r
-               $dbClass = 'wcf\system\database\MySQLDatabase';\r
-               require_once(WCF_DIR.'config.inc.php');\r
-               \r
-               // create database connection\r
-               self::$dbObj = new $dbClass($dbHost, $dbUser, $dbPassword, $dbName, $dbPort);\r
-       }\r
-       \r
-       /**\r
-        * Initialises the cache handler and loads the default cache resources.\r
-        */\r
-       protected function initCache() {\r
-               $this->loadDefaultCacheResources();\r
-       }\r
-       \r
-       /**\r
-        * Loads the default cache resources.\r
-        */\r
-       protected function loadDefaultCacheResources() {\r
-               CacheHandler::getInstance()->addResource('languages', WCF_DIR.'cache/cache.languages.php', 'wcf\system\cache\CacheBuilderLanguage');\r
-               CacheHandler::getInstance()->addResource('spiders', WCF_DIR.'cache/cache.spiders.php', 'wcf\system\cache\CacheBuilderSpider');\r
-               CacheHandler::getInstance()->addResource('languages', WCF_DIR.'cache/cache.languages.php', 'wcf\system\cache\builder\CacheBuilderLanguage');\r
-               CacheHandler::getInstance()->addResource('spiders', WCF_DIR.'cache/cache.spiders.php', 'wcf\system\cache\builder\CacheBuilderSpider');\r
-               if (defined('PACKAGE_ID')) {\r
-                       CacheHandler::getInstance()->addResource('coreObjects-'.PACKAGE_ID, WCF_DIR.'cache/cache.coreObjects-'.PACKAGE_ID.'.php', 'wcf\system\cache\CacheBuilderCoreObject');\r
-                       CacheHandler::getInstance()->addResource('coreObjects-'.PACKAGE_ID, WCF_DIR.'cache/cache.coreObjects-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderCoreObject');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Includes the options file.\r
-        * If the option file doesn't exist, the rebuild of it is started.\r
-        */\r
-       protected function initOptions() {\r
-               // get options file name\r
-               $optionsFile = $this->getOptionsFilename();\r
-               \r
-               // create options file if doesn't exist\r
-               if (!file_exists($optionsFile) || filemtime($optionsFile) <= 1) {\r
-                       \wcf\data\option\OptionEditor::rebuildFile($optionsFile);\r
-               }\r
-               require_once($optionsFile);\r
-       }\r
-       \r
-       /**\r
-        * Returns the name of the options file.\r
-        *\r
-        * @return      string          name of the options file\r
-        */\r
-       protected function getOptionsFilename() {\r
-               return WCF_DIR.'options.inc.php';\r
-       }\r
-       \r
-       /**\r
-        * Starts the session system.\r
-        */\r
-       protected function initSession() {\r
-               $factory = new SessionFactory();\r
-               $factory->load();\r
-               \r
-               self::$sessionObj = SessionHandler::getInstance();\r
-               self::$userObj = self::getSession()->getUser();\r
-       }\r
-       \r
-       /**\r
-        * Initialises the language engine.\r
-        */\r
-       protected function initLanguage() {\r
-               if (isset($_GET['l']) && !self::getUser()->userID) {\r
-                       self::getSession()->setLanguageID(intval($_GET['l']));\r
-               }\r
-               \r
-               // set mb settings\r
-               mb_internal_encoding('UTF-8');\r
-               if (function_exists('mb_regex_encoding')) mb_regex_encoding('UTF-8');\r
-               mb_language('uni');\r
-               \r
-               // get language\r
-               self::$languageObj = LanguageFactory::getLanguage(self::getSession()->getLanguageID());\r
-       }\r
-       \r
-       /**\r
-        * Initialises the template engine.\r
-        */\r
-       protected function initTPL() {\r
-               self::$tplObj = TemplateEngine::getInstance();\r
-               self::getTPL()->setLanguageID(self::getLanguage()->languageID);\r
-               $this->assignDefaultTemplateVariables();\r
-       }\r
-       \r
-       /**\r
-        * Executes the blacklist.\r
-        */\r
-       protected function initBlacklist() {\r
-               if (defined('BLACKLIST_IP_ADDRESSES') && BLACKLIST_IP_ADDRESSES != '') {\r
-                       if (!util\StringUtil::executeWordFilter(WCF::getSession()->ipAddress, BLACKLIST_IP_ADDRESSES)) {\r
-                               throw new exception\PermissionDeniedException();\r
-                       }\r
-               }\r
-               if (defined('BLACKLIST_USER_AGENTS') && BLACKLIST_USER_AGENTS != '') {\r
-                       if (!util\StringUtil::executeWordFilter(WCF::getSession()->userAgent, BLACKLIST_USER_AGENTS)) {\r
-                               throw new exception\PermissionDeniedException();\r
-                       }\r
-               }\r
-               if (defined('BLACKLIST_HOSTNAMES') && BLACKLIST_HOSTNAMES != '') {\r
-                       if (!util\StringUtil::executeWordFilter(@gethostbyaddr(WCF::getSession()->ipAddress), BLACKLIST_HOSTNAMES)) {\r
-                               throw new exception\PermissionDeniedException();\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Initialises applications.\r
-        *\r
-        * @todo        Determine all required applications as such connected\r
-        *              with each other. Ensure all applications implement the\r
-        *              'Application' interface.\r
-        */\r
-       protected function initApplications() {\r
-               if (PACKAGE_ID == 1) return;\r
-               \r
-               // prepare statement\r
-               $sql = "SELECT  package, packageDir\r
-                       FROM    wcf".WCF_N."_package\r
-                       WHERE   packageID = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               \r
-               // start main application\r
-               $application = ApplicationHandler::getInstance()->getActiveApplication();\r
-               $this->loadApplication($statement, $application);\r
-               \r
-               // start dependent applications\r
-               $applications = ApplicationHandler::getInstance()->getDependentApplications();\r
-               foreach ($applications as $application) {\r
-                       $this->loadApplication($statement, $application, true);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Loads an application.\r
-        *\r
-        * @param       wcf\system\database\statement\PreparedStatement $statement\r
-        * @param       wcf\data\application\Application        $application\r
-        * @param       boolean $isDependentApplication\r
-        */     \r
-       protected function loadApplication(PreparedStatement $statement, Application $application, $isDepedentApplication = false) {\r
-               $statement->execute(array($application->packageID));\r
-               $row = $statement->fetchArray();\r
-               \r
-               $abbreviation = ApplicationHandler::getInstance()->getAbbreviation($application->packageID);\r
-               $packageDir = util\FileUtil::getRealPath(WCF_DIR.$row['packageDir']);\r
-               self::$autoloadDirectories[$abbreviation] = $packageDir . 'lib/';\r
-               \r
-               $className = $abbreviation.'\system\\'.strtoupper($abbreviation).'Core';\r
-               if (class_exists($className) && util\ClassUtil::isInstanceOf($className, 'wcf\system\application\IApplication')) {\r
-                       // include config file\r
-                       $configPath = $packageDir . PackageInstallationDispatcher::CONFIG_FILE;\r
-                       if (file_exists($configPath)) {\r
-                               require_once($configPath);\r
-                       }\r
-                       else {\r
-                               throw new exception\SystemException('Unable to load configuration for '.$row['package']);\r
-                       }\r
-                       \r
-                       // start application\r
-                       new $className();\r
-               }\r
-               else {\r
-                       unset(self::$autoloadDirectories[$abbreviation]);\r
-                       throw new exception\SystemException('Unable to run '.$row['package'].', '.$className.' missing.');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Initializes core object cache.\r
-        */\r
-       protected function initCoreObjects() {\r
-               // ignore core objects if installing WCF\r
-               if (PACKAGE_ID == 0) {\r
-                       return;\r
-               }\r
-               \r
-               self::$coreObjectCache = CacheHandler::getInstance()->get('coreObjects-'.PACKAGE_ID);\r
-               self::$packageDependencies = \wcf\system\package\PackageDependencyHandler::getDependencies();\r
-       }\r
-       \r
-       /**\r
-        * Assigns some default variables to the template engine.\r
-        */\r
-       protected function assignDefaultTemplateVariables() {\r
-               self::getTPL()->registerPrefilter(array('event', 'hascontent', 'lang'));\r
-               self::getTPL()->assign(array('__wcf' => $this));\r
-       }\r
-       \r
-       /**\r
-        * Wrapper for the getter methods of this class.\r
-        *\r
-        * @param       string          $name\r
-        * @return      mixed           value\r
-        */\r
-       public function __get($name) {\r
-               $method = 'get'.ucfirst($name);\r
-               if (method_exists($this, $method)) {\r
-                       return $this->$method();\r
-               }\r
-               \r
-               throw new exception\SystemException("method '".$method."' does not exist in class WCF");\r
-       }\r
-       \r
-       /**\r
-        * Changes the active language.\r
-        *\r
-        * @param       integer         $languageID\r
-        */\r
-       public static final function setLanguage($languageID) {\r
-               self::$languageObj = LanguageFactory::getLanguage($languageID);\r
-               self::getTPL()->setLanguageID(self::getLanguage()->languageID);\r
-       }\r
-       \r
-       /**\r
-        * Includes the required util or exception classes automatically.\r
-        *\r
-        * @param       string          $className\r
-        * @see         spl_autoload_register()\r
-        */\r
-       public static final function autoload($className) {\r
-               $namespaces = explode('\\', $className);\r
-               if (count($namespaces) > 1) {\r
-                       $applicationPrefix = array_shift($namespaces);\r
-                       if (isset(self::$autoloadDirectories[$applicationPrefix])) {\r
-                               $classPath = self::$autoloadDirectories[$applicationPrefix] . implode('/', $namespaces) . '.class.php';\r
-                               if (file_exists($classPath)) {\r
-                                       require_once($classPath);\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see WCF::__callStatic()\r
-        */\r
-       public final function __call($name, array $arguments) {\r
-               // bug fix to avoid php crash, see http://bugs.php.net/bug.php?id=55020\r
-               if (!method_exists($this, $name)) {\r
-                       return self::__callStatic($name, $arguments);\r
-               }\r
-               \r
-               return $this->$name($arguments);\r
-       }\r
-       \r
-       /**\r
-        * Returns dynamically loaded core objects.\r
-        *\r
-        * @param       string          $name\r
-        * @param       array           $arguments\r
-        */\r
-       public static final function __callStatic($name, array $arguments) {\r
-               $className = preg_replace('~^get~', '', $name);\r
-               \r
-               if (isset(self::$coreObject[$className])) {\r
-                       return self::$coreObject[$className];\r
-               }\r
-               \r
-               $objectName = self::getCoreObject($className);\r
-               if ($objectName === null) {\r
-                       throw new exception\SystemException("Core object '".$className."' is unknown.");\r
-               }\r
-               \r
-               if (class_exists($objectName)) {\r
-                       if (!(util\ClassUtil::isInstanceOf($objectName, 'wcf\system\SingletonFactory'))) {\r
-                               throw new exception\SystemException("class '".$objectName."' does not implement the interface 'SingletonFactory'", 11010);\r
-                       }\r
-                       \r
-                       self::$coreObject[$className] = call_user_func(array($objectName, 'getInstance'));\r
-                       return self::$coreObject[$className];\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Searches for cached core object definition.\r
-        *\r
-        * @param       string          $className\r
-        * @return      string\r
-        */\r
-       protected static final function getCoreObject($className) {\r
-               foreach (self::$packageDependencies as $packageID) {\r
-                       if (isset(self::$coreObjectCache[$packageID][$className])) {\r
-                               return self::$coreObjectCache[$packageID][$className];\r
-                       }\r
-               }\r
-               \r
-               return null;\r
-       }\r
-}\r
+<?php
+namespace wcf\system;
+use wcf\data\application\Application;
+use wcf\data\package\Package;
+use wcf\system\application\ApplicationHandler;
+use wcf\system\cache\CacheHandler;
+use wcf\system\database\statement\PreparedStatement;
+use wcf\system\language\LanguageFactory;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\system\session\SessionFactory;
+use wcf\system\session\SessionHandler;
+use wcf\system\storage\StorageHandler;
+use wcf\system\template\TemplateEngine;
+use wcf\system\exception;
+use wcf\util;
+
+// try to disable execution time limit
+@set_time_limit(0);
+
+// define current wcf version
+define('WCF_VERSION', '2.0.0 Alpha 1 (Maelstrom)');
+
+// define current unix timestamp
+define('TIME_NOW', time());
+
+// wcf imports
+if (!defined('NO_IMPORTS')) {
+       require_once(WCF_DIR.'lib/core.functions.php');
+}
+
+/**
+ * WCF is the central class for the community framework.
+ * It holds the database connection, access to template and language engine.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system
+ * @category   Community Framework
+ */
+class WCF {
+       /**
+        * list of autoload directories
+        *
+        * @var array
+        */
+       protected static $autoloadDirectories = array();
+       
+       /**
+        * list of unique instances of each core object
+        *
+        * @var array<wcf\system\SingletonFactory>
+        */
+       protected static $coreObject = array();
+       
+       /**
+        * list of cached core objects
+        *
+        * @var array<array>
+        */
+       protected static $coreObjectCache = array();
+       
+       /**
+        * list of package dependencies
+        *
+        * @var array
+        */     
+       protected static $packageDependencies = array();
+       
+       /**
+        * database object
+        *
+        * @var wcf\system\database\Database
+        */
+       protected static $dbObj = null;
+       
+       /**
+        * language object
+        *
+        * @var wcf\system\language\Language
+        */
+       protected static $languageObj = null;
+       
+       /**
+        * session object
+        *
+        * @var wcf\system\session\SessionHandler
+        */
+       protected static $sessionObj = null;
+       
+       /**
+        * template object
+        *
+        * @var wcf\system\template\TemplateEngine
+        */
+       protected static $tplObj = null;
+       
+       /**
+        * current user object
+        *
+        * @var wcf\data\user\User
+        */
+       protected static $userObj = null;
+       
+       /**
+        * Calls all init functions of the WCF class.
+        */
+       public function __construct() {
+               // add autoload directory
+               self::$autoloadDirectories['wcf'] = WCF_DIR . 'lib/';
+               
+               // define tmp directory
+               if (!defined('TMP_DIR')) define('TMP_DIR', util\BasicFileUtil::getTempFolder());
+               
+               // start initialization
+               $this->initMagicQuotes();
+               $this->initDB();
+               $this->initOptions();
+               $this->initCache();
+               $this->initSession();
+               $this->initLanguage();
+               $this->initTPL();
+               $this->initBlacklist();
+               $this->initApplications();
+               $this->initCoreObjects();
+       }
+       
+       /**
+        * Replacement of the "__destruct()" method.
+        * Seems that under specific conditions (windows) the destructor is not called automatically.
+        * So we use the php register_shutdown_function to register an own destructor method.
+        * Flushs the output, updates the session and executes the shutdown queries.
+        */
+       public static function destruct() {
+               // flush ouput
+               if (ob_get_level() && ini_get('output_handler')) {
+                       ob_flush();
+               }
+               else {
+                       flush();
+               }
+               
+               // update session
+               if (is_object(self::getSession())) {
+                       self::getSession()->update();
+               }
+               
+               // close cache source
+               if (is_object(CacheHandler::getInstance()) && is_object(CacheHandler::getInstance()->getCacheSource())) {
+                       CacheHandler::getInstance()->getCacheSource()->close();
+               }
+               
+               // execute shutdown actions
+               StorageHandler::getInstance()->shutdown();
+       }
+       
+       /**
+        * Removes slashes in superglobal gpc data arrays if 'magic quotes gpc' is enabled.
+        */
+       protected function initMagicQuotes() {
+               if (function_exists('get_magic_quotes_gpc')) {
+                       if (@get_magic_quotes_gpc()) {
+                               if (count($_REQUEST)) {
+                                       $_REQUEST = util\ArrayUtil::stripslashes($_REQUEST);
+                               }
+                               if (count($_POST)) {
+                                       $_POST = util\ArrayUtil::stripslashes($_POST);
+                               }
+                               if (count($_GET)) {
+                                       $_GET = util\ArrayUtil::stripslashes($_GET);
+                               }
+                               if (count($_COOKIE)) {
+                                       $_COOKIE = util\ArrayUtil::stripslashes($_COOKIE);
+                               }
+                               if (count($_FILES)) {
+                                       foreach ($_FILES as $name => $attributes) {
+                                               foreach ($attributes as $key => $value) {
+                                                       if ($key != 'tmp_name') {
+                                                               $_FILES[$name][$key] = util\ArrayUtil::stripslashes($value);
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       
+               if (function_exists('set_magic_quotes_runtime')) {
+                       @set_magic_quotes_runtime(0);
+               }
+       }
+       
+       /**
+        * Returns the database object.
+        *
+        * @return      wcf\system\database\Database
+        */
+       public static final function getDB() {
+               return self::$dbObj;
+       }
+       
+       /**
+        * Returns the session object.
+        *
+        * @return      wcf\system\session\SessionHandler
+        */
+       public static final function getSession() {
+               return self::$sessionObj;
+       }
+       
+       /**
+        * Returns the user object.
+        *
+        * @return      wcf\data\user\User
+        */
+       public static final function getUser() {
+               return self::$userObj;
+       }
+       
+       /**
+        * Returns the language object.
+        *
+        * @return      wcf\data\language\Language
+        */
+       public static final function getLanguage() {
+               return self::$languageObj;
+       }
+       
+       /**
+        * Returns the template object.
+        *
+        * @return      wcf\system\template\TemplateEngine
+        */
+       public static final function getTPL() {
+               return self::$tplObj;
+       }
+       
+       /**
+        * Calls the show method on the given exception.
+        *
+        * @param       \Exception      $e
+        */
+       public static final function handleException(\Exception $e) {
+               if ($e instanceof exception\IPrintableException) {
+                       $e->show();
+                       exit;
+               }
+               
+               print $e;
+               exit;
+       }
+       
+       /**
+        * Catches php errors and throws instead a system exception.
+        *
+        * @param       integer         $errorNo
+        * @param       string          $message
+        * @param       string          $filename
+        * @param       integer         $lineNo
+        */
+       public static final function handleError($errorNo, $message, $filename, $lineNo) {
+               if (error_reporting() != 0) {
+                       $type = 'error';
+                       switch ($errorNo) {
+                               case 2: $type = 'warning';
+                                       break;
+                               case 8: $type = 'notice';
+                                       break;
+                       }
+                       
+                       throw new exception\SystemException('PHP '.$type.' in file '.$filename.' ('.$lineNo.'): '.$message, 0);
+               }
+       }
+       
+       /**
+        * Loads the database configuration and creates a new connection to the database.
+        */
+       protected function initDB() {
+               // get configuration
+               $dbHost = $dbUser = $dbPassword = $dbName = '';
+               $dbPort = 0;
+               $dbClass = 'wcf\system\database\MySQLDatabase';
+               require_once(WCF_DIR.'config.inc.php');
+               
+               // create database connection
+               self::$dbObj = new $dbClass($dbHost, $dbUser, $dbPassword, $dbName, $dbPort);
+       }
+       
+       /**
+        * Initialises the cache handler and loads the default cache resources.
+        */
+       protected function initCache() {
+               $this->loadDefaultCacheResources();
+       }
+       
+       /**
+        * Loads the default cache resources.
+        */
+       protected function loadDefaultCacheResources() {
+               CacheHandler::getInstance()->addResource('languages', WCF_DIR.'cache/cache.languages.php', 'wcf\system\cache\CacheBuilderLanguage');
+               CacheHandler::getInstance()->addResource('spiders', WCF_DIR.'cache/cache.spiders.php', 'wcf\system\cache\CacheBuilderSpider');
+               CacheHandler::getInstance()->addResource('languages', WCF_DIR.'cache/cache.languages.php', 'wcf\system\cache\builder\CacheBuilderLanguage');
+               CacheHandler::getInstance()->addResource('spiders', WCF_DIR.'cache/cache.spiders.php', 'wcf\system\cache\builder\CacheBuilderSpider');
+               if (defined('PACKAGE_ID')) {
+                       CacheHandler::getInstance()->addResource('coreObjects-'.PACKAGE_ID, WCF_DIR.'cache/cache.coreObjects-'.PACKAGE_ID.'.php', 'wcf\system\cache\CacheBuilderCoreObject');
+                       CacheHandler::getInstance()->addResource('coreObjects-'.PACKAGE_ID, WCF_DIR.'cache/cache.coreObjects-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderCoreObject');
+               }
+       }
+       
+       /**
+        * Includes the options file.
+        * If the option file doesn't exist, the rebuild of it is started.
+        */
+       protected function initOptions() {
+               // get options file name
+               $optionsFile = $this->getOptionsFilename();
+               
+               // create options file if doesn't exist
+               if (!file_exists($optionsFile) || filemtime($optionsFile) <= 1) {
+                       \wcf\data\option\OptionEditor::rebuildFile($optionsFile);
+               }
+               require_once($optionsFile);
+       }
+       
+       /**
+        * Returns the name of the options file.
+        *
+        * @return      string          name of the options file
+        */
+       protected function getOptionsFilename() {
+               return WCF_DIR.'options.inc.php';
+       }
+       
+       /**
+        * Starts the session system.
+        */
+       protected function initSession() {
+               $factory = new SessionFactory();
+               $factory->load();
+               
+               self::$sessionObj = SessionHandler::getInstance();
+               self::$userObj = self::getSession()->getUser();
+       }
+       
+       /**
+        * Initialises the language engine.
+        */
+       protected function initLanguage() {
+               if (isset($_GET['l']) && !self::getUser()->userID) {
+                       self::getSession()->setLanguageID(intval($_GET['l']));
+               }
+               
+               // set mb settings
+               mb_internal_encoding('UTF-8');
+               if (function_exists('mb_regex_encoding')) mb_regex_encoding('UTF-8');
+               mb_language('uni');
+               
+               // get language
+               self::$languageObj = LanguageFactory::getLanguage(self::getSession()->getLanguageID());
+       }
+       
+       /**
+        * Initialises the template engine.
+        */
+       protected function initTPL() {
+               self::$tplObj = TemplateEngine::getInstance();
+               self::getTPL()->setLanguageID(self::getLanguage()->languageID);
+               $this->assignDefaultTemplateVariables();
+       }
+       
+       /**
+        * Executes the blacklist.
+        */
+       protected function initBlacklist() {
+               if (defined('BLACKLIST_IP_ADDRESSES') && BLACKLIST_IP_ADDRESSES != '') {
+                       if (!util\StringUtil::executeWordFilter(WCF::getSession()->ipAddress, BLACKLIST_IP_ADDRESSES)) {
+                               throw new exception\PermissionDeniedException();
+                       }
+               }
+               if (defined('BLACKLIST_USER_AGENTS') && BLACKLIST_USER_AGENTS != '') {
+                       if (!util\StringUtil::executeWordFilter(WCF::getSession()->userAgent, BLACKLIST_USER_AGENTS)) {
+                               throw new exception\PermissionDeniedException();
+                       }
+               }
+               if (defined('BLACKLIST_HOSTNAMES') && BLACKLIST_HOSTNAMES != '') {
+                       if (!util\StringUtil::executeWordFilter(@gethostbyaddr(WCF::getSession()->ipAddress), BLACKLIST_HOSTNAMES)) {
+                               throw new exception\PermissionDeniedException();
+                       }
+               }
+       }
+       
+       /**
+        * Initialises applications.
+        *
+        * @todo        Determine all required applications as such connected
+        *              with each other. Ensure all applications implement the
+        *              'Application' interface.
+        */
+       protected function initApplications() {
+               if (PACKAGE_ID == 1) return;
+               
+               // prepare statement
+               $sql = "SELECT  package, packageDir
+                       FROM    wcf".WCF_N."_package
+                       WHERE   packageID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               
+               // start main application
+               $application = ApplicationHandler::getInstance()->getActiveApplication();
+               $this->loadApplication($statement, $application);
+               
+               // start dependent applications
+               $applications = ApplicationHandler::getInstance()->getDependentApplications();
+               foreach ($applications as $application) {
+                       $this->loadApplication($statement, $application, true);
+               }
+       }
+       
+       /**
+        * Loads an application.
+        *
+        * @param       wcf\system\database\statement\PreparedStatement $statement
+        * @param       wcf\data\application\Application        $application
+        * @param       boolean $isDependentApplication
+        */     
+       protected function loadApplication(PreparedStatement $statement, Application $application, $isDepedentApplication = false) {
+               $statement->execute(array($application->packageID));
+               $row = $statement->fetchArray();
+               
+               $abbreviation = ApplicationHandler::getInstance()->getAbbreviation($application->packageID);
+               $packageDir = util\FileUtil::getRealPath(WCF_DIR.$row['packageDir']);
+               self::$autoloadDirectories[$abbreviation] = $packageDir . 'lib/';
+               
+               $className = $abbreviation.'\system\\'.strtoupper($abbreviation).'Core';
+               if (class_exists($className) && util\ClassUtil::isInstanceOf($className, 'wcf\system\application\IApplication')) {
+                       // include config file
+                       $configPath = $packageDir . PackageInstallationDispatcher::CONFIG_FILE;
+                       if (file_exists($configPath)) {
+                               require_once($configPath);
+                       }
+                       else {
+                               throw new exception\SystemException('Unable to load configuration for '.$row['package']);
+                       }
+                       
+                       // start application
+                       new $className();
+               }
+               else {
+                       unset(self::$autoloadDirectories[$abbreviation]);
+                       throw new exception\SystemException('Unable to run '.$row['package'].', '.$className.' missing.');
+               }
+       }
+       
+       /**
+        * Initializes core object cache.
+        */
+       protected function initCoreObjects() {
+               // ignore core objects if installing WCF
+               if (PACKAGE_ID == 0) {
+                       return;
+               }
+               
+               self::$coreObjectCache = CacheHandler::getInstance()->get('coreObjects-'.PACKAGE_ID);
+               self::$packageDependencies = \wcf\system\package\PackageDependencyHandler::getDependencies();
+       }
+       
+       /**
+        * Assigns some default variables to the template engine.
+        */
+       protected function assignDefaultTemplateVariables() {
+               self::getTPL()->registerPrefilter(array('event', 'hascontent', 'lang'));
+               self::getTPL()->assign(array('__wcf' => $this));
+       }
+       
+       /**
+        * Wrapper for the getter methods of this class.
+        *
+        * @param       string          $name
+        * @return      mixed           value
+        */
+       public function __get($name) {
+               $method = 'get'.ucfirst($name);
+               if (method_exists($this, $method)) {
+                       return $this->$method();
+               }
+               
+               throw new exception\SystemException("method '".$method."' does not exist in class WCF");
+       }
+       
+       /**
+        * Changes the active language.
+        *
+        * @param       integer         $languageID
+        */
+       public static final function setLanguage($languageID) {
+               self::$languageObj = LanguageFactory::getLanguage($languageID);
+               self::getTPL()->setLanguageID(self::getLanguage()->languageID);
+       }
+       
+       /**
+        * Includes the required util or exception classes automatically.
+        *
+        * @param       string          $className
+        * @see         spl_autoload_register()
+        */
+       public static final function autoload($className) {
+               $namespaces = explode('\\', $className);
+               if (count($namespaces) > 1) {
+                       $applicationPrefix = array_shift($namespaces);
+                       if (isset(self::$autoloadDirectories[$applicationPrefix])) {
+                               $classPath = self::$autoloadDirectories[$applicationPrefix] . implode('/', $namespaces) . '.class.php';
+                               if (file_exists($classPath)) {
+                                       require_once($classPath);
+                               }
+                       }
+               }
+       }
+       
+       /**
+        * @see WCF::__callStatic()
+        */
+       public final function __call($name, array $arguments) {
+               // bug fix to avoid php crash, see http://bugs.php.net/bug.php?id=55020
+               if (!method_exists($this, $name)) {
+                       return self::__callStatic($name, $arguments);
+               }
+               
+               return $this->$name($arguments);
+       }
+       
+       /**
+        * Returns dynamically loaded core objects.
+        *
+        * @param       string          $name
+        * @param       array           $arguments
+        */
+       public static final function __callStatic($name, array $arguments) {
+               $className = preg_replace('~^get~', '', $name);
+               
+               if (isset(self::$coreObject[$className])) {
+                       return self::$coreObject[$className];
+               }
+               
+               $objectName = self::getCoreObject($className);
+               if ($objectName === null) {
+                       throw new exception\SystemException("Core object '".$className."' is unknown.");
+               }
+               
+               if (class_exists($objectName)) {
+                       if (!(util\ClassUtil::isInstanceOf($objectName, 'wcf\system\SingletonFactory'))) {
+                               throw new exception\SystemException("class '".$objectName."' does not implement the interface 'SingletonFactory'", 11010);
+                       }
+                       
+                       self::$coreObject[$className] = call_user_func(array($objectName, 'getInstance'));
+                       return self::$coreObject[$className];
+               }
+       }
+       
+       /**
+        * Searches for cached core object definition.
+        *
+        * @param       string          $className
+        * @return      string
+        */
+       protected static final function getCoreObject($className) {
+               foreach (self::$packageDependencies as $packageID) {
+                       if (isset(self::$coreObjectCache[$packageID][$className])) {
+                               return self::$coreObjectCache[$packageID][$className];
+                       }
+               }
+               
+               return null;
+       }
+}
index 504a09459e0b9f99c4c60b16a0055fa8dcbcd446..e8c8e1f3282ec4b1bca7c14e815712f2d817abc8 100644 (file)
-<?php\r
-namespace wcf\system;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\session\ACPSessionFactory;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\template\ACPTemplateEngine;\r
-use wcf\util;\r
-\r
-/**\r
- * Extends WCF class with functions for the admin control panel.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system\r
- * @category   Community Framework\r
- */\r
-class WCFACP extends WCF {\r
-       /**\r
-        * Calls all init functions of the WCF and the WCFACP class. \r
-        */\r
-       public function __construct() {\r
-               // add autoload directory\r
-               self::$autoloadDirectories['wcf'] = WCF_DIR . 'lib/';\r
-               \r
-               // define tmp directory\r
-               if (!defined('TMP_DIR')) define('TMP_DIR', util\BasicFileUtil::getTempFolder());\r
-               \r
-               // start initialization\r
-               $this->initMagicQuotes();\r
-               $this->initDB();\r
-               $this->initPackage();\r
-               $this->initOptions();\r
-               $this->initCache();\r
-               $this->initSession();\r
-               $this->initLanguage();\r
-               $this->initTPL();\r
-               $this->initBlacklist();\r
-               $this->initAuth();\r
-               $this->initCoreObjects();\r
-       }\r
-       \r
-       /**\r
-        * Does the user authentication.\r
-        */\r
-       protected function initAuth() {\r
-               if ((!isset($_REQUEST['page']) || ($_REQUEST['page'] != 'Logout' && $_REQUEST['page'] != 'ACPCaptcha')) && (isset($_REQUEST['page']) || !isset($_REQUEST['form']) || $_REQUEST['form'] != 'Login')) {\r
-                       if (WCF::getUser()->userID == 0) {\r
-                               util\HeaderUtil::redirect('index.php?form=Login'.SID_ARG_2ND_NOT_ENCODED);\r
-                               exit;\r
-                       }\r
-                       else {\r
-                               WCF::getSession()->checkPermission(array('admin.general.canUseAcp'));\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Starts the session system.\r
-        */\r
-       protected function initSession() {\r
-               $factory = new ACPSessionFactory();\r
-               $factory->load();\r
-               \r
-               self::$sessionObj = SessionHandler::getInstance();\r
-               self::$userObj = self::getSession()->getUser();\r
-       }\r
-       \r
-       /**\r
-        * Initialises the template engine.\r
-        */\r
-       protected function initTPL() {\r
-               self::$tplObj = ACPTemplateEngine::getInstance();\r
-               self::getTPL()->setLanguageID(self::getLanguage()->languageID);\r
-               $this->assignDefaultTemplateVariables();\r
-       }\r
-       \r
-       /**\r
-        * @see WCF::assignDefaultTemplateVariables()\r
-        */\r
-       protected function assignDefaultTemplateVariables() {\r
-               parent::assignDefaultTemplateVariables();\r
-               \r
-               self::getTPL()->assign(array(\r
-                       'quickAccessPackages' => $this->getQuickAccessPackages(),\r
-                       //'timezone' => util\DateUtil::getTimezone()\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * @see WCF::loadDefaultCacheResources()\r
-        */\r
-       protected function loadDefaultCacheResources() {\r
-               parent::loadDefaultCacheResources();\r
-               CacheHandler::getInstance()->addResource('packages', WCF_DIR.'cache/cache.packages.php', 'wcf\system\cache\builder\CacheBuilderPackage');\r
-       }\r
-       \r
-       /**\r
-        * Initialises the active package.\r
-        */\r
-       protected function initPackage() {\r
-               // define active package id\r
-               if (!defined('PACKAGE_ID')) {\r
-                       $packageID = self::getWcfPackageID();\r
-                       define('PACKAGE_ID', $packageID);\r
-               }\r
-               \r
-               /*\r
-               $packageID = 0;\r
-               $packages = CacheHandler::getInstance()->get('packages');\r
-               if (isset($_REQUEST['packageID'])) $packageID = intval($_REQUEST['packageID']);\r
-               \r
-               if (!isset($packages[$packageID]) || !$packages[$packageID]['standalone']) {\r
-                       // package id is invalid\r
-                       $packageID = self::getWcfPackageID();\r
-               }\r
-               \r
-               // define active package id\r
-               if (!defined('PACKAGE_ID')) define('PACKAGE_ID', $packageID);*/ \r
-       }\r
-       \r
-       /**\r
-        * Returns the package id of the wcf package.\r
-        * \r
-        * @return      integer\r
-        */\r
-       public static final function getWcfPackageID() {\r
-               // try to find package wcf id\r
-               $sql = "SELECT  packageID\r
-                       FROM    wcf".WCF_N."_package\r
-                       WHERE   package = 'com.woltlab.wcf'";\r
-               $statement = WCFACP::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               $package = $statement->fetchArray();\r
-               \r
-               if (!$package) return 0;\r
-               else return $package['packageID'];\r
-       }\r
-       \r
-       /**\r
-        * Returns a list of all installed standalone packages.\r
-        * \r
-        * @return      array\r
-        */\r
-       protected function getQuickAccessPackages() {\r
-               $quickAccessPackages = array();\r
-               $packages = CacheHandler::getInstance()->get('packages');\r
-               foreach ($packages as $packageID => $package) {\r
-                       if (!$package->standalone) break;\r
-                       if ($package->package != 'com.woltlab.wcf') {\r
-                               $quickAccessPackages[] = $package;\r
-                       }\r
-               }\r
-               \r
-               return $quickAccessPackages;\r
-       }\r
-       \r
-       /**\r
-        * Checks whether the active user has entered the valid master password.\r
-        */\r
-       public static function checkMasterPassword() {\r
-               if (defined('MODULE_MASTER_PASSWORD') && MODULE_MASTER_PASSWORD == 1 && !WCF::getSession()->getVar('masterPassword')) {\r
-                       if (file_exists(WCF_DIR.'acp/masterPassword.inc.php')) {\r
-                               require_once(WCF_DIR.'acp/masterPassword.inc.php');\r
-                       }\r
-                       if (defined('MASTER_PASSWORD') && defined('MASTER_PASSWORD_SALT')) {\r
-                               new \wcf\acp\form\MasterPasswordForm();\r
-                               exit;\r
-                       }\r
-                       else {\r
-                               new \wcf\acp\form\MasterPasswordInitForm();\r
-                               exit;\r
-                       }\r
-               }\r
-       }\r
-}\r
+<?php
+namespace wcf\system;
+use wcf\system\cache\CacheHandler;
+use wcf\system\session\ACPSessionFactory;
+use wcf\system\session\SessionHandler;
+use wcf\system\template\ACPTemplateEngine;
+use wcf\util;
+
+/**
+ * Extends WCF class with functions for the admin control panel.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system
+ * @category   Community Framework
+ */
+class WCFACP extends WCF {
+       /**
+        * Calls all init functions of the WCF and the WCFACP class. 
+        */
+       public function __construct() {
+               // add autoload directory
+               self::$autoloadDirectories['wcf'] = WCF_DIR . 'lib/';
+               
+               // define tmp directory
+               if (!defined('TMP_DIR')) define('TMP_DIR', util\BasicFileUtil::getTempFolder());
+               
+               // start initialization
+               $this->initMagicQuotes();
+               $this->initDB();
+               $this->initPackage();
+               $this->initOptions();
+               $this->initCache();
+               $this->initSession();
+               $this->initLanguage();
+               $this->initTPL();
+               $this->initBlacklist();
+               $this->initAuth();
+               $this->initCoreObjects();
+       }
+       
+       /**
+        * Does the user authentication.
+        */
+       protected function initAuth() {
+               if ((!isset($_REQUEST['page']) || ($_REQUEST['page'] != 'Logout' && $_REQUEST['page'] != 'ACPCaptcha')) && (isset($_REQUEST['page']) || !isset($_REQUEST['form']) || $_REQUEST['form'] != 'Login')) {
+                       if (WCF::getUser()->userID == 0) {
+                               util\HeaderUtil::redirect('index.php?form=Login'.SID_ARG_2ND_NOT_ENCODED);
+                               exit;
+                       }
+                       else {
+                               WCF::getSession()->checkPermission(array('admin.general.canUseAcp'));
+                       }
+               }
+       }
+       
+       /**
+        * Starts the session system.
+        */
+       protected function initSession() {
+               $factory = new ACPSessionFactory();
+               $factory->load();
+               
+               self::$sessionObj = SessionHandler::getInstance();
+               self::$userObj = self::getSession()->getUser();
+       }
+       
+       /**
+        * Initialises the template engine.
+        */
+       protected function initTPL() {
+               self::$tplObj = ACPTemplateEngine::getInstance();
+               self::getTPL()->setLanguageID(self::getLanguage()->languageID);
+               $this->assignDefaultTemplateVariables();
+       }
+       
+       /**
+        * @see WCF::assignDefaultTemplateVariables()
+        */
+       protected function assignDefaultTemplateVariables() {
+               parent::assignDefaultTemplateVariables();
+               
+               self::getTPL()->assign(array(
+                       'quickAccessPackages' => $this->getQuickAccessPackages(),
+                       //'timezone' => util\DateUtil::getTimezone()
+               ));
+       }
+       
+       /**
+        * @see WCF::loadDefaultCacheResources()
+        */
+       protected function loadDefaultCacheResources() {
+               parent::loadDefaultCacheResources();
+               CacheHandler::getInstance()->addResource('packages', WCF_DIR.'cache/cache.packages.php', 'wcf\system\cache\builder\CacheBuilderPackage');
+       }
+       
+       /**
+        * Initialises the active package.
+        */
+       protected function initPackage() {
+               // define active package id
+               if (!defined('PACKAGE_ID')) {
+                       $packageID = self::getWcfPackageID();
+                       define('PACKAGE_ID', $packageID);
+               }
+               
+               /*
+               $packageID = 0;
+               $packages = CacheHandler::getInstance()->get('packages');
+               if (isset($_REQUEST['packageID'])) $packageID = intval($_REQUEST['packageID']);
+               
+               if (!isset($packages[$packageID]) || !$packages[$packageID]['standalone']) {
+                       // package id is invalid
+                       $packageID = self::getWcfPackageID();
+               }
+               
+               // define active package id
+               if (!defined('PACKAGE_ID')) define('PACKAGE_ID', $packageID);*/ 
+       }
+       
+       /**
+        * Returns the package id of the wcf package.
+        * 
+        * @return      integer
+        */
+       public static final function getWcfPackageID() {
+               // try to find package wcf id
+               $sql = "SELECT  packageID
+                       FROM    wcf".WCF_N."_package
+                       WHERE   package = 'com.woltlab.wcf'";
+               $statement = WCFACP::getDB()->prepareStatement($sql);
+               $statement->execute();
+               $package = $statement->fetchArray();
+               
+               if (!$package) return 0;
+               else return $package['packageID'];
+       }
+       
+       /**
+        * Returns a list of all installed standalone packages.
+        * 
+        * @return      array
+        */
+       protected function getQuickAccessPackages() {
+               $quickAccessPackages = array();
+               $packages = CacheHandler::getInstance()->get('packages');
+               foreach ($packages as $packageID => $package) {
+                       if (!$package->standalone) break;
+                       if ($package->package != 'com.woltlab.wcf') {
+                               $quickAccessPackages[] = $package;
+                       }
+               }
+               
+               return $quickAccessPackages;
+       }
+       
+       /**
+        * Checks whether the active user has entered the valid master password.
+        */
+       public static function checkMasterPassword() {
+               if (defined('MODULE_MASTER_PASSWORD') && MODULE_MASTER_PASSWORD == 1 && !WCF::getSession()->getVar('masterPassword')) {
+                       if (file_exists(WCF_DIR.'acp/masterPassword.inc.php')) {
+                               require_once(WCF_DIR.'acp/masterPassword.inc.php');
+                       }
+                       if (defined('MASTER_PASSWORD') && defined('MASTER_PASSWORD_SALT')) {
+                               new \wcf\acp\form\MasterPasswordForm();
+                               exit;
+                       }
+                       else {
+                               new \wcf\acp\form\MasterPasswordInitForm();
+                               exit;
+                       }
+               }
+       }
+}
index 2aee8ffbb9c659cec1df396acc7f90cd058db906..492d70592c8f0706d502c6ac2df51aa2d3f23112 100644 (file)
-<?php\r
-namespace wcf\system;\r
-use wcf\data\language\LanguageEditor;\r
-use wcf\data\language\SetupLanguage;\r
-use wcf\data\user\User;\r
-use wcf\data\user\UserAction;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\database\util\SQLParser;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\io\File;\r
-use wcf\system\io\Tar;\r
-use wcf\system\language\LanguageFactory;\r
-use wcf\system\package\PackageArchive;\r
-use wcf\system\session\ACPSessionFactory;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\setup\Installer;\r
-use wcf\system\template\SetupTemplateEngine;\r
-use wcf\system\WCF;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-use wcf\util\UserUtil;\r
-use wcf\util\XML;\r
-\r
-// define\r
-define('PACKAGE_ID', '0');\r
-define('HTTP_ENABLE_NO_CACHE_HEADERS', 0);\r
-define('HTTP_ENABLE_GZIP', 0);\r
-define('HTTP_GZIP_LEVEL', 0);\r
-define('CACHE_SOURCE_TYPE', 'disk');\r
-define('ENABLE_SESSION_DATA_CACHE', 0);\r
-define('MODULE_MASTER_PASSWORD', 1);\r
-\r
-/**\r
- * WCFSetup executes the installation of the basic wcf systems.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system\r
- * @category   Community Framework\r
- */\r
-class WCFSetup extends WCF {\r
-       protected static $availableLanguages = array();\r
-       protected static $selectedLanguageCode = 'en';\r
-       protected static $selectedLanguages = array();\r
-       protected static $wcfDir = '';\r
-       protected static $installedFiles = array();\r
-       protected static $setupPackageName = 'WoltLab Community Framework';\r
-       protected static $developerMode = 0;\r
-       protected static $dbClasses = array(\r
-               'MySQLDatabase' => array('class' => 'wcf\system\database\MySQLDatabase', 'minversion' => '5.1.17'),     // MySQL 5.0.0+\r
-               'PostgreSQLDatabase' => array('class' => 'wcf\system\database\PostgreSQLDatabase', 'minversion' => '8.2.0')     // PostgreSQL 8.2.0+\r
-       );\r
-       \r
-       /**\r
-        * Calls all init functions of the WCFSetup class and starts the setup process.\r
-        */\r
-       public function __construct() {\r
-               @set_time_limit(0);\r
-               $this->initMagicQuotes();\r
-               $this->getDeveloperMode();\r
-               $this->getLanguageSelection();\r
-               $this->getWCFDir();\r
-               $this->initLanguage();\r
-               $this->initTPL();\r
-               self::getLanguage()->loadLanguage();\r
-               $this->getPackageName();\r
-               \r
-               // start setup\r
-               $this->setup();\r
-       }\r
-       \r
-       /**\r
-        * Gets the status of the developer mode.\r
-        */\r
-       protected static function getDeveloperMode() {\r
-               if (isset($_GET['dev'])) self::$developerMode = intval($_GET['dev']);\r
-               else if (isset($_POST['dev'])) self::$developerMode = intval($_POST['dev']);\r
-       }\r
-       \r
-       /**\r
-        * Gets the selected language.\r
-        */\r
-       protected static function getLanguageSelection() {\r
-               self::$availableLanguages = self::getAllLanguages();\r
-               \r
-               if (isset($_REQUEST['languageCode']) && in_array($_REQUEST['languageCode'], self::$availableLanguages)) {\r
-                       self::$selectedLanguageCode = $_REQUEST['languageCode'];\r
-               }\r
-               else {\r
-                       self::$selectedLanguageCode = LanguageFactory::getPreferredLanguage(self::$availableLanguages, self::$selectedLanguageCode);\r
-               }\r
-               \r
-               if (isset($_POST['selectedLanguages']) && is_array($_POST['selectedLanguages'])) {\r
-                       self::$selectedLanguages = $_POST['selectedLanguages'];\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Gets the available database classes.\r
-        *\r
-        * @return      array\r
-        */\r
-       protected static function getAvailableDBClasses() {\r
-               $availableDBClasses = array();\r
-               foreach (self::$dbClasses as $class => $data) {\r
-                       if (call_user_func(array($data['class'], 'isSupported'))) {\r
-                               $availableDBClasses[$class] = $data;\r
-                       }\r
-               }\r
-               \r
-               return $availableDBClasses;\r
-       }\r
-\r
-       /**\r
-        * Gets the selected wcf dir from request.\r
-        */\r
-       protected static function getWCFDir() {\r
-               if (isset($_REQUEST['wcfDir']) && $_REQUEST['wcfDir'] != '') {\r
-                       self::$wcfDir = FileUtil::addTrailingSlash(FileUtil::unifyDirSeperator($_REQUEST['wcfDir']));\r
-                       if (@file_exists(self::$wcfDir)) {\r
-                               define('RELATIVE_WCF_DIR', FileUtil::getRelativePath(INSTALL_SCRIPT_DIR, self::$wcfDir));\r
-                       }\r
-               }\r
-               \r
-               define('WCF_DIR', self::$wcfDir);\r
-       }\r
-               \r
-       /**\r
-        * Initialises the language engine.\r
-        */\r
-       protected function initLanguage() {\r
-               // set mb settings\r
-               mb_internal_encoding('UTF-8');\r
-               if (function_exists('mb_regex_encoding')) mb_regex_encoding('UTF-8');\r
-               mb_language('uni');\r
-               \r
-               // init setup language\r
-               self::$languageObj = new SetupLanguage(null, array(\r
-                       'languageCode' => self::$selectedLanguageCode\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * Initialises the template engine.\r
-        */\r
-       protected function initTPL() {\r
-               self::$tplObj = SetupTemplateEngine::getInstance();\r
-               self::getTPL()->setLanguageID(array_search(self::$selectedLanguageCode, self::$availableLanguages));\r
-               self::getTPL()->setCompileDir(TMP_DIR);\r
-               self::getTPL()->addTemplatePath(PACKAGE_ID, TMP_DIR);\r
-               self::getTPL()->registerPrefilter(array('lang'));\r
-               self::getTPL()->assign(array(\r
-                       '__wcf' => $this,\r
-                       'tmpFilePrefix' => TMP_FILE_PREFIX,\r
-                       'languageCode' => self::$selectedLanguageCode,\r
-                       'selectedLanguages' => self::$selectedLanguages,\r
-                       'wcfDir' => self::$wcfDir,\r
-                       'developerMode' => self::$developerMode\r
-               ));\r
-       }\r
-       \r
-       /**\r
-        * Returns all languages from WCFSetup.tar.gz.\r
-        *\r
-        * @return      array\r
-        */\r
-       protected static function getAllLanguages() {\r
-               $languages = $match = array();\r
-               $tar = new Tar(SETUP_FILE);\r
-               foreach ($tar->getContentList() as $file) {\r
-                       if (strpos($file['filename'], 'setup/lang/') === 0 && substr($file['filename'], -4) == '.xml' && preg_match('!^setup_([a-z]{2}(?:-[A-Za-z0-9]+)?(?:_[A-Za-z]{2})?)$!', basename($file['filename'], '.xml'), $match)) {\r
-                               $languages[] = $match[1];\r
-                       }\r
-               }\r
-               $tar->close();\r
-\r
-               // sort languages by language code\r
-               sort($languages);\r
-\r
-               return $languages;\r
-       }\r
-       \r
-       /**\r
-        * Calculates the current state of the progress bar.\r
-        *\r
-        * @param       integer         $currentStep\r
-        */\r
-       protected function calcProgress($currentStep) {\r
-               // count delivered packages\r
-               $packages = 1; // one for wcf setup\r
-               $tar = new Tar(SETUP_FILE);\r
-               foreach ($tar->getContentList() as $file) {\r
-                       if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {\r
-                               $packages++;\r
-                       }\r
-               }\r
-               $tar->close();\r
-               \r
-               // calculate part of total install\r
-               $part = 100 / $packages;\r
-               \r
-               // calculate progress\r
-               $progress = round($part / 11 * $currentStep, 0);\r
-               self::getTPL()->assign(array('progress' => $progress));\r
-       }\r
-       \r
-       /**\r
-        * Executes the setup steps.\r
-        */\r
-       protected function setup() {\r
-               // get current step\r
-               if (isset($_REQUEST['step'])) $step = $_REQUEST['step'];\r
-               else $step = 'selectSetupLanguage';\r
-\r
-               // execute current step\r
-               switch ($step) {\r
-                       case 'selectSetupLanguage':\r
-                               if (!self::$developerMode) {\r
-                                       $this->calcProgress(0);\r
-                                       $this->selectSetupLanguage();\r
-                                       break;\r
-                               }\r
-                               \r
-                       case 'showLicense':\r
-                               if (!self::$developerMode) {\r
-                                       $this->calcProgress(1);\r
-                                       $this->showLicense();\r
-                                       break;\r
-                               }\r
-                               \r
-                       case 'showSystemRequirements':\r
-                               if (!self::$developerMode) {\r
-                                       $this->calcProgress(2);\r
-                                       $this->showSystemRequirements();\r
-                                       break;\r
-                               }\r
-                               \r
-                       case 'searchWcfDir':\r
-                               $this->calcProgress(3);\r
-                               $this->searchWcfDir();\r
-                               break;\r
-                               \r
-                       case 'unzipFiles':\r
-                               $this->calcProgress(4);\r
-                               $this->unzipFiles();\r
-                               break;\r
-                               \r
-                       case 'selectLanguages':\r
-                               $this->calcProgress(5);\r
-                               $this->selectLanguages();\r
-                               break;\r
-                               \r
-                       case 'configureDB':\r
-                               $this->calcProgress(6);\r
-                               $this->configureDB();\r
-                               break;\r
-                               \r
-                       case 'createDB':\r
-                               $this->calcProgress(7);\r
-                               $this->createDB();\r
-                               break;\r
-                               \r
-                       case 'logFiles':\r
-                               $this->calcProgress(8);\r
-                               $this->logFiles();\r
-                               break;\r
-                               \r
-                       case 'installLanguage':\r
-                               $this->calcProgress(9);\r
-                               $this->installLanguage();\r
-                               break;\r
-                               \r
-                       case 'createUser':\r
-                               $this->calcProgress(10);\r
-                               $this->createUser();\r
-                               break;\r
-                               \r
-                       case 'installPackages':\r
-                               $this->calcProgress(11);\r
-                               $this->installPackages();\r
-                               break;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Shows the first setup page.\r
-        */\r
-       protected function selectSetupLanguage() {\r
-               // build language list\r
-               $languages = array();\r
-               foreach (self::$availableLanguages as $languageCode) {\r
-                       $languages[$languageCode] = self::getLanguage()->get('wcf.global.language.'.$languageCode).' ('.$languageCode.')';\r
-               }\r
-               \r
-               // sort languages\r
-               StringUtil::sort($languages);\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'availableLanguages' => $languages,\r
-                       'nextStep' => 'showLicense'\r
-               ));\r
-               WCF::getTPL()->display('stepSelectSetupLanguage');\r
-       }\r
-       \r
-       /**\r
-        * Shows the license agreement.\r
-        */\r
-       protected function showLicense() {\r
-               if (isset($_POST['send'])) {\r
-                       if (isset($_POST['accepted'])) {\r
-                               $this->gotoNextStep('showSystemRequirements');\r
-                               exit;\r
-                       }\r
-                       else {\r
-                               WCF::getTPL()->assign(array('missingAcception' => true));\r
-                       }\r
-               \r
-               }\r
-               \r
-               if (file_exists(TMP_DIR.'setup/license/license_'.self::$selectedLanguageCode.'.txt')) {\r
-                       $license = file_get_contents(TMP_DIR.'setup/license/license_'.self::$selectedLanguageCode.'.txt');\r
-               }\r
-               else {\r
-                       $license = file_get_contents(TMP_DIR.'setup/license/license_en.txt');\r
-               }\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'license' => $license,\r
-                       'nextStep' => 'showLicense'\r
-               ));\r
-               WCF::getTPL()->display('stepShowLicense');\r
-       }\r
-       \r
-       /**\r
-        * Shows the system requirements.\r
-        */\r
-       protected function showSystemRequirements() {\r
-               $system = array();\r
-               \r
-               // php version\r
-               $system['phpVersion']['value'] = phpversion();\r
-               $comparePhpVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $system['phpVersion']['value']);\r
-               $system['phpVersion']['result'] = (version_compare($comparePhpVersion, '5.3.0') >= 0);\r
-               \r
-               // sql\r
-               $system['sql']['value'] = array_keys(self::getAvailableDBClasses());\r
-               $system['sql']['result'] = count($system['sql']['value'] > 0);\r
-               \r
-               // upload_max_filesize\r
-               $system['uploadMaxFilesize']['value'] = ini_get('upload_max_filesize');\r
-               $system['uploadMaxFilesize']['result'] = (intval($system['uploadMaxFilesize']['value']) > 0);\r
-               \r
-               // gdlib version\r
-               $system['gdLib']['value'] = '0.0.0';\r
-               if (function_exists('gd_info')) {\r
-                       $temp = gd_info();\r
-                       $match = array();\r
-                       if (preg_match('!([0-9]+\.[0-9]+(?:\.[0-9]+)?)!', $temp['GD Version'], $match)) {\r
-                               if (preg_match('/^[0-9]+\.[0-9]+$/', $match[1])) $match[1] .= '.0';\r
-                               $system['gdLib']['value'] = $match[1];\r
-                       }\r
-               }\r
-               $system['gdLib']['result'] = (version_compare($system['gdLib']['value'], '2.0.0') >= 0);\r
-               \r
-               // mb string\r
-               $system['mbString']['result'] = extension_loaded('mbstring');\r
-               \r
-               // safe mode\r
-               $system['safeMode']['result'] = (FileUtil::getSafeMode() != 1);\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'system' => $system,\r
-                       'nextStep' => 'searchWcfDir'\r
-               ));\r
-               WCF::getTPL()->display('stepShowSystemRequirements');\r
-       }\r
-       \r
-       /**\r
-        * Searches the wcf dir.\r
-        */\r
-       protected function searchWcfDir() {\r
-               $foundDirectory = '';\r
-               if (self::$wcfDir) {\r
-                       $wcfDir = self::$wcfDir;\r
-               }\r
-               else {\r
-                       if ($foundDirectory = FileUtil::scanFolder(INSTALL_SCRIPT_DIR, "WCF.class.php", true)) {\r
-                               $foundDirectory = $wcfDir = FileUtil::unifyDirSeperator(dirname(dirname(dirname($foundDirectory))).'/');\r
-                               \r
-                               if (dirname(dirname($wcfDir)).'/' == TMP_DIR) {\r
-                                       $foundDirectory = false;\r
-                                       $wcfDir = FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR).'wcf/';\r
-                               }\r
-                       }\r
-                       else {\r
-                               $wcfDir = FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR).'wcf/';\r
-                       }\r
-               }\r
-               \r
-               // domain\r
-               $domainName = '';\r
-               if (!empty($_SERVER['SERVER_NAME'])) $domainName = 'http://' . $_SERVER['SERVER_NAME'];\r
-               // port\r
-               if (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] != 80) $domainName .= ':' . $_SERVER['SERVER_PORT'];\r
-               // script url\r
-               $installScriptUrl = '';\r
-               if (!empty($_SERVER['REQUEST_URI'])) $installScriptUrl = FileUtil::removeLeadingSlash(FileUtil::removeTrailingSlash(FileUtil::unifyDirSeperator(dirname($_SERVER['REQUEST_URI']))));\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'nextStep' => 'unzipFiles',\r
-                       'foundDirectory' => $foundDirectory,\r
-                       'wcfDir' => $wcfDir,\r
-                       'domainName' => $domainName,\r
-                       'installScriptUrl' => $installScriptUrl,\r
-                       'installScriptDir' => FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR)\r
-               ));\r
-               \r
-               WCF::getTPL()->display('stepSearchWcfDir');\r
-       }\r
-       \r
-       /**\r
-        * Unzips the files of the wcfsetup tar archive.\r
-        */\r
-       protected function unzipFiles() {\r
-               // WCF seems to be installed, skip installation of\r
-               // files, database and admin account\r
-               // and go directly to the installation of packages\r
-               if (@is_file(self::$wcfDir.'lib/system/WCF.class.php')) {\r
-                       $this->gotoNextStep('installPackages');\r
-                       exit;\r
-               }\r
-               // WCF not yet installed, install files first\r
-               else {\r
-                       try {\r
-                               $this->installFiles();\r
-                       }\r
-                       catch (Exception $e) {\r
-                               WCF::getTPL()->assign(array('exception' => $e));\r
-                               $this->searchWcfDir();\r
-                               return;\r
-                       }\r
-                       \r
-                       $this->gotoNextStep('selectLanguages');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Shows the page for choosing the installed languages.\r
-        */\r
-       protected function selectLanguages() {\r
-               $errorField = $errorType = '';\r
-               $allLanguages = $this->getAllLanguages();\r
-               $illegalLanguages = array();\r
-               \r
-               // build visible language list\r
-               $languages = array();\r
-               foreach ($allLanguages as $languageCode) {\r
-                       $languages[$languageCode] = self::getLanguage()->get('wcf.global.language.'.$languageCode).' ('.$languageCode.')';\r
-               }\r
-               \r
-               // skip step in developer mode\r
-               // select all available languages automatically\r
-               if (self::$developerMode) {\r
-                       self::$selectedLanguages = array();\r
-                       foreach ($allLanguages as $languageCode) {\r
-                               self::$selectedLanguages[] = $languageCode;\r
-                       }\r
-                       \r
-                       self::getTPL()->assign(array('selectedLanguages' => self::$selectedLanguages));\r
-                       $this->gotoNextStep('configureDB');\r
-                       exit;\r
-               }\r
-               \r
-               // sort languages\r
-               StringUtil::sort($languages);\r
-               \r
-               // start error handling\r
-               if (isset($_POST['send'])) {\r
-                       try {\r
-                               // no languages selected\r
-                               if (count(self::$selectedLanguages) == 0) {\r
-                                       throw new UserInputException('selectedLanguages');\r
-                               }\r
-                               \r
-                               // illegal selection\r
-                               foreach (self::$selectedLanguages as $language) {\r
-                                       if (!isset($languages[$language])) {\r
-                                               throw new UserInputException('selectedLanguages');\r
-                                       }\r
-                               }\r
-                               \r
-                               // no errors\r
-                               // go to next step\r
-                               $this->gotoNextStep('configureDB');\r
-                               exit;\r
-                       }\r
-                       catch (UserInputException $e) {\r
-                               $errorField = $e->getField();\r
-                               $errorType = $e->getType();\r
-                       }\r
-               }\r
-               else {\r
-                       self::$selectedLanguages[] = self::$selectedLanguageCode;\r
-                       WCF::getTPL()->assign(array('selectedLanguages' => self::$selectedLanguages));\r
-               }\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'errorField' => $errorField,\r
-                       'errorType' => $errorType,\r
-                       'languages' => $languages,\r
-                       'nextStep' => 'selectLanguages'\r
-               ));\r
-               WCF::getTPL()->display('stepSelectLanguages');\r
-       }\r
-       \r
-       /**\r
-        * Shows the page for configurating the database connection.\r
-        */\r
-       protected function configureDB() {\r
-               $availableDBClasses = self::getAvailableDBClasses();\r
-               $dbHost = 'localhost';\r
-               $dbUser = 'root';\r
-               $dbPassword = '';\r
-               $dbName = 'wcf';\r
-               $dbNumber = '1';\r
-               $dbClass = 'MySQLDatabase';\r
-               if (!function_exists('mysql_connect')) $dbClass = 'MySQLiDatabase';\r
-               $overwriteTables = false;\r
-               \r
-               if (isset($_POST['send'])) {\r
-                       if (isset($_POST['dbHost'])) $dbHost = $_POST['dbHost'];\r
-                       if (isset($_POST['dbUser'])) $dbUser = $_POST['dbUser'];\r
-                       if (isset($_POST['dbPassword'])) $dbPassword = $_POST['dbPassword'];\r
-                       if (isset($_POST['dbName'])) $dbName = $_POST['dbName'];\r
-                       if (isset($_POST['overwriteTables'])) $overwriteTables = intval($_POST['overwriteTables']);\r
-                       // Should the user not be prompted if converted or default n match an\r
-                       // existing installation number? By now the existing installation\r
-                       // will be overwritten just so!\r
-                       if (isset($_POST['dbNumber'])) $dbNumber = intval($_POST['dbNumber']);\r
-                       if (isset($_POST['dbClass'])) $dbClass = $_POST['dbClass'];\r
-                       \r
-                       // get port\r
-                       $dbPort = 0;\r
-                       if (preg_match('/^(.+?):(\d+)$/', $dbHost, $match)) {\r
-                               $dbHost = $match[1];\r
-                               $dbPort = intval($match[2]);\r
-                       }\r
-                       \r
-                       // test connection\r
-                       try {\r
-                               // check db class\r
-                               $validDB = false;\r
-                               foreach ($availableDBClasses as $dbData) {\r
-                                       if ($dbData['class'] == $dbClass) {\r
-                                               $validDB = true;\r
-                                               break;\r
-                                       }\r
-                               }\r
-                               \r
-                               if (!$validDB) {\r
-                                       throw new SystemException("Database type '".$dbClass."'. is not available on this system.");\r
-                               }\r
-                               \r
-                               // check connection data\r
-                               $db = new $dbClass($dbHost, $dbUser, $dbPassword, $dbName, $dbPort);\r
-                               $db->connect();\r
-                               \r
-                               // check sql version\r
-                               if (!empty($availableDBClasses[$dbClass]['minversion'])) {\r
-                                       $sqlVersion = $db->getVersion();\r
-                                       if ($sqlVersion != 'unknown') {\r
-                                               $compareSQLVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $sqlVersion);\r
-                                               if (!(version_compare($compareSQLVersion, $availableDBClasses[$dbClass]['minversion']) >= 0)) {\r
-                                                       throw new SystemException("Insufficient SQL version '".$compareSQLVersion."'. Version '".$availableDBClasses[$dbClass]['minversion']."' or greater is needed.");\r
-                                               }\r
-                                       }\r
-                               }\r
-                               \r
-                               // check for table conflicts\r
-                               $conflictedTables = $this->getConflictedTables($db, $dbNumber);\r
-                               \r
-                               // write config.inc\r
-                               if (empty($conflictedTables) || $overwriteTables || self::$developerMode) {\r
-                                       // connection successfully established\r
-                                       // write configuration to config.inc.php\r
-                                       $file = new File(WCF_DIR.'config.inc.php');\r
-                                       $file->write("<?php\n");\r
-                                       $file->write("\$dbHost = '".StringUtil::replace("'", "\\'", $dbHost)."';\n");\r
-                                       $file->write("\$dbPort = ".$dbPort.";\n");\r
-                                       $file->write("\$dbUser = '".StringUtil::replace("'", "\\'", $dbUser)."';\n");\r
-                                       $file->write("\$dbPassword = '".StringUtil::replace("'", "\\'", $dbPassword)."';\n");\r
-                                       $file->write("\$dbName = '".StringUtil::replace("'", "\\'", $dbName)."';\n");\r
-                                       $file->write("\$dbClass = '".StringUtil::replace("'", "\\'", $dbClass)."';\n");\r
-                                       $file->write("if (!defined('WCF_N')) define('WCF_N', $dbNumber);\n?>");\r
-                                       $file->close();\r
-                               \r
-                                       // go to next step\r
-                                       $this->gotoNextStep('createDB');\r
-                                       exit;\r
-                               }\r
-                               // show configure temnplate again\r
-                               else {\r
-                                       WCF::getTPL()->assign(array('conflictedTables' => $conflictedTables));\r
-                               }\r
-                       }\r
-                       catch (SystemException $e) {\r
-                               WCF::getTPL()->assign(array('exception' => $e));\r
-                       }\r
-               }\r
-               WCF::getTPL()->assign(array(\r
-                       'dbHost' => $dbHost,\r
-                       'dbUser' => $dbUser,\r
-                       'dbPassword' => $dbPassword,\r
-                       'dbName' => $dbName,\r
-                       'dbNumber' => $dbNumber,\r
-                       'dbClass' => $dbClass,\r
-                       'availableDBClasses' => $availableDBClasses,\r
-                       'nextStep' => 'configureDB'\r
-               ));\r
-               WCF::getTPL()->display('stepConfigureDB');\r
-       }\r
-       \r
-       \r
-       /**\r
-        * Checks if in the chosen database are tables in conflict with the wcf tables\r
-        * which will be created in the next step.\r
-        *\r
-        * @param       Database        $db\r
-        * @param       integer         $dbNumber\r
-        */\r
-       protected function getConflictedTables($db, $dbNumber) {\r
-               // get content of the sql structure file\r
-               $sql = file_get_contents(TMP_DIR.'setup/db/install.sql');\r
-               \r
-               // installation number value 'n' (WCF_N) must be reflected in the executed sql queries\r
-               $sql = StringUtil::replace('wcf1_', 'wcf'.$dbNumber.'_', $sql);\r
-               \r
-               // get all tablenames which should be created\r
-               preg_match_all("%CREATE\s+TABLE\s+(\w+)%", $sql, $matches);\r
-               \r
-               // get all installed tables from chosen database\r
-               $existingTables = $db->getEditor()->getTableNames();\r
-               \r
-               // check if existing tables are in conflict with wcf tables\r
-               $conflictedTables = array();\r
-               foreach ($existingTables as $existingTableName) {\r
-                       foreach ($matches[1] as $wcfTableName) {\r
-                               if ($existingTableName == $wcfTableName) {\r
-                                       $conflictedTables[] = $wcfTableName;\r
-                               }\r
-                       }\r
-               }\r
-               return $conflictedTables;\r
-       }\r
-       \r
-       /**\r
-        * Creates the database structure of the wcf.\r
-        */\r
-       protected function createDB() {\r
-               $this->initDB();\r
-               \r
-               // get content of the sql structure file\r
-               $sql = file_get_contents(TMP_DIR.'setup/db/install.sql');\r
-               \r
-               // installation number value 'n' (WCF_N) must be reflected in the executed sql queries\r
-               $sql = StringUtil::replace('wcf1_', 'wcf'.WCF_N.'_', $sql);\r
-               \r
-               // execute sql queries\r
-               $parser = new SQLParser($sql);\r
-               $parser->execute();\r
-               \r
-               // log sql queries\r
-               preg_match_all("~CREATE\s+TABLE\s+(\w+)~i", $sql, $matches);\r
-               \r
-               if (count($matches[1])) {\r
-                       $sql = "INSERT INTO     wcf".WCF_N."_package_installation_sql_log\r
-                                               (sqlTable)\r
-                               VALUES          (?)";\r
-                       $statement = self::getDB()->prepareStatement($sql);\r
-                       foreach ($matches[1] as $tableName) {\r
-                               $statement->execute(array($tableName));\r
-                       }\r
-               }\r
-               \r
-               /*\r
-                * Manually install PIPPackageInstallationPlugin since install.sql content is not escaped resulting\r
-                * in different behaviour in MySQL and MSSQL. You SHOULD NOT move this into install.sql!\r
-                */\r
-               $sql = "INSERT INTO     wcf".WCF_N."_package_installation_plugin\r
-                                       (pluginName, priority, className)\r
-                       VALUES          (?, ?, ?)";\r
-               $statement = self::getDB()->prepareStatement($sql);\r
-               $statement->execute(array(\r
-                       'packageinstallationplugins',\r
-                       1,\r
-                       'wcf\system\package\plugin\PIPPackageInstallationPlugin'\r
-               ));\r
-               \r
-               $this->gotoNextStep('logFiles');\r
-       }\r
-       \r
-       /**\r
-        * Logs the unzipped files.\r
-        */\r
-       protected function logFiles() {\r
-               $this->initDB();\r
-               \r
-               $this->getInstalledFiles(WCF_DIR);\r
-               $acpTemplateInserts = $fileInserts = array();\r
-               foreach (self::$installedFiles as $file) {\r
-                       $match = array();\r
-                       if (preg_match('!/acp/templates/([^/]+)\.tpl$!', $file, $match)) {\r
-                               // acp template\r
-                               $acpTemplateInserts[] = $match[1];\r
-                       }\r
-                       else {\r
-                               // regular file\r
-                               $fileInserts[] = StringUtil::replace(WCF_DIR, '', $file);\r
-                       }\r
-               }\r
-               \r
-               // save acp template log\r
-               if (!empty($acpTemplateInserts)) {\r
-                       $sql = "INSERT INTO     wcf".WCF_N."_acp_template\r
-                                               (templateName)\r
-                               VALUES          (?)";\r
-                       $statement = self::getDB()->prepareStatement($sql);\r
-                       \r
-                       foreach ($acpTemplateInserts as $acpTemplate) {\r
-                               $statement->execute(array($acpTemplate));\r
-                       }\r
-               }\r
-               \r
-               // save file log\r
-               if (!empty($fileInserts)) {\r
-                       $sql = "INSERT INTO     wcf".WCF_N."_package_installation_file_log\r
-                                               (filename)\r
-                               VALUES          (?)";\r
-                       $statement = self::getDB()->prepareStatement($sql);\r
-                       \r
-                       foreach ($fileInserts as $file) {\r
-                               $statement->execute(array($file));\r
-                       }\r
-               }\r
-               \r
-               $this->gotoNextStep('installLanguage');\r
-       }\r
-       \r
-       /**\r
-        * Scans the given dir for installed files.\r
-        *\r
-        * @param       string          $dir\r
-        */\r
-       protected function getInstalledFiles($dir) {\r
-               if ($files = glob($dir.'*')) {\r
-                       foreach ($files as $file) {\r
-                               if (is_dir($file)) {\r
-                                       $this->getInstalledFiles(FileUtil::addTrailingSlash($file));\r
-                               }\r
-                               else {\r
-                                       self::$installedFiles[] = FileUtil::unifyDirSeperator($file);\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Installs the selected languages.\r
-        */\r
-       protected function installLanguage() {\r
-               $this->initDB();\r
-               \r
-               foreach (self::$selectedLanguages as $language) {\r
-                       // get language.xml file name\r
-                       $filename = TMP_DIR.'install/lang/'.$language.'.xml';\r
-                       \r
-                       // check the file\r
-                       if (!file_exists($filename)) {\r
-                               throw new SystemException("unable to find language file '".$filename."'", 11002);\r
-                       }\r
-                       \r
-                       // open the file\r
-                       $xml = new XML();\r
-                       $xml->load($filename);\r
-                       \r
-                       // import xml\r
-                       LanguageEditor::importFromXML($xml, 0);\r
-               }\r
-               \r
-               // set default language\r
-               $language = LanguageFactory::getLanguageByCode(in_array(self::$selectedLanguageCode, self::$selectedLanguages) ? self::$selectedLanguageCode : self::$selectedLanguages[0]);\r
-               LanguageFactory::makeDefault($language->languageID);\r
-               \r
-               // assign all languages to package id 0\r
-               $sql = "SELECT  languageID\r
-                       FROM    wcf".WCF_N."_language";\r
-               $statement = self::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               $languages = array();\r
-               while ($row = $statement->fetchArray()) {\r
-                       $languages[] = $row['languageID'];\r
-               }\r
-               \r
-               if (count($languages) > 0) {\r
-                       $sql = "INSERT INTO     wcf".WCF_N."_language_to_package\r
-                                               (languageID)\r
-                               VALUES          (?)";\r
-                       $statement = self::getDB()->prepareStatement($sql);\r
-                       \r
-                       foreach ($languages as $languageID) {\r
-                               $statement->execute(array(\r
-                                       $languageID\r
-                               ));\r
-                       }\r
-               }\r
-               \r
-               // rebuild language cache\r
-               CacheHandler::getInstance()->clearResource('languages');\r
-               \r
-               // go to next step\r
-               $this->gotoNextStep('createUser');\r
-       }\r
-       \r
-       /**\r
-        * Shows the page for creating the admin account.\r
-        */\r
-       protected function createUser() {\r
-               $errorType = $errorField = $username = $email = $confirmEmail = $password = $confirmPassword = '';\r
-               \r
-               $username = '';\r
-               $email = $confirmEmail = '';\r
-               $password = $confirmPassword = '';\r
-               \r
-               if (isset($_POST['send']) || self::$developerMode) {\r
-                       if (isset($_POST['send'])) {\r
-                               if (isset($_POST['username']))          $username = StringUtil::trim($_POST['username']);\r
-                               if (isset($_POST['email']))             $email = StringUtil::trim($_POST['email']);\r
-                               if (isset($_POST['confirmEmail']))      $confirmEmail = StringUtil::trim($_POST['confirmEmail']);\r
-                               if (isset($_POST['password']))          $password = $_POST['password'];\r
-                               if (isset($_POST['confirmPassword']))   $confirmPassword = $_POST['confirmPassword'];\r
-                       }\r
-                       else {\r
-                               $username = $password = $confirmPassword = 'root';\r
-                               $email = $confirmEmail = 'woltlab@woltlab.com';\r
-                       }\r
-                       \r
-                       // error handling\r
-                       try {\r
-                               // username\r
-                               if (empty($username)) {\r
-                                       throw new UserInputException('username');\r
-                               }\r
-                               if (!UserUtil::isValidUsername($username)) {\r
-                                       throw new UserInputException('username', 'notValid');\r
-                               }\r
-                               \r
-                               // e-mail address\r
-                               if (empty($email)) {\r
-                                       throw new UserInputException('email');\r
-                               }\r
-                               if (!UserUtil::isValidEmail($email)) {\r
-                                       throw new UserInputException('email', 'notValid');\r
-                               }\r
-                               \r
-                               // confirm e-mail address\r
-                               if ($email != $confirmEmail) {\r
-                                       throw new UserInputException('confirmEmail', 'notEqual');\r
-                               }\r
-                               \r
-                               // password\r
-                               if (empty($password)) {\r
-                                       throw new UserInputException('password');\r
-                               }\r
-                               \r
-                               // confirm e-mail address\r
-                               if ($password != $confirmPassword) {\r
-                                       throw new UserInputException('confirmPassword', 'notEqual');\r
-                               }\r
-                               \r
-                               // no errors\r
-                               // init database connection\r
-                               $this->initDB();\r
-                               \r
-                               // get language id\r
-                               $languageID = 0;\r
-                               $sql = "SELECT  languageID\r
-                                       FROM    wcf".WCF_N."_language\r
-                                       WHERE   languageCode = ?";\r
-                               $statement = self::getDB()->prepareStatement($sql);\r
-                               $statement->execute(array(self::$selectedLanguageCode));\r
-                               $row = $statement->fetchArray();\r
-                               if (isset($row['languageID'])) $languageID = $row['languageID'];\r
-                               \r
-                               // create user\r
-                               $data = array(\r
-                                       'data' => array(\r
-                                               'email' => $email,\r
-                                               'languageID' => $languageID,\r
-                                               'password' => $password,\r
-                                               'username' => $username\r
-                                       ),\r
-                                       'groups' => array(\r
-                                               1,\r
-                                               3,\r
-                                               4\r
-                                       ),\r
-                                       'languages' => array(\r
-                                               $languageID\r
-                                       )\r
-                               );\r
-                               \r
-                               $userAction = new UserAction(array(), 'create', $data);\r
-                               $userAction->executeAction();\r
-                               \r
-                               // go to next step\r
-                               $this->gotoNextStep('installPackages');\r
-                               exit;\r
-                       }\r
-                       catch (UserInputException $e) {\r
-                               $errorField = $e->getField();\r
-                               $errorType = $e->getType();\r
-                       }\r
-               }\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'errorField' => $errorField,\r
-                       'errorType' => $errorType,\r
-                       'username' => $username,\r
-                       'email' => $email,\r
-                       'confirmEmail' => $confirmEmail,\r
-                       'password' => $password,\r
-                       'confirmPassword' => $confirmPassword,\r
-                       'nextStep' => 'createUser'\r
-               ));\r
-               WCF::getTPL()->display('stepCreateUser');\r
-       }\r
-       \r
-       /**\r
-        * Registers with wcf setup delivered packages in the package installation queue.\r
-        */\r
-       protected function installPackages() {\r
-               // init database connection\r
-               $this->initDB();\r
-               \r
-               // get admin account\r
-               $admin = new User(1);\r
-               \r
-               // get delivered packages\r
-               $wcfPackageFile = '';\r
-               $otherPackages = array();\r
-               $tar = new Tar(SETUP_FILE);\r
-               foreach ($tar->getContentList() as $file) {\r
-                       if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {\r
-                               $packageFile = basename($file['filename']);\r
-                               $packageName = preg_replace('!\.(tar\.gz|tgz|tar)$!', '', $packageFile);\r
-                               \r
-                               if ($packageName == 'com.woltlab.wcf') {\r
-                                       $wcfPackageFile = $packageFile;\r
-                               }\r
-                               else {\r
-                                       $isStrato = (!empty($_SERVER['DOCUMENT_ROOT']) && (strpos($_SERVER['DOCUMENT_ROOT'], 'strato') !== false));\r
-                                       if (!$isStrato && preg_match('!\.(tar\.gz|tgz)$!', $packageFile)) {\r
-                                               // try to unzip zipped package files\r
-                                               if (FileUtil::uncompressFile(TMP_DIR.'install/packages/'.$packageFile, TMP_DIR.'install/packages/'.$packageName.'.tar')) {\r
-                                                       @unlink(TMP_DIR.'install/packages/'.$packageFile);\r
-                                                       $packageFile = $packageName.'.tar';\r
-                                               }\r
-                                       }\r
-                                       \r
-                                       $otherPackages[$packageName] = $packageFile;\r
-                               }\r
-                       }\r
-               }\r
-               $tar->close();\r
-               \r
-               // register packages in queue\r
-               // get new process id\r
-               $sql = "SELECT  MAX(processNo) AS processNo\r
-                       FROM    wcf".WCF_N."_package_installation_queue";\r
-               $statement = self::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               $result = $statement->fetchArray();\r
-               $processNo = intval($result['processNo']) + 1;\r
-               $statementParameters = array();\r
-               \r
-               // search existing wcf package\r
-               $sql = "SELECT  COUNT(*) AS count\r
-                       FROM    wcf".WCF_N."_package\r
-                       WHERE   package = 'com.woltlab.wcf'";\r
-               $statement = self::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               $row = $statement->fetchArray();\r
-               if (!$row['count']) {\r
-                       if (empty($wcfPackageFile)) {\r
-                               throw new SystemException('the essential package com.woltlab.wcf is missing.', 11007);\r
-                       }\r
-                       \r
-                       // register essential wcf package\r
-                       $statementParameters[] = array(\r
-                               'packageName' => 'com.woltlab.wcf',\r
-                               'archive' => TMP_DIR.'install/packages/'.$wcfPackageFile\r
-                       );\r
-               }\r
-               \r
-               // register all other delivered packages\r
-               asort($otherPackages);\r
-               foreach ($otherPackages as $packageName => $packageFile) {\r
-                       $statementParameters[] = array(\r
-                               'packageName' => $packageName,\r
-                               'archive' => TMP_DIR.'install/packages/'.$packageFile\r
-                       );\r
-               }\r
-               \r
-               if (!empty($statementParameters)) {\r
-                       $sql = "INSERT INTO     wcf".WCF_N."_package_installation_queue\r
-                                               (processNo, userID, package, archive)\r
-                               VALUES          (?, ?, ?, ?)";\r
-                       $statement = self::getDB()->prepareStatement($sql);\r
-                       \r
-                       foreach ($statementParameters as $parameter) {\r
-                               $statement->execute(array(\r
-                                       $processNo,\r
-                                       $admin->userID,\r
-                                       $parameter['packageName'],\r
-                                       $parameter['archive']\r
-                               ));\r
-                       }\r
-               }\r
-               \r
-               // login as admin\r
-               $factory = new ACPSessionFactory();\r
-               $factory->load();\r
-               \r
-               SessionHandler::getInstance()->changeUser($admin);\r
-               SessionHandler::getInstance()->register('masterPassword', 1);\r
-               SessionHandler::getInstance()->update();\r
-               \r
-               // TODO: print message if delete fails\r
-               $installPhpDeleted = @unlink('./install.php');\r
-               $testPhpDeleted = @unlink('./test.php');\r
-               $wcfSetupTarDeleted = @unlink('./WCFSetup.tar.gz');\r
-               \r
-               // print page\r
-               WCF::getTPL()->assign(array(\r
-                       'installPhpDeleted' => $installPhpDeleted,\r
-                       'wcfSetupTarDeleted' => $wcfSetupTarDeleted\r
-               ));\r
-               WCF::getTPL()->display('stepInstallPackages');\r
-               \r
-               // delete tmp files\r
-               $directory = TMP_DIR.TMP_FILE_PREFIX.'/';\r
-               $it = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory));\r
-               while ($it->valid()) {\r
-                       // delete all files except directories and packages (required for post-wcfsetup installation)\r
-                       if (!$it->isDot() && !$it->isDir() && !preg_match('~\.tar(\.gz)?$~', $it->getSubPathName())) {\r
-                               @unlink($it->key());\r
-                       }\r
-                       \r
-                       $it->next();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Goes to the next step.\r
-        *\r
-        * @param       string          $nextStep\r
-        */\r
-       protected function gotoNextStep($nextStep) {\r
-               WCF::getTPL()->assign(array('nextStep' => $nextStep));\r
-               WCF::getTPL()->display('stepNext');\r
-       }\r
-       \r
-       /**\r
-        * Installs the files of the tar archive.\r
-        */\r
-       protected static function installFiles() {\r
-               new Installer(self::$wcfDir, SETUP_FILE, null, 'install/files/');\r
-       }\r
-       \r
-       /**\r
-        * Gets the package name of the first standalone application in WCFSetup.tar.gz.\r
-        */\r
-       protected static function getPackageName() {\r
-               // get package name\r
-               $tar = new Tar(SETUP_FILE);\r
-               foreach ($tar->getContentList() as $file) {\r
-                       if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {\r
-                               $packageFile = basename($file['filename']);\r
-                               $packageName = preg_replace('!\.(tar\.gz|tgz|tar)$!', '', $packageFile);\r
-                               \r
-                               if ($packageName != 'com.woltlab.wcf') {\r
-                                       try {\r
-                                               $archive = new PackageArchive(TMP_DIR.'install/packages/'.$packageFile);\r
-                                               $archive->openArchive();\r
-                                               self::$setupPackageName = $archive->getPackageInfo('packageName');\r
-                                               $archive->getTar()->close();\r
-                                               break;\r
-                                       }\r
-                                       catch (SystemException $e) {}\r
-                               }\r
-                       }\r
-               }\r
-               $tar->close();\r
-               \r
-               // assign package name\r
-               WCF::getTPL()->assign(array('setupPackageName' => self::$setupPackageName));\r
-       }\r
-}\r
+<?php
+namespace wcf\system;
+use wcf\data\language\LanguageEditor;
+use wcf\data\language\SetupLanguage;
+use wcf\data\user\User;
+use wcf\data\user\UserAction;
+use wcf\system\cache\CacheHandler;
+use wcf\system\database\util\SQLParser;
+use wcf\system\exception\SystemException;
+use wcf\system\io\File;
+use wcf\system\io\Tar;
+use wcf\system\language\LanguageFactory;
+use wcf\system\package\PackageArchive;
+use wcf\system\session\ACPSessionFactory;
+use wcf\system\session\SessionHandler;
+use wcf\system\setup\Installer;
+use wcf\system\template\SetupTemplateEngine;
+use wcf\system\WCF;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+use wcf\util\UserUtil;
+use wcf\util\XML;
+
+// define
+define('PACKAGE_ID', '0');
+define('HTTP_ENABLE_NO_CACHE_HEADERS', 0);
+define('HTTP_ENABLE_GZIP', 0);
+define('HTTP_GZIP_LEVEL', 0);
+define('CACHE_SOURCE_TYPE', 'disk');
+define('ENABLE_SESSION_DATA_CACHE', 0);
+define('MODULE_MASTER_PASSWORD', 1);
+
+/**
+ * WCFSetup executes the installation of the basic wcf systems.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system
+ * @category   Community Framework
+ */
+class WCFSetup extends WCF {
+       protected static $availableLanguages = array();
+       protected static $selectedLanguageCode = 'en';
+       protected static $selectedLanguages = array();
+       protected static $wcfDir = '';
+       protected static $installedFiles = array();
+       protected static $setupPackageName = 'WoltLab Community Framework';
+       protected static $developerMode = 0;
+       protected static $dbClasses = array(
+               'MySQLDatabase' => array('class' => 'wcf\system\database\MySQLDatabase', 'minversion' => '5.1.17'),     // MySQL 5.0.0+
+               'PostgreSQLDatabase' => array('class' => 'wcf\system\database\PostgreSQLDatabase', 'minversion' => '8.2.0')     // PostgreSQL 8.2.0+
+       );
+       
+       /**
+        * Calls all init functions of the WCFSetup class and starts the setup process.
+        */
+       public function __construct() {
+               @set_time_limit(0);
+               $this->initMagicQuotes();
+               $this->getDeveloperMode();
+               $this->getLanguageSelection();
+               $this->getWCFDir();
+               $this->initLanguage();
+               $this->initTPL();
+               self::getLanguage()->loadLanguage();
+               $this->getPackageName();
+               
+               // start setup
+               $this->setup();
+       }
+       
+       /**
+        * Gets the status of the developer mode.
+        */
+       protected static function getDeveloperMode() {
+               if (isset($_GET['dev'])) self::$developerMode = intval($_GET['dev']);
+               else if (isset($_POST['dev'])) self::$developerMode = intval($_POST['dev']);
+       }
+       
+       /**
+        * Gets the selected language.
+        */
+       protected static function getLanguageSelection() {
+               self::$availableLanguages = self::getAllLanguages();
+               
+               if (isset($_REQUEST['languageCode']) && in_array($_REQUEST['languageCode'], self::$availableLanguages)) {
+                       self::$selectedLanguageCode = $_REQUEST['languageCode'];
+               }
+               else {
+                       self::$selectedLanguageCode = LanguageFactory::getPreferredLanguage(self::$availableLanguages, self::$selectedLanguageCode);
+               }
+               
+               if (isset($_POST['selectedLanguages']) && is_array($_POST['selectedLanguages'])) {
+                       self::$selectedLanguages = $_POST['selectedLanguages'];
+               }
+       }
+       
+       /**
+        * Gets the available database classes.
+        *
+        * @return      array
+        */
+       protected static function getAvailableDBClasses() {
+               $availableDBClasses = array();
+               foreach (self::$dbClasses as $class => $data) {
+                       if (call_user_func(array($data['class'], 'isSupported'))) {
+                               $availableDBClasses[$class] = $data;
+                       }
+               }
+               
+               return $availableDBClasses;
+       }
+
+       /**
+        * Gets the selected wcf dir from request.
+        */
+       protected static function getWCFDir() {
+               if (isset($_REQUEST['wcfDir']) && $_REQUEST['wcfDir'] != '') {
+                       self::$wcfDir = FileUtil::addTrailingSlash(FileUtil::unifyDirSeperator($_REQUEST['wcfDir']));
+                       if (@file_exists(self::$wcfDir)) {
+                               define('RELATIVE_WCF_DIR', FileUtil::getRelativePath(INSTALL_SCRIPT_DIR, self::$wcfDir));
+                       }
+               }
+               
+               define('WCF_DIR', self::$wcfDir);
+       }
+               
+       /**
+        * Initialises the language engine.
+        */
+       protected function initLanguage() {
+               // set mb settings
+               mb_internal_encoding('UTF-8');
+               if (function_exists('mb_regex_encoding')) mb_regex_encoding('UTF-8');
+               mb_language('uni');
+               
+               // init setup language
+               self::$languageObj = new SetupLanguage(null, array(
+                       'languageCode' => self::$selectedLanguageCode
+               ));
+       }
+       
+       /**
+        * Initialises the template engine.
+        */
+       protected function initTPL() {
+               self::$tplObj = SetupTemplateEngine::getInstance();
+               self::getTPL()->setLanguageID(array_search(self::$selectedLanguageCode, self::$availableLanguages));
+               self::getTPL()->setCompileDir(TMP_DIR);
+               self::getTPL()->addTemplatePath(PACKAGE_ID, TMP_DIR);
+               self::getTPL()->registerPrefilter(array('lang'));
+               self::getTPL()->assign(array(
+                       '__wcf' => $this,
+                       'tmpFilePrefix' => TMP_FILE_PREFIX,
+                       'languageCode' => self::$selectedLanguageCode,
+                       'selectedLanguages' => self::$selectedLanguages,
+                       'wcfDir' => self::$wcfDir,
+                       'developerMode' => self::$developerMode
+               ));
+       }
+       
+       /**
+        * Returns all languages from WCFSetup.tar.gz.
+        *
+        * @return      array
+        */
+       protected static function getAllLanguages() {
+               $languages = $match = array();
+               $tar = new Tar(SETUP_FILE);
+               foreach ($tar->getContentList() as $file) {
+                       if (strpos($file['filename'], 'setup/lang/') === 0 && substr($file['filename'], -4) == '.xml' && preg_match('!^setup_([a-z]{2}(?:-[A-Za-z0-9]+)?(?:_[A-Za-z]{2})?)$!', basename($file['filename'], '.xml'), $match)) {
+                               $languages[] = $match[1];
+                       }
+               }
+               $tar->close();
+
+               // sort languages by language code
+               sort($languages);
+
+               return $languages;
+       }
+       
+       /**
+        * Calculates the current state of the progress bar.
+        *
+        * @param       integer         $currentStep
+        */
+       protected function calcProgress($currentStep) {
+               // count delivered packages
+               $packages = 1; // one for wcf setup
+               $tar = new Tar(SETUP_FILE);
+               foreach ($tar->getContentList() as $file) {
+                       if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {
+                               $packages++;
+                       }
+               }
+               $tar->close();
+               
+               // calculate part of total install
+               $part = 100 / $packages;
+               
+               // calculate progress
+               $progress = round($part / 11 * $currentStep, 0);
+               self::getTPL()->assign(array('progress' => $progress));
+       }
+       
+       /**
+        * Executes the setup steps.
+        */
+       protected function setup() {
+               // get current step
+               if (isset($_REQUEST['step'])) $step = $_REQUEST['step'];
+               else $step = 'selectSetupLanguage';
+
+               // execute current step
+               switch ($step) {
+                       case 'selectSetupLanguage':
+                               if (!self::$developerMode) {
+                                       $this->calcProgress(0);
+                                       $this->selectSetupLanguage();
+                                       break;
+                               }
+                               
+                       case 'showLicense':
+                               if (!self::$developerMode) {
+                                       $this->calcProgress(1);
+                                       $this->showLicense();
+                                       break;
+                               }
+                               
+                       case 'showSystemRequirements':
+                               if (!self::$developerMode) {
+                                       $this->calcProgress(2);
+                                       $this->showSystemRequirements();
+                                       break;
+                               }
+                               
+                       case 'searchWcfDir':
+                               $this->calcProgress(3);
+                               $this->searchWcfDir();
+                               break;
+                               
+                       case 'unzipFiles':
+                               $this->calcProgress(4);
+                               $this->unzipFiles();
+                               break;
+                               
+                       case 'selectLanguages':
+                               $this->calcProgress(5);
+                               $this->selectLanguages();
+                               break;
+                               
+                       case 'configureDB':
+                               $this->calcProgress(6);
+                               $this->configureDB();
+                               break;
+                               
+                       case 'createDB':
+                               $this->calcProgress(7);
+                               $this->createDB();
+                               break;
+                               
+                       case 'logFiles':
+                               $this->calcProgress(8);
+                               $this->logFiles();
+                               break;
+                               
+                       case 'installLanguage':
+                               $this->calcProgress(9);
+                               $this->installLanguage();
+                               break;
+                               
+                       case 'createUser':
+                               $this->calcProgress(10);
+                               $this->createUser();
+                               break;
+                               
+                       case 'installPackages':
+                               $this->calcProgress(11);
+                               $this->installPackages();
+                               break;
+               }
+       }
+       
+       /**
+        * Shows the first setup page.
+        */
+       protected function selectSetupLanguage() {
+               // build language list
+               $languages = array();
+               foreach (self::$availableLanguages as $languageCode) {
+                       $languages[$languageCode] = self::getLanguage()->get('wcf.global.language.'.$languageCode).' ('.$languageCode.')';
+               }
+               
+               // sort languages
+               StringUtil::sort($languages);
+               
+               WCF::getTPL()->assign(array(
+                       'availableLanguages' => $languages,
+                       'nextStep' => 'showLicense'
+               ));
+               WCF::getTPL()->display('stepSelectSetupLanguage');
+       }
+       
+       /**
+        * Shows the license agreement.
+        */
+       protected function showLicense() {
+               if (isset($_POST['send'])) {
+                       if (isset($_POST['accepted'])) {
+                               $this->gotoNextStep('showSystemRequirements');
+                               exit;
+                       }
+                       else {
+                               WCF::getTPL()->assign(array('missingAcception' => true));
+                       }
+               
+               }
+               
+               if (file_exists(TMP_DIR.'setup/license/license_'.self::$selectedLanguageCode.'.txt')) {
+                       $license = file_get_contents(TMP_DIR.'setup/license/license_'.self::$selectedLanguageCode.'.txt');
+               }
+               else {
+                       $license = file_get_contents(TMP_DIR.'setup/license/license_en.txt');
+               }
+               
+               WCF::getTPL()->assign(array(
+                       'license' => $license,
+                       'nextStep' => 'showLicense'
+               ));
+               WCF::getTPL()->display('stepShowLicense');
+       }
+       
+       /**
+        * Shows the system requirements.
+        */
+       protected function showSystemRequirements() {
+               $system = array();
+               
+               // php version
+               $system['phpVersion']['value'] = phpversion();
+               $comparePhpVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $system['phpVersion']['value']);
+               $system['phpVersion']['result'] = (version_compare($comparePhpVersion, '5.3.0') >= 0);
+               
+               // sql
+               $system['sql']['value'] = array_keys(self::getAvailableDBClasses());
+               $system['sql']['result'] = count($system['sql']['value'] > 0);
+               
+               // upload_max_filesize
+               $system['uploadMaxFilesize']['value'] = ini_get('upload_max_filesize');
+               $system['uploadMaxFilesize']['result'] = (intval($system['uploadMaxFilesize']['value']) > 0);
+               
+               // gdlib version
+               $system['gdLib']['value'] = '0.0.0';
+               if (function_exists('gd_info')) {
+                       $temp = gd_info();
+                       $match = array();
+                       if (preg_match('!([0-9]+\.[0-9]+(?:\.[0-9]+)?)!', $temp['GD Version'], $match)) {
+                               if (preg_match('/^[0-9]+\.[0-9]+$/', $match[1])) $match[1] .= '.0';
+                               $system['gdLib']['value'] = $match[1];
+                       }
+               }
+               $system['gdLib']['result'] = (version_compare($system['gdLib']['value'], '2.0.0') >= 0);
+               
+               // mb string
+               $system['mbString']['result'] = extension_loaded('mbstring');
+               
+               // safe mode
+               $system['safeMode']['result'] = (FileUtil::getSafeMode() != 1);
+               
+               WCF::getTPL()->assign(array(
+                       'system' => $system,
+                       'nextStep' => 'searchWcfDir'
+               ));
+               WCF::getTPL()->display('stepShowSystemRequirements');
+       }
+       
+       /**
+        * Searches the wcf dir.
+        */
+       protected function searchWcfDir() {
+               $foundDirectory = '';
+               if (self::$wcfDir) {
+                       $wcfDir = self::$wcfDir;
+               }
+               else {
+                       if ($foundDirectory = FileUtil::scanFolder(INSTALL_SCRIPT_DIR, "WCF.class.php", true)) {
+                               $foundDirectory = $wcfDir = FileUtil::unifyDirSeperator(dirname(dirname(dirname($foundDirectory))).'/');
+                               
+                               if (dirname(dirname($wcfDir)).'/' == TMP_DIR) {
+                                       $foundDirectory = false;
+                                       $wcfDir = FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR).'wcf/';
+                               }
+                       }
+                       else {
+                               $wcfDir = FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR).'wcf/';
+                       }
+               }
+               
+               // domain
+               $domainName = '';
+               if (!empty($_SERVER['SERVER_NAME'])) $domainName = 'http://' . $_SERVER['SERVER_NAME'];
+               // port
+               if (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] != 80) $domainName .= ':' . $_SERVER['SERVER_PORT'];
+               // script url
+               $installScriptUrl = '';
+               if (!empty($_SERVER['REQUEST_URI'])) $installScriptUrl = FileUtil::removeLeadingSlash(FileUtil::removeTrailingSlash(FileUtil::unifyDirSeperator(dirname($_SERVER['REQUEST_URI']))));
+               
+               WCF::getTPL()->assign(array(
+                       'nextStep' => 'unzipFiles',
+                       'foundDirectory' => $foundDirectory,
+                       'wcfDir' => $wcfDir,
+                       'domainName' => $domainName,
+                       'installScriptUrl' => $installScriptUrl,
+                       'installScriptDir' => FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR)
+               ));
+               
+               WCF::getTPL()->display('stepSearchWcfDir');
+       }
+       
+       /**
+        * Unzips the files of the wcfsetup tar archive.
+        */
+       protected function unzipFiles() {
+               // WCF seems to be installed, skip installation of
+               // files, database and admin account
+               // and go directly to the installation of packages
+               if (@is_file(self::$wcfDir.'lib/system/WCF.class.php')) {
+                       $this->gotoNextStep('installPackages');
+                       exit;
+               }
+               // WCF not yet installed, install files first
+               else {
+                       try {
+                               $this->installFiles();
+                       }
+                       catch (Exception $e) {
+                               WCF::getTPL()->assign(array('exception' => $e));
+                               $this->searchWcfDir();
+                               return;
+                       }
+                       
+                       $this->gotoNextStep('selectLanguages');
+               }
+       }
+       
+       /**
+        * Shows the page for choosing the installed languages.
+        */
+       protected function selectLanguages() {
+               $errorField = $errorType = '';
+               $allLanguages = $this->getAllLanguages();
+               $illegalLanguages = array();
+               
+               // build visible language list
+               $languages = array();
+               foreach ($allLanguages as $languageCode) {
+                       $languages[$languageCode] = self::getLanguage()->get('wcf.global.language.'.$languageCode).' ('.$languageCode.')';
+               }
+               
+               // skip step in developer mode
+               // select all available languages automatically
+               if (self::$developerMode) {
+                       self::$selectedLanguages = array();
+                       foreach ($allLanguages as $languageCode) {
+                               self::$selectedLanguages[] = $languageCode;
+                       }
+                       
+                       self::getTPL()->assign(array('selectedLanguages' => self::$selectedLanguages));
+                       $this->gotoNextStep('configureDB');
+                       exit;
+               }
+               
+               // sort languages
+               StringUtil::sort($languages);
+               
+               // start error handling
+               if (isset($_POST['send'])) {
+                       try {
+                               // no languages selected
+                               if (count(self::$selectedLanguages) == 0) {
+                                       throw new UserInputException('selectedLanguages');
+                               }
+                               
+                               // illegal selection
+                               foreach (self::$selectedLanguages as $language) {
+                                       if (!isset($languages[$language])) {
+                                               throw new UserInputException('selectedLanguages');
+                                       }
+                               }
+                               
+                               // no errors
+                               // go to next step
+                               $this->gotoNextStep('configureDB');
+                               exit;
+                       }
+                       catch (UserInputException $e) {
+                               $errorField = $e->getField();
+                               $errorType = $e->getType();
+                       }
+               }
+               else {
+                       self::$selectedLanguages[] = self::$selectedLanguageCode;
+                       WCF::getTPL()->assign(array('selectedLanguages' => self::$selectedLanguages));
+               }
+               
+               WCF::getTPL()->assign(array(
+                       'errorField' => $errorField,
+                       'errorType' => $errorType,
+                       'languages' => $languages,
+                       'nextStep' => 'selectLanguages'
+               ));
+               WCF::getTPL()->display('stepSelectLanguages');
+       }
+       
+       /**
+        * Shows the page for configurating the database connection.
+        */
+       protected function configureDB() {
+               $availableDBClasses = self::getAvailableDBClasses();
+               $dbHost = 'localhost';
+               $dbUser = 'root';
+               $dbPassword = '';
+               $dbName = 'wcf';
+               $dbNumber = '1';
+               $dbClass = 'MySQLDatabase';
+               if (!function_exists('mysql_connect')) $dbClass = 'MySQLiDatabase';
+               $overwriteTables = false;
+               
+               if (isset($_POST['send'])) {
+                       if (isset($_POST['dbHost'])) $dbHost = $_POST['dbHost'];
+                       if (isset($_POST['dbUser'])) $dbUser = $_POST['dbUser'];
+                       if (isset($_POST['dbPassword'])) $dbPassword = $_POST['dbPassword'];
+                       if (isset($_POST['dbName'])) $dbName = $_POST['dbName'];
+                       if (isset($_POST['overwriteTables'])) $overwriteTables = intval($_POST['overwriteTables']);
+                       // Should the user not be prompted if converted or default n match an
+                       // existing installation number? By now the existing installation
+                       // will be overwritten just so!
+                       if (isset($_POST['dbNumber'])) $dbNumber = intval($_POST['dbNumber']);
+                       if (isset($_POST['dbClass'])) $dbClass = $_POST['dbClass'];
+                       
+                       // get port
+                       $dbPort = 0;
+                       if (preg_match('/^(.+?):(\d+)$/', $dbHost, $match)) {
+                               $dbHost = $match[1];
+                               $dbPort = intval($match[2]);
+                       }
+                       
+                       // test connection
+                       try {
+                               // check db class
+                               $validDB = false;
+                               foreach ($availableDBClasses as $dbData) {
+                                       if ($dbData['class'] == $dbClass) {
+                                               $validDB = true;
+                                               break;
+                                       }
+                               }
+                               
+                               if (!$validDB) {
+                                       throw new SystemException("Database type '".$dbClass."'. is not available on this system.");
+                               }
+                               
+                               // check connection data
+                               $db = new $dbClass($dbHost, $dbUser, $dbPassword, $dbName, $dbPort);
+                               $db->connect();
+                               
+                               // check sql version
+                               if (!empty($availableDBClasses[$dbClass]['minversion'])) {
+                                       $sqlVersion = $db->getVersion();
+                                       if ($sqlVersion != 'unknown') {
+                                               $compareSQLVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $sqlVersion);
+                                               if (!(version_compare($compareSQLVersion, $availableDBClasses[$dbClass]['minversion']) >= 0)) {
+                                                       throw new SystemException("Insufficient SQL version '".$compareSQLVersion."'. Version '".$availableDBClasses[$dbClass]['minversion']."' or greater is needed.");
+                                               }
+                                       }
+                               }
+                               
+                               // check for table conflicts
+                               $conflictedTables = $this->getConflictedTables($db, $dbNumber);
+                               
+                               // write config.inc
+                               if (empty($conflictedTables) || $overwriteTables || self::$developerMode) {
+                                       // connection successfully established
+                                       // write configuration to config.inc.php
+                                       $file = new File(WCF_DIR.'config.inc.php');
+                                       $file->write("<?php\n");
+                                       $file->write("\$dbHost = '".StringUtil::replace("'", "\\'", $dbHost)."';\n");
+                                       $file->write("\$dbPort = ".$dbPort.";\n");
+                                       $file->write("\$dbUser = '".StringUtil::replace("'", "\\'", $dbUser)."';\n");
+                                       $file->write("\$dbPassword = '".StringUtil::replace("'", "\\'", $dbPassword)."';\n");
+                                       $file->write("\$dbName = '".StringUtil::replace("'", "\\'", $dbName)."';\n");
+                                       $file->write("\$dbClass = '".StringUtil::replace("'", "\\'", $dbClass)."';\n");
+                                       $file->write("if (!defined('WCF_N')) define('WCF_N', $dbNumber);\n?>");
+                                       $file->close();
+                               
+                                       // go to next step
+                                       $this->gotoNextStep('createDB');
+                                       exit;
+                               }
+                               // show configure temnplate again
+                               else {
+                                       WCF::getTPL()->assign(array('conflictedTables' => $conflictedTables));
+                               }
+                       }
+                       catch (SystemException $e) {
+                               WCF::getTPL()->assign(array('exception' => $e));
+                       }
+               }
+               WCF::getTPL()->assign(array(
+                       'dbHost' => $dbHost,
+                       'dbUser' => $dbUser,
+                       'dbPassword' => $dbPassword,
+                       'dbName' => $dbName,
+                       'dbNumber' => $dbNumber,
+                       'dbClass' => $dbClass,
+                       'availableDBClasses' => $availableDBClasses,
+                       'nextStep' => 'configureDB'
+               ));
+               WCF::getTPL()->display('stepConfigureDB');
+       }
+       
+       
+       /**
+        * Checks if in the chosen database are tables in conflict with the wcf tables
+        * which will be created in the next step.
+        *
+        * @param       Database        $db
+        * @param       integer         $dbNumber
+        */
+       protected function getConflictedTables($db, $dbNumber) {
+               // get content of the sql structure file
+               $sql = file_get_contents(TMP_DIR.'setup/db/install.sql');
+               
+               // installation number value 'n' (WCF_N) must be reflected in the executed sql queries
+               $sql = StringUtil::replace('wcf1_', 'wcf'.$dbNumber.'_', $sql);
+               
+               // get all tablenames which should be created
+               preg_match_all("%CREATE\s+TABLE\s+(\w+)%", $sql, $matches);
+               
+               // get all installed tables from chosen database
+               $existingTables = $db->getEditor()->getTableNames();
+               
+               // check if existing tables are in conflict with wcf tables
+               $conflictedTables = array();
+               foreach ($existingTables as $existingTableName) {
+                       foreach ($matches[1] as $wcfTableName) {
+                               if ($existingTableName == $wcfTableName) {
+                                       $conflictedTables[] = $wcfTableName;
+                               }
+                       }
+               }
+               return $conflictedTables;
+       }
+       
+       /**
+        * Creates the database structure of the wcf.
+        */
+       protected function createDB() {
+               $this->initDB();
+               
+               // get content of the sql structure file
+               $sql = file_get_contents(TMP_DIR.'setup/db/install.sql');
+               
+               // installation number value 'n' (WCF_N) must be reflected in the executed sql queries
+               $sql = StringUtil::replace('wcf1_', 'wcf'.WCF_N.'_', $sql);
+               
+               // execute sql queries
+               $parser = new SQLParser($sql);
+               $parser->execute();
+               
+               // log sql queries
+               preg_match_all("~CREATE\s+TABLE\s+(\w+)~i", $sql, $matches);
+               
+               if (count($matches[1])) {
+                       $sql = "INSERT INTO     wcf".WCF_N."_package_installation_sql_log
+                                               (sqlTable)
+                               VALUES          (?)";
+                       $statement = self::getDB()->prepareStatement($sql);
+                       foreach ($matches[1] as $tableName) {
+                               $statement->execute(array($tableName));
+                       }
+               }
+               
+               /*
+                * Manually install PIPPackageInstallationPlugin since install.sql content is not escaped resulting
+                * in different behaviour in MySQL and MSSQL. You SHOULD NOT move this into install.sql!
+                */
+               $sql = "INSERT INTO     wcf".WCF_N."_package_installation_plugin
+                                       (pluginName, priority, className)
+                       VALUES          (?, ?, ?)";
+               $statement = self::getDB()->prepareStatement($sql);
+               $statement->execute(array(
+                       'packageinstallationplugins',
+                       1,
+                       'wcf\system\package\plugin\PIPPackageInstallationPlugin'
+               ));
+               
+               $this->gotoNextStep('logFiles');
+       }
+       
+       /**
+        * Logs the unzipped files.
+        */
+       protected function logFiles() {
+               $this->initDB();
+               
+               $this->getInstalledFiles(WCF_DIR);
+               $acpTemplateInserts = $fileInserts = array();
+               foreach (self::$installedFiles as $file) {
+                       $match = array();
+                       if (preg_match('!/acp/templates/([^/]+)\.tpl$!', $file, $match)) {
+                               // acp template
+                               $acpTemplateInserts[] = $match[1];
+                       }
+                       else {
+                               // regular file
+                               $fileInserts[] = StringUtil::replace(WCF_DIR, '', $file);
+                       }
+               }
+               
+               // save acp template log
+               if (!empty($acpTemplateInserts)) {
+                       $sql = "INSERT INTO     wcf".WCF_N."_acp_template
+                                               (templateName)
+                               VALUES          (?)";
+                       $statement = self::getDB()->prepareStatement($sql);
+                       
+                       foreach ($acpTemplateInserts as $acpTemplate) {
+                               $statement->execute(array($acpTemplate));
+                       }
+               }
+               
+               // save file log
+               if (!empty($fileInserts)) {
+                       $sql = "INSERT INTO     wcf".WCF_N."_package_installation_file_log
+                                               (filename)
+                               VALUES          (?)";
+                       $statement = self::getDB()->prepareStatement($sql);
+                       
+                       foreach ($fileInserts as $file) {
+                               $statement->execute(array($file));
+                       }
+               }
+               
+               $this->gotoNextStep('installLanguage');
+       }
+       
+       /**
+        * Scans the given dir for installed files.
+        *
+        * @param       string          $dir
+        */
+       protected function getInstalledFiles($dir) {
+               if ($files = glob($dir.'*')) {
+                       foreach ($files as $file) {
+                               if (is_dir($file)) {
+                                       $this->getInstalledFiles(FileUtil::addTrailingSlash($file));
+                               }
+                               else {
+                                       self::$installedFiles[] = FileUtil::unifyDirSeperator($file);
+                               }
+                       }
+               }
+       }
+       
+       /**
+        * Installs the selected languages.
+        */
+       protected function installLanguage() {
+               $this->initDB();
+               
+               foreach (self::$selectedLanguages as $language) {
+                       // get language.xml file name
+                       $filename = TMP_DIR.'install/lang/'.$language.'.xml';
+                       
+                       // check the file
+                       if (!file_exists($filename)) {
+                               throw new SystemException("unable to find language file '".$filename."'", 11002);
+                       }
+                       
+                       // open the file
+                       $xml = new XML();
+                       $xml->load($filename);
+                       
+                       // import xml
+                       LanguageEditor::importFromXML($xml, 0);
+               }
+               
+               // set default language
+               $language = LanguageFactory::getLanguageByCode(in_array(self::$selectedLanguageCode, self::$selectedLanguages) ? self::$selectedLanguageCode : self::$selectedLanguages[0]);
+               LanguageFactory::makeDefault($language->languageID);
+               
+               // assign all languages to package id 0
+               $sql = "SELECT  languageID
+                       FROM    wcf".WCF_N."_language";
+               $statement = self::getDB()->prepareStatement($sql);
+               $statement->execute();
+               $languages = array();
+               while ($row = $statement->fetchArray()) {
+                       $languages[] = $row['languageID'];
+               }
+               
+               if (count($languages) > 0) {
+                       $sql = "INSERT INTO     wcf".WCF_N."_language_to_package
+                                               (languageID)
+                               VALUES          (?)";
+                       $statement = self::getDB()->prepareStatement($sql);
+                       
+                       foreach ($languages as $languageID) {
+                               $statement->execute(array(
+                                       $languageID
+                               ));
+                       }
+               }
+               
+               // rebuild language cache
+               CacheHandler::getInstance()->clearResource('languages');
+               
+               // go to next step
+               $this->gotoNextStep('createUser');
+       }
+       
+       /**
+        * Shows the page for creating the admin account.
+        */
+       protected function createUser() {
+               $errorType = $errorField = $username = $email = $confirmEmail = $password = $confirmPassword = '';
+               
+               $username = '';
+               $email = $confirmEmail = '';
+               $password = $confirmPassword = '';
+               
+               if (isset($_POST['send']) || self::$developerMode) {
+                       if (isset($_POST['send'])) {
+                               if (isset($_POST['username']))          $username = StringUtil::trim($_POST['username']);
+                               if (isset($_POST['email']))             $email = StringUtil::trim($_POST['email']);
+                               if (isset($_POST['confirmEmail']))      $confirmEmail = StringUtil::trim($_POST['confirmEmail']);
+                               if (isset($_POST['password']))          $password = $_POST['password'];
+                               if (isset($_POST['confirmPassword']))   $confirmPassword = $_POST['confirmPassword'];
+                       }
+                       else {
+                               $username = $password = $confirmPassword = 'root';
+                               $email = $confirmEmail = 'woltlab@woltlab.com';
+                       }
+                       
+                       // error handling
+                       try {
+                               // username
+                               if (empty($username)) {
+                                       throw new UserInputException('username');
+                               }
+                               if (!UserUtil::isValidUsername($username)) {
+                                       throw new UserInputException('username', 'notValid');
+                               }
+                               
+                               // e-mail address
+                               if (empty($email)) {
+                                       throw new UserInputException('email');
+                               }
+                               if (!UserUtil::isValidEmail($email)) {
+                                       throw new UserInputException('email', 'notValid');
+                               }
+                               
+                               // confirm e-mail address
+                               if ($email != $confirmEmail) {
+                                       throw new UserInputException('confirmEmail', 'notEqual');
+                               }
+                               
+                               // password
+                               if (empty($password)) {
+                                       throw new UserInputException('password');
+                               }
+                               
+                               // confirm e-mail address
+                               if ($password != $confirmPassword) {
+                                       throw new UserInputException('confirmPassword', 'notEqual');
+                               }
+                               
+                               // no errors
+                               // init database connection
+                               $this->initDB();
+                               
+                               // get language id
+                               $languageID = 0;
+                               $sql = "SELECT  languageID
+                                       FROM    wcf".WCF_N."_language
+                                       WHERE   languageCode = ?";
+                               $statement = self::getDB()->prepareStatement($sql);
+                               $statement->execute(array(self::$selectedLanguageCode));
+                               $row = $statement->fetchArray();
+                               if (isset($row['languageID'])) $languageID = $row['languageID'];
+                               
+                               // create user
+                               $data = array(
+                                       'data' => array(
+                                               'email' => $email,
+                                               'languageID' => $languageID,
+                                               'password' => $password,
+                                               'username' => $username
+                                       ),
+                                       'groups' => array(
+                                               1,
+                                               3,
+                                               4
+                                       ),
+                                       'languages' => array(
+                                               $languageID
+                                       )
+                               );
+                               
+                               $userAction = new UserAction(array(), 'create', $data);
+                               $userAction->executeAction();
+                               
+                               // go to next step
+                               $this->gotoNextStep('installPackages');
+                               exit;
+                       }
+                       catch (UserInputException $e) {
+                               $errorField = $e->getField();
+                               $errorType = $e->getType();
+                       }
+               }
+               
+               WCF::getTPL()->assign(array(
+                       'errorField' => $errorField,
+                       'errorType' => $errorType,
+                       'username' => $username,
+                       'email' => $email,
+                       'confirmEmail' => $confirmEmail,
+                       'password' => $password,
+                       'confirmPassword' => $confirmPassword,
+                       'nextStep' => 'createUser'
+               ));
+               WCF::getTPL()->display('stepCreateUser');
+       }
+       
+       /**
+        * Registers with wcf setup delivered packages in the package installation queue.
+        */
+       protected function installPackages() {
+               // init database connection
+               $this->initDB();
+               
+               // get admin account
+               $admin = new User(1);
+               
+               // get delivered packages
+               $wcfPackageFile = '';
+               $otherPackages = array();
+               $tar = new Tar(SETUP_FILE);
+               foreach ($tar->getContentList() as $file) {
+                       if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {
+                               $packageFile = basename($file['filename']);
+                               $packageName = preg_replace('!\.(tar\.gz|tgz|tar)$!', '', $packageFile);
+                               
+                               if ($packageName == 'com.woltlab.wcf') {
+                                       $wcfPackageFile = $packageFile;
+                               }
+                               else {
+                                       $isStrato = (!empty($_SERVER['DOCUMENT_ROOT']) && (strpos($_SERVER['DOCUMENT_ROOT'], 'strato') !== false));
+                                       if (!$isStrato && preg_match('!\.(tar\.gz|tgz)$!', $packageFile)) {
+                                               // try to unzip zipped package files
+                                               if (FileUtil::uncompressFile(TMP_DIR.'install/packages/'.$packageFile, TMP_DIR.'install/packages/'.$packageName.'.tar')) {
+                                                       @unlink(TMP_DIR.'install/packages/'.$packageFile);
+                                                       $packageFile = $packageName.'.tar';
+                                               }
+                                       }
+                                       
+                                       $otherPackages[$packageName] = $packageFile;
+                               }
+                       }
+               }
+               $tar->close();
+               
+               // register packages in queue
+               // get new process id
+               $sql = "SELECT  MAX(processNo) AS processNo
+                       FROM    wcf".WCF_N."_package_installation_queue";
+               $statement = self::getDB()->prepareStatement($sql);
+               $statement->execute();
+               $result = $statement->fetchArray();
+               $processNo = intval($result['processNo']) + 1;
+               $statementParameters = array();
+               
+               // search existing wcf package
+               $sql = "SELECT  COUNT(*) AS count
+                       FROM    wcf".WCF_N."_package
+                       WHERE   package = 'com.woltlab.wcf'";
+               $statement = self::getDB()->prepareStatement($sql);
+               $statement->execute();
+               $row = $statement->fetchArray();
+               if (!$row['count']) {
+                       if (empty($wcfPackageFile)) {
+                               throw new SystemException('the essential package com.woltlab.wcf is missing.', 11007);
+                       }
+                       
+                       // register essential wcf package
+                       $statementParameters[] = array(
+                               'packageName' => 'com.woltlab.wcf',
+                               'archive' => TMP_DIR.'install/packages/'.$wcfPackageFile
+                       );
+               }
+               
+               // register all other delivered packages
+               asort($otherPackages);
+               foreach ($otherPackages as $packageName => $packageFile) {
+                       $statementParameters[] = array(
+                               'packageName' => $packageName,
+                               'archive' => TMP_DIR.'install/packages/'.$packageFile
+                       );
+               }
+               
+               if (!empty($statementParameters)) {
+                       $sql = "INSERT INTO     wcf".WCF_N."_package_installation_queue
+                                               (processNo, userID, package, archive)
+                               VALUES          (?, ?, ?, ?)";
+                       $statement = self::getDB()->prepareStatement($sql);
+                       
+                       foreach ($statementParameters as $parameter) {
+                               $statement->execute(array(
+                                       $processNo,
+                                       $admin->userID,
+                                       $parameter['packageName'],
+                                       $parameter['archive']
+                               ));
+                       }
+               }
+               
+               // login as admin
+               $factory = new ACPSessionFactory();
+               $factory->load();
+               
+               SessionHandler::getInstance()->changeUser($admin);
+               SessionHandler::getInstance()->register('masterPassword', 1);
+               SessionHandler::getInstance()->update();
+               
+               // TODO: print message if delete fails
+               $installPhpDeleted = @unlink('./install.php');
+               $testPhpDeleted = @unlink('./test.php');
+               $wcfSetupTarDeleted = @unlink('./WCFSetup.tar.gz');
+               
+               // print page
+               WCF::getTPL()->assign(array(
+                       'installPhpDeleted' => $installPhpDeleted,
+                       'wcfSetupTarDeleted' => $wcfSetupTarDeleted
+               ));
+               WCF::getTPL()->display('stepInstallPackages');
+               
+               // delete tmp files
+               $directory = TMP_DIR.TMP_FILE_PREFIX.'/';
+               $it = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory));
+               while ($it->valid()) {
+                       // delete all files except directories and packages (required for post-wcfsetup installation)
+                       if (!$it->isDot() && !$it->isDir() && !preg_match('~\.tar(\.gz)?$~', $it->getSubPathName())) {
+                               @unlink($it->key());
+                       }
+                       
+                       $it->next();
+               }
+       }
+       
+       /**
+        * Goes to the next step.
+        *
+        * @param       string          $nextStep
+        */
+       protected function gotoNextStep($nextStep) {
+               WCF::getTPL()->assign(array('nextStep' => $nextStep));
+               WCF::getTPL()->display('stepNext');
+       }
+       
+       /**
+        * Installs the files of the tar archive.
+        */
+       protected static function installFiles() {
+               new Installer(self::$wcfDir, SETUP_FILE, null, 'install/files/');
+       }
+       
+       /**
+        * Gets the package name of the first standalone application in WCFSetup.tar.gz.
+        */
+       protected static function getPackageName() {
+               // get package name
+               $tar = new Tar(SETUP_FILE);
+               foreach ($tar->getContentList() as $file) {
+                       if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {
+                               $packageFile = basename($file['filename']);
+                               $packageName = preg_replace('!\.(tar\.gz|tgz|tar)$!', '', $packageFile);
+                               
+                               if ($packageName != 'com.woltlab.wcf') {
+                                       try {
+                                               $archive = new PackageArchive(TMP_DIR.'install/packages/'.$packageFile);
+                                               $archive->openArchive();
+                                               self::$setupPackageName = $archive->getPackageInfo('packageName');
+                                               $archive->getTar()->close();
+                                               break;
+                                       }
+                                       catch (SystemException $e) {}
+                               }
+                       }
+               }
+               $tar->close();
+               
+               // assign package name
+               WCF::getTPL()->assign(array('setupPackageName' => self::$setupPackageName));
+       }
+}
index 6639b683b679480e210283872238919dc27295ba..fcede6b246d84b4a39cf9b153582ddd92c6dac69 100644 (file)
@@ -1,82 +1,82 @@
-<?php\r
-namespace wcf\system\auth;\r
-use wcf\data\user\User;\r
-use wcf\system\event\EventHandler;\r
-\r
-/**\r
- * All user authentication types should implement the abstract functions of this class.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.auth\r
- * @category   Community Framework\r
- */\r
-abstract class UserAuth {\r
-       /**\r
-        * active instance\r
-        *\r
-        * @var UserAuth\r
-        */\r
-       protected static $instance = null;\r
-       \r
-       /**\r
-        * Returns an instance of the enabled user auth class.\r
-        * \r
-        * @return      UserAuth\r
-        */\r
-       public static function getInstance() {\r
-               if (self::$instance === null) {\r
-                       // call loadInstance event\r
-                       EventHandler::getInstance()->fireAction(__CLASS__, 'loadInstance');\r
-               \r
-                       // use default implementation\r
-                       if (self::$instance === null) {\r
-                               self::$instance = new UserAuthDefault();\r
-                       }\r
-               }\r
-               \r
-               return self::$instance;\r
-       }\r
-       \r
-       /**\r
-        * Prevents creating an additional instance.\r
-        */\r
-       protected function __clone() {}\r
-       \r
-       /**\r
-        * Returns true, if this auth type supports persistent logins.\r
-        * \r
-        * @return      boolean\r
-        */\r
-       public abstract function supportsPersistentLogins();\r
-       \r
-       /**\r
-        * Stores the user access data for a persistent login.\r
-        * \r
-        * @param       User            $user\r
-        * @param       string          $username\r
-        * @param       string          $password\r
-        */\r
-       public abstract function storeAccessData(User $user, $username, $password);\r
-       \r
-       /**\r
-        * Does an manual user login.\r
-        * \r
-        * @param       string          $username\r
-        * @param       string          $password\r
-        * @param       string          $userClassname          class name of user class\r
-        * @return      User\r
-        */\r
-       public abstract function loginManually($username, $password, $userClassname = 'wcf\data\user\User');\r
-       \r
-       /**\r
-        * Does an automatic user login.\r
-        * \r
-        * @param       boolean         $persistent             true = persistent login\r
-        * @param       string          $userClassname          class name of user class\r
-        * @return      User\r
-        */\r
-       public abstract function loginAutomatically($persistent = false, $userClassname = 'wcf\data\user\User');\r
+<?php
+namespace wcf\system\auth;
+use wcf\data\user\User;
+use wcf\system\event\EventHandler;
+
+/**
+ * All user authentication types should implement the abstract functions of this class.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.auth
+ * @category   Community Framework
+ */
+abstract class UserAuth {
+       /**
+        * active instance
+        *
+        * @var UserAuth
+        */
+       protected static $instance = null;
+       
+       /**
+        * Returns an instance of the enabled user auth class.
+        * 
+        * @return      UserAuth
+        */
+       public static function getInstance() {
+               if (self::$instance === null) {
+                       // call loadInstance event
+                       EventHandler::getInstance()->fireAction(__CLASS__, 'loadInstance');
+               
+                       // use default implementation
+                       if (self::$instance === null) {
+                               self::$instance = new UserAuthDefault();
+                       }
+               }
+               
+               return self::$instance;
+       }
+       
+       /**
+        * Prevents creating an additional instance.
+        */
+       protected function __clone() {}
+       
+       /**
+        * Returns true, if this auth type supports persistent logins.
+        * 
+        * @return      boolean
+        */
+       public abstract function supportsPersistentLogins();
+       
+       /**
+        * Stores the user access data for a persistent login.
+        * 
+        * @param       User            $user
+        * @param       string          $username
+        * @param       string          $password
+        */
+       public abstract function storeAccessData(User $user, $username, $password);
+       
+       /**
+        * Does an manual user login.
+        * 
+        * @param       string          $username
+        * @param       string          $password
+        * @param       string          $userClassname          class name of user class
+        * @return      User
+        */
+       public abstract function loginManually($username, $password, $userClassname = 'wcf\data\user\User');
+       
+       /**
+        * Does an automatic user login.
+        * 
+        * @param       boolean         $persistent             true = persistent login
+        * @param       string          $userClassname          class name of user class
+        * @return      User
+        */
+       public abstract function loginAutomatically($persistent = false, $userClassname = 'wcf\data\user\User');
 }
index fb5ece82781545a092c8c8d0184234a7d1d56eb9..7fac6e7e88d35cdfcb3a9feb4af8a4f01cbef265 100644 (file)
@@ -1,99 +1,99 @@
-<?php\r
-namespace wcf\system\auth;\r
-use wcf\data\user\User;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\util\HeaderUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Default implementation of the user authentication.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.auth\r
- * @category   Community Framework\r
- */\r
-class UserAuthDefault extends UserAuth {\r
-       /**\r
-        * @see UserAuth::supportsPersistentLogins()\r
-        */\r
-       public function supportsPersistentLogins() {\r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * @see UserAuth::loginManually()\r
-        */\r
-       public function loginManually($username, $password, $userClassname = 'wcf\data\user\User') {\r
-               $user = User::getUserByUsername($username);\r
-               $userSession = new $userClassname(null, null, $user);\r
-               \r
-               if ($userSession->userID == 0) {\r
-                       throw new UserInputException('username', 'notFound');\r
-               }\r
-       \r
-               // check password\r
-               if (!$userSession->checkPassword($password)) {\r
-                       throw new UserInputException('password', 'false');\r
-               }\r
-               \r
-               return $userSession;\r
-       }\r
-       \r
-       /**\r
-        * @see UserAuth::storeAccessData()\r
-        */\r
-       public function storeAccessData(User $user, $username, $password) {\r
-               HeaderUtil::setCookie('userID', $user->userID, TIME_NOW + 365 * 24 * 3600);\r
-               HeaderUtil::setCookie('password', StringUtil::getSaltedHash($password, $user->salt), TIME_NOW + 365 * 24 * 3600);\r
-       }\r
-\r
-       /**\r
-        * @see UserAuth::loginAutomatically()\r
-        */\r
-       public function loginAutomatically($persistent = false, $userClassname = 'wcf\data\user\User') {\r
-               if (!$persistent) return null;\r
-               \r
-               $user = null;\r
-               if (isset($_COOKIE[COOKIE_PREFIX.'userID']) && isset($_COOKIE[COOKIE_PREFIX.'password'])) {\r
-                       if (!($user = $this->getUserAutomatically(intval($_COOKIE[COOKIE_PREFIX.'userID']), $_COOKIE[COOKIE_PREFIX.'password'], $userClassname))) {\r
-                               $user = null;\r
-                               // reset cookie\r
-                               HeaderUtil::setCookie('userID', '');\r
-                               HeaderUtil::setCookie('password', '');\r
-                       }\r
-               }\r
-               \r
-               return $user;\r
-       }\r
-       \r
-       /**\r
-        * Returns a user object or null on failure.\r
-        * \r
-        * @param       integer         $userID\r
-        * @param       string          $password\r
-        * @param       string          $userClassname\r
-        * @return      User    \r
-        */\r
-       protected function getUserAutomatically($userID, $password, $userClassname = 'wcf\data\user\User') {\r
-               $user = new $userClassname($userID);\r
-               if (!$user->userID || !$this->checkCookiePassword($user, $password)) {\r
-                       $user = null;\r
-               }\r
-               \r
-               return $user;\r
-       }\r
-       \r
-       /**\r
-        * Validates the cookie password.\r
-        * \r
-        * @param       User            $user\r
-        * @param       string          $password\r
-        * @return      boolean\r
-        */\r
-       protected function checkCookiePassword($user, $password) {\r
-               return $user->checkCookiePassword($password);\r
-       }\r
+<?php
+namespace wcf\system\auth;
+use wcf\data\user\User;
+use wcf\system\exception\UserInputException;
+use wcf\util\HeaderUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Default implementation of the user authentication.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.auth
+ * @category   Community Framework
+ */
+class UserAuthDefault extends UserAuth {
+       /**
+        * @see UserAuth::supportsPersistentLogins()
+        */
+       public function supportsPersistentLogins() {
+               return true;
+       }
+       
+       /**
+        * @see UserAuth::loginManually()
+        */
+       public function loginManually($username, $password, $userClassname = 'wcf\data\user\User') {
+               $user = User::getUserByUsername($username);
+               $userSession = new $userClassname(null, null, $user);
+               
+               if ($userSession->userID == 0) {
+                       throw new UserInputException('username', 'notFound');
+               }
+       
+               // check password
+               if (!$userSession->checkPassword($password)) {
+                       throw new UserInputException('password', 'false');
+               }
+               
+               return $userSession;
+       }
+       
+       /**
+        * @see UserAuth::storeAccessData()
+        */
+       public function storeAccessData(User $user, $username, $password) {
+               HeaderUtil::setCookie('userID', $user->userID, TIME_NOW + 365 * 24 * 3600);
+               HeaderUtil::setCookie('password', StringUtil::getSaltedHash($password, $user->salt), TIME_NOW + 365 * 24 * 3600);
+       }
+
+       /**
+        * @see UserAuth::loginAutomatically()
+        */
+       public function loginAutomatically($persistent = false, $userClassname = 'wcf\data\user\User') {
+               if (!$persistent) return null;
+               
+               $user = null;
+               if (isset($_COOKIE[COOKIE_PREFIX.'userID']) && isset($_COOKIE[COOKIE_PREFIX.'password'])) {
+                       if (!($user = $this->getUserAutomatically(intval($_COOKIE[COOKIE_PREFIX.'userID']), $_COOKIE[COOKIE_PREFIX.'password'], $userClassname))) {
+                               $user = null;
+                               // reset cookie
+                               HeaderUtil::setCookie('userID', '');
+                               HeaderUtil::setCookie('password', '');
+                       }
+               }
+               
+               return $user;
+       }
+       
+       /**
+        * Returns a user object or null on failure.
+        * 
+        * @param       integer         $userID
+        * @param       string          $password
+        * @param       string          $userClassname
+        * @return      User    
+        */
+       protected function getUserAutomatically($userID, $password, $userClassname = 'wcf\data\user\User') {
+               $user = new $userClassname($userID);
+               if (!$user->userID || !$this->checkCookiePassword($user, $password)) {
+                       $user = null;
+               }
+               
+               return $user;
+       }
+       
+       /**
+        * Validates the cookie password.
+        * 
+        * @param       User            $user
+        * @param       string          $password
+        * @return      boolean
+        */
+       protected function checkCookiePassword($user, $password) {
+               return $user->checkCookiePassword($password);
+       }
 }
index 3b18ee8d72b9217ceea54f8981291d80b2356f6d..7cc9831a174715b9fc0b08aff918bd3685b82603 100644 (file)
-<?php\r
-namespace wcf\system\cache;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\SingletonFactory;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * CacheHandler holds all registered cache resources.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache\r
- * @category   Community Framework\r
- */\r
-class CacheHandler extends SingletonFactory {\r
-       /**\r
-        * Registered cache resources.\r
-        * \r
-        * @var array\r
-        */\r
-       protected $cacheResources = array();\r
-       \r
-       /**\r
-        * cache source object\r
-        * \r
-        * @var wcf\system\cache\source\ICacheSource\r
-        */\r
-       protected $cacheSource = null;\r
-       \r
-       /**\r
-        * Creates a new CacheHandler object.\r
-        */\r
-       protected function init() {\r
-               // init cache source object\r
-               try {\r
-                       $className = 'wcf\system\cache\source\\'.ucfirst(CACHE_SOURCE_TYPE).'CacheSource';\r
-                       $this->cacheSource = new $className();\r
-               }\r
-               catch (SystemException $e) {\r
-                       if (CACHE_SOURCE_TYPE != 'disk') {\r
-                               // fallback to disk cache\r
-                               $this->cacheSource = new wcf\system\cache\source\DiskCacheSource();\r
-                       }\r
-                       else {\r
-                               throw $e;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Registers a new cache resource.\r
-        * \r
-        * @param       string          $cache          name of this resource\r
-        * @param       string          $file           data file for this resource\r
-        * @param       string          $className\r
-        * @param       integer         $minLifetime\r
-        * @param       integer         $maxLifetime\r
-        */\r
-       public function addResource($cache, $file, $className, $minLifetime = 0, $maxLifetime = 0) {\r
-               $this->cacheResources[$cache] = array(\r
-                       'cache' => $cache,\r
-                       'file' => $file, \r
-                       'className' => $className, \r
-                       'minLifetime' => $minLifetime,\r
-                       'maxLifetime' => $maxLifetime\r
-               );\r
-       }\r
-       \r
-       /**\r
-        * Deletes a registered cache resource.\r
-        * \r
-        * @param       string          $cache\r
-        * @param       boolean         $ignoreLifetime\r
-        */\r
-       public function clearResource($cache, $ignoreLifetime = false) {\r
-               if (!isset($this->cacheResources[$cache])) {\r
-                       throw new SystemException("cache resource '".$cache."' does not exist", 11005);\r
-               }\r
-               \r
-               $this->getCacheSource()->delete($this->cacheResources[$cache], $ignoreLifetime);\r
-       }\r
-       \r
-       /**\r
-        * Marks cached files as obsolete.\r
-        *\r
-        * @param       string          $directory\r
-        * @param       string          $filepattern\r
-        * @param       boolean         $forceDelete\r
-        */\r
-       public function clear($directory, $filepattern, $forceDelete = false) {\r
-               $this->getCacheSource()->clear($directory, $filepattern, $forceDelete);\r
-       }\r
-       \r
-       /**\r
-        * Returns a cached variable.\r
-        *\r
-        * @param       string          $cache\r
-        * @param       string          $variable\r
-        * @return      mixed           $value\r
-        */\r
-       public function get($cache, $variable = '') {\r
-               if (!isset($this->cacheResources[$cache])) {\r
-                       throw new SystemException("unknown cache resource '".$cache."'", 11005);\r
-               }\r
-               \r
-               // try to get value\r
-               $value = $this->getCacheSource()->get($this->cacheResources[$cache]);\r
-               if ($value === null) {\r
-                       // rebuild cache\r
-                       $this->rebuild($this->cacheResources[$cache]);\r
-                       \r
-                       // try to get value again\r
-                       $value = $this->getCacheSource()->get($this->cacheResources[$cache]);\r
-                       if ($value === null) {\r
-                               throw new SystemException("cache resource '".$cache."' does not exist", 11005);\r
-                       }\r
-               }\r
-               \r
-               // return value\r
-               if (!empty($variable)) {\r
-                       if (!isset($value[$variable])) {\r
-                               throw new SystemException("variable '".$variable."' does not exist in cache resource '".$cache."'", 11008);\r
-                       }\r
-                       \r
-                       return $value[$variable];\r
-               }\r
-               else {\r
-                       return $value;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Rebuilds a cache resource.\r
-        * \r
-        * @param       array           $cacheResource\r
-        * @return      boolean         result\r
-        */\r
-       public function rebuild($cacheResource) {\r
-               // instance cache class\r
-               if (!class_exists($cacheResource['className'])) {\r
-                       throw new SystemException("Unable to find class '".$cacheResource['className']."'", 11001);\r
-               }\r
-               \r
-               // update file last modified time to avoid multiple users rebuilding cache at the same time\r
-               if (get_class($this->getCacheSource()) == 'wcf\system\cache\source\DiskCacheSource') {\r
-                       @touch($cacheResource['file']);\r
-               }\r
-               \r
-               // build cache\r
-               $cacheBuilder = new $cacheResource['className'];\r
-               $value = $cacheBuilder->getData($cacheResource);\r
-\r
-               // save cache\r
-               $this->getCacheSource()->set($cacheResource, $value);\r
-               \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Returns the cache source object.\r
-        *\r
-        * @return      CacheSource\r
-        */\r
-       public function getCacheSource() {\r
-               return $this->cacheSource;\r
-       }\r
+<?php
+namespace wcf\system\cache;
+use wcf\system\exception\SystemException;
+use wcf\system\SingletonFactory;
+use wcf\util\StringUtil;
+
+/**
+ * CacheHandler holds all registered cache resources.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache
+ * @category   Community Framework
+ */
+class CacheHandler extends SingletonFactory {
+       /**
+        * Registered cache resources.
+        * 
+        * @var array
+        */
+       protected $cacheResources = array();
+       
+       /**
+        * cache source object
+        * 
+        * @var wcf\system\cache\source\ICacheSource
+        */
+       protected $cacheSource = null;
+       
+       /**
+        * Creates a new CacheHandler object.
+        */
+       protected function init() {
+               // init cache source object
+               try {
+                       $className = 'wcf\system\cache\source\\'.ucfirst(CACHE_SOURCE_TYPE).'CacheSource';
+                       $this->cacheSource = new $className();
+               }
+               catch (SystemException $e) {
+                       if (CACHE_SOURCE_TYPE != 'disk') {
+                               // fallback to disk cache
+                               $this->cacheSource = new wcf\system\cache\source\DiskCacheSource();
+                       }
+                       else {
+                               throw $e;
+                       }
+               }
+       }
+       
+       /**
+        * Registers a new cache resource.
+        * 
+        * @param       string          $cache          name of this resource
+        * @param       string          $file           data file for this resource
+        * @param       string          $className
+        * @param       integer         $minLifetime
+        * @param       integer         $maxLifetime
+        */
+       public function addResource($cache, $file, $className, $minLifetime = 0, $maxLifetime = 0) {
+               $this->cacheResources[$cache] = array(
+                       'cache' => $cache,
+                       'file' => $file, 
+                       'className' => $className, 
+                       'minLifetime' => $minLifetime,
+                       'maxLifetime' => $maxLifetime
+               );
+       }
+       
+       /**
+        * Deletes a registered cache resource.
+        * 
+        * @param       string          $cache
+        * @param       boolean         $ignoreLifetime
+        */
+       public function clearResource($cache, $ignoreLifetime = false) {
+               if (!isset($this->cacheResources[$cache])) {
+                       throw new SystemException("cache resource '".$cache."' does not exist", 11005);
+               }
+               
+               $this->getCacheSource()->delete($this->cacheResources[$cache], $ignoreLifetime);
+       }
+       
+       /**
+        * Marks cached files as obsolete.
+        *
+        * @param       string          $directory
+        * @param       string          $filepattern
+        * @param       boolean         $forceDelete
+        */
+       public function clear($directory, $filepattern, $forceDelete = false) {
+               $this->getCacheSource()->clear($directory, $filepattern, $forceDelete);
+       }
+       
+       /**
+        * Returns a cached variable.
+        *
+        * @param       string          $cache
+        * @param       string          $variable
+        * @return      mixed           $value
+        */
+       public function get($cache, $variable = '') {
+               if (!isset($this->cacheResources[$cache])) {
+                       throw new SystemException("unknown cache resource '".$cache."'", 11005);
+               }
+               
+               // try to get value
+               $value = $this->getCacheSource()->get($this->cacheResources[$cache]);
+               if ($value === null) {
+                       // rebuild cache
+                       $this->rebuild($this->cacheResources[$cache]);
+                       
+                       // try to get value again
+                       $value = $this->getCacheSource()->get($this->cacheResources[$cache]);
+                       if ($value === null) {
+                               throw new SystemException("cache resource '".$cache."' does not exist", 11005);
+                       }
+               }
+               
+               // return value
+               if (!empty($variable)) {
+                       if (!isset($value[$variable])) {
+                               throw new SystemException("variable '".$variable."' does not exist in cache resource '".$cache."'", 11008);
+                       }
+                       
+                       return $value[$variable];
+               }
+               else {
+                       return $value;
+               }
+       }
+       
+       /**
+        * Rebuilds a cache resource.
+        * 
+        * @param       array           $cacheResource
+        * @return      boolean         result
+        */
+       public function rebuild($cacheResource) {
+               // instance cache class
+               if (!class_exists($cacheResource['className'])) {
+                       throw new SystemException("Unable to find class '".$cacheResource['className']."'", 11001);
+               }
+               
+               // update file last modified time to avoid multiple users rebuilding cache at the same time
+               if (get_class($this->getCacheSource()) == 'wcf\system\cache\source\DiskCacheSource') {
+                       @touch($cacheResource['file']);
+               }
+               
+               // build cache
+               $cacheBuilder = new $cacheResource['className'];
+               $value = $cacheBuilder->getData($cacheResource);
+
+               // save cache
+               $this->getCacheSource()->set($cacheResource, $value);
+               
+               return true;
+       }
+       
+       /**
+        * Returns the cache source object.
+        *
+        * @return      CacheSource
+        */
+       public function getCacheSource() {
+               return $this->cacheSource;
+       }
 }
index da5205178880d26879b839e6b41323a03c4c71d0..aaca73a5853b32e3263f787b3667f6163d3b0133 100644 (file)
@@ -1,22 +1,22 @@
-<?php\r
-namespace wcf\system\cache;\r
-\r
-/**\r
- * A CacheBuilder provides data to the CacheHandler that ought to be cached.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache\r
- * @category   Community Framework\r
- */\r
-interface ICacheBuilder {\r
-       /**\r
-        * Returns the data that ought to be cached.\r
-        *\r
-        * @param       array           $cacheResource\r
-        * @return      array           $data\r
-        */\r
-       public function getData($cacheResource);\r
+<?php
+namespace wcf\system\cache;
+
+/**
+ * A CacheBuilder provides data to the CacheHandler that ought to be cached.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache
+ * @category   Community Framework
+ */
+interface ICacheBuilder {
+       /**
+        * Returns the data that ought to be cached.
+        *
+        * @param       array           $cacheResource
+        * @return      array           $data
+        */
+       public function getData($cacheResource);
 }
index fb869d0f8692c7f5d54f4791718df571d6706e1a..9592028c245db96c82dc5600137f93500ba0e168 100644 (file)
@@ -1,56 +1,56 @@
-<?php\r
-namespace wcf\system\cache;\r
-\r
-/**\r
- * Disables cache functions during the wcf setup.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache\r
- * @category   Community Framework\r
- */\r
-class SetupCacheHandler extends CacheHandler {\r
-       /**\r
-        * @see CacheHandler::addResource()\r
-        */\r
-       public function addResource($cache, $file, $classFile, $minLifetime = 0, $maxLifetime = 0) {\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * @see CacheHandler::clearResource()\r
-        */\r
-       public function clearResource($cache, $ignoreLifetime = false) {\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * @see CacheHandler::clear()\r
-        */\r
-       public function clear($directory, $filepattern, $forceDelete = false) {\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * @see CacheHandler::get()\r
-        */\r
-       public function get($cache, $variable = '') {\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * @see CacheHandler::load()\r
-        */\r
-       public function load($cacheResource, $reload = false) {\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * @see CacheHandler::rebuild()\r
-        */\r
-       public function rebuild($cacheResource, $forceRebuilt = false) {\r
-               return false;\r
-       }\r
+<?php
+namespace wcf\system\cache;
+
+/**
+ * Disables cache functions during the wcf setup.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache
+ * @category   Community Framework
+ */
+class SetupCacheHandler extends CacheHandler {
+       /**
+        * @see CacheHandler::addResource()
+        */
+       public function addResource($cache, $file, $classFile, $minLifetime = 0, $maxLifetime = 0) {
+               return false;
+       }
+       
+       /**
+        * @see CacheHandler::clearResource()
+        */
+       public function clearResource($cache, $ignoreLifetime = false) {
+               return false;
+       }
+       
+       /**
+        * @see CacheHandler::clear()
+        */
+       public function clear($directory, $filepattern, $forceDelete = false) {
+               return false;
+       }
+       
+       /**
+        * @see CacheHandler::get()
+        */
+       public function get($cache, $variable = '') {
+               return false;
+       }
+       
+       /**
+        * @see CacheHandler::load()
+        */
+       public function load($cacheResource, $reload = false) {
+               return false;
+       }
+       
+       /**
+        * @see CacheHandler::rebuild()
+        */
+       public function rebuild($cacheResource, $forceRebuilt = false) {
+               return false;
+       }
 }
index 911704ede4914f1ade4569b5c0d854f13f76bdf6..11d2a9f24720807246b2cfef78ea5948b6272e03 100644 (file)
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\acp\menu\item\ACPMenuItem;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches the acp menu items tree.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderACPMenu implements ICacheBuilder {\r
-       protected $optionCategoryStructure = array();\r
-\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               list($cache, $packageID) = explode('-', $cacheResource['cache']); \r
-               $data = array();\r
-\r
-               // get all menu items and filter menu items with low priority\r
-               $sql = "SELECT          menuItem, menuItemID\r
-                       FROM            wcf".WCF_N."_acp_menu_item menu_item\r
-                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency\r
-                       ON              (menu_item.packageID = package_dependency.dependency)\r
-                       WHERE           package_dependency.packageID = ?\r
-                       ORDER BY        package_dependency.priority ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($packageID));\r
-               $itemIDs = array();\r
-               while ($row = $statement->fetchArray()) {\r
-                       $itemIDs[$row['menuItem']] = $row['menuItemID'];\r
-               }\r
-               \r
-               if (count($itemIDs) > 0) {\r
-                       $conditions = new PreparedStatementConditionBuilder();\r
-                       $conditions->add("menuItemID IN (?)", array($itemIDs));\r
-                       \r
-                       // get needed menu items and build item tree\r
-                       $sql = "SELECT          menu_item.packageID, menuItem, parentMenuItem,\r
-                                               menuItemLink, permissions, options, packageDir\r
-                               FROM            wcf".WCF_N."_acp_menu_item menu_item\r
-                               LEFT JOIN       wcf".WCF_N."_package package\r
-                               ON              (package.packageID = menu_item.packageID)\r
-                               ".$conditions."\r
-                               ORDER BY        showOrder ASC";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute($conditions->getParameters());\r
-                       while ($row = $statement->fetchArray()) {\r
-                               if (!isset($data[$row['parentMenuItem']])) {\r
-                                       $data[$row['parentMenuItem']] = array();\r
-                               }\r
-                               \r
-                               $data[$row['parentMenuItem']][] = new ACPMenuItem(null, $row);\r
-                       }\r
-               }\r
-               \r
-               // get top option categories\r
-               $optionCategories = $this->getTopOptionCategories($packageID);\r
-               if (count($optionCategories) > 0) {\r
-                       if (!isset($data['wcf.acp.menu.link.option.category'])) {\r
-                               $data['wcf.acp.menu.link.option.category'] = array();\r
-                       }\r
-                       \r
-                       // get option category data\r
-                       $conditions = new PreparedStatementConditionBuilder();\r
-                       $conditions->add("categoryID IN (?)", array($optionCategories));\r
-                       \r
-                       $sql = "SELECT          *\r
-                               FROM            wcf".WCF_N."_option_category\r
-                               ".$conditions."\r
-                               ORDER BY        showOrder ASC";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute($conditions->getParameters());\r
-                       while ($row = $statement->fetchArray()) {\r
-                               $data['wcf.acp.menu.link.option.category'][] = new ACPMenuItem(null, array(\r
-                                       'packageID' => $packageID,\r
-                                       'menuItem' => 'wcf.acp.option.category.'.$row['categoryName'],\r
-                                       'parentMenuItem' => 'wcf.acp.menu.link.option.category',\r
-                                       'menuItemLink' => 'index.php?form=Option&categoryID='.$row['categoryID'],\r
-                                       'packageDir' => '',\r
-                                       'permissions' => $row['permissions'],\r
-                                       'options' => $row['options']\r
-                               ));\r
-                       }\r
-               }\r
-               \r
-               return $data;\r
-       }\r
-       \r
-       protected function getTopOptionCategories($packageID) {\r
-               // get all option categories and filter categories with low priority\r
-               $sql = "SELECT          categoryName, categoryID \r
-                       FROM            wcf".WCF_N."_option_category option_category\r
-                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency\r
-                       ON              (package_dependency.dependency = option_category.packageID)\r
-                       WHERE           package_dependency.packageID = ?\r
-                       ORDER BY        package_dependency.priority ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($packageID));\r
-               $optionCategories = array();\r
-               while ($row = $statement->fetchArray()) {\r
-                       $optionCategories[$row['categoryName']] = $row['categoryID'];\r
-               }\r
-               \r
-               $conditions = new PreparedStatementConditionBuilder();\r
-               $conditions->add("categoryID IN (?)", array($optionCategories));\r
-               $statementParameters = $conditions->getParameters();\r
-               array_unshift($statementParameters, $packageID);\r
-               \r
-               $sql = "SELECT          categoryID, parentCategoryName, categoryName,\r
-                                       (\r
-                                               SELECT COUNT(*) FROM wcf".WCF_N."_option WHERE categoryName = category.categoryName AND packageID IN (\r
-                                                       SELECT dependency FROM wcf".WCF_N."_package_dependency WHERE packageID = ?\r
-                                               )\r
-                                       ) AS count\r
-                       FROM            wcf".WCF_N."_option_category category\r
-                       ".$conditions;\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute($statementParameters);\r
-               while ($row = $statement->fetchArray()) {\r
-                       if (!isset($this->optionCategoryStructure[$row['parentCategoryName']])) $this->optionCategoryStructure[$row['parentCategoryName']] = array();\r
-                       $this->optionCategoryStructure[$row['parentCategoryName']][] = $row;\r
-               }\r
-               \r
-               $topOptionCategories = array();\r
-               foreach ($this->optionCategoryStructure[''] as $optionCategory) {\r
-                       $count = $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);\r
-                       if ($count > 0) $topOptionCategories[] = $optionCategory['categoryID'];\r
-               }\r
-               \r
-               return $topOptionCategories;\r
-       }\r
-       \r
-       protected function countOptions($parentCategoryName) {\r
-               if (!isset($this->optionCategoryStructure[$parentCategoryName])) return 0;\r
-               \r
-               $count = 0;\r
-               foreach ($this->optionCategoryStructure[$parentCategoryName] as $optionCategory) {\r
-                       $count += $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);\r
-               }\r
-               \r
-               return $count;\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\acp\menu\item\ACPMenuItem;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches the acp menu items tree.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderACPMenu implements ICacheBuilder {
+       protected $optionCategoryStructure = array();
+
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               list($cache, $packageID) = explode('-', $cacheResource['cache']); 
+               $data = array();
+
+               // get all menu items and filter menu items with low priority
+               $sql = "SELECT          menuItem, menuItemID
+                       FROM            wcf".WCF_N."_acp_menu_item menu_item
+                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency
+                       ON              (menu_item.packageID = package_dependency.dependency)
+                       WHERE           package_dependency.packageID = ?
+                       ORDER BY        package_dependency.priority ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($packageID));
+               $itemIDs = array();
+               while ($row = $statement->fetchArray()) {
+                       $itemIDs[$row['menuItem']] = $row['menuItemID'];
+               }
+               
+               if (count($itemIDs) > 0) {
+                       $conditions = new PreparedStatementConditionBuilder();
+                       $conditions->add("menuItemID IN (?)", array($itemIDs));
+                       
+                       // get needed menu items and build item tree
+                       $sql = "SELECT          menu_item.packageID, menuItem, parentMenuItem,
+                                               menuItemLink, permissions, options, packageDir
+                               FROM            wcf".WCF_N."_acp_menu_item menu_item
+                               LEFT JOIN       wcf".WCF_N."_package package
+                               ON              (package.packageID = menu_item.packageID)
+                               ".$conditions."
+                               ORDER BY        showOrder ASC";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditions->getParameters());
+                       while ($row = $statement->fetchArray()) {
+                               if (!isset($data[$row['parentMenuItem']])) {
+                                       $data[$row['parentMenuItem']] = array();
+                               }
+                               
+                               $data[$row['parentMenuItem']][] = new ACPMenuItem(null, $row);
+                       }
+               }
+               
+               // get top option categories
+               $optionCategories = $this->getTopOptionCategories($packageID);
+               if (count($optionCategories) > 0) {
+                       if (!isset($data['wcf.acp.menu.link.option.category'])) {
+                               $data['wcf.acp.menu.link.option.category'] = array();
+                       }
+                       
+                       // get option category data
+                       $conditions = new PreparedStatementConditionBuilder();
+                       $conditions->add("categoryID IN (?)", array($optionCategories));
+                       
+                       $sql = "SELECT          *
+                               FROM            wcf".WCF_N."_option_category
+                               ".$conditions."
+                               ORDER BY        showOrder ASC";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditions->getParameters());
+                       while ($row = $statement->fetchArray()) {
+                               $data['wcf.acp.menu.link.option.category'][] = new ACPMenuItem(null, array(
+                                       'packageID' => $packageID,
+                                       'menuItem' => 'wcf.acp.option.category.'.$row['categoryName'],
+                                       'parentMenuItem' => 'wcf.acp.menu.link.option.category',
+                                       'menuItemLink' => 'index.php?form=Option&categoryID='.$row['categoryID'],
+                                       'packageDir' => '',
+                                       'permissions' => $row['permissions'],
+                                       'options' => $row['options']
+                               ));
+                       }
+               }
+               
+               return $data;
+       }
+       
+       protected function getTopOptionCategories($packageID) {
+               // get all option categories and filter categories with low priority
+               $sql = "SELECT          categoryName, categoryID 
+                       FROM            wcf".WCF_N."_option_category option_category
+                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency
+                       ON              (package_dependency.dependency = option_category.packageID)
+                       WHERE           package_dependency.packageID = ?
+                       ORDER BY        package_dependency.priority ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($packageID));
+               $optionCategories = array();
+               while ($row = $statement->fetchArray()) {
+                       $optionCategories[$row['categoryName']] = $row['categoryID'];
+               }
+               
+               $conditions = new PreparedStatementConditionBuilder();
+               $conditions->add("categoryID IN (?)", array($optionCategories));
+               $statementParameters = $conditions->getParameters();
+               array_unshift($statementParameters, $packageID);
+               
+               $sql = "SELECT          categoryID, parentCategoryName, categoryName,
+                                       (
+                                               SELECT COUNT(*) FROM wcf".WCF_N."_option WHERE categoryName = category.categoryName AND packageID IN (
+                                                       SELECT dependency FROM wcf".WCF_N."_package_dependency WHERE packageID = ?
+                                               )
+                                       ) AS count
+                       FROM            wcf".WCF_N."_option_category category
+                       ".$conditions;
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute($statementParameters);
+               while ($row = $statement->fetchArray()) {
+                       if (!isset($this->optionCategoryStructure[$row['parentCategoryName']])) $this->optionCategoryStructure[$row['parentCategoryName']] = array();
+                       $this->optionCategoryStructure[$row['parentCategoryName']][] = $row;
+               }
+               
+               $topOptionCategories = array();
+               foreach ($this->optionCategoryStructure[''] as $optionCategory) {
+                       $count = $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);
+                       if ($count > 0) $topOptionCategories[] = $optionCategory['categoryID'];
+               }
+               
+               return $topOptionCategories;
+       }
+       
+       protected function countOptions($parentCategoryName) {
+               if (!isset($this->optionCategoryStructure[$parentCategoryName])) return 0;
+               
+               $count = 0;
+               foreach ($this->optionCategoryStructure[$parentCategoryName] as $optionCategory) {
+                       $count += $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);
+               }
+               
+               return $count;
+       }
+}
index 4da8d600c4a98b23a1f73b9788fce0c8609591ab..776ebb2c29eb0c308b517469924d8cd7245b03f6 100644 (file)
@@ -1,77 +1,77 @@
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\event\listener\EventHandler;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Caches the event listeners.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderEventListener implements ICacheBuilder {\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               list($cache, $packageID) = explode('-', $cacheResource['cache']); \r
-               $data = array(\r
-                       'actions' => array('user' => array(), 'admin' => array()),\r
-                       'inheritedActions' => array('user' => array(), 'admin' => array())\r
-               );\r
-               \r
-               // get all listeners and filter options with low priority\r
-               $sql = "SELECT          event_listener.*\r
-                       FROM            wcf".WCF_N."_event_listener event_listener\r
-                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency\r
-                       ON              (package_dependency.dependency = event_listener.packageID)\r
-                       WHERE           package_dependency.packageID = ?\r
-                       ORDER BY        package_dependency.priority ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($packageID));\r
-               while ($row = $statement->fetchArray()) {\r
-                       // distinguish between inherited actions and non-inherited actions\r
-                       if (!$row['inherit']) {\r
-                               $data['actions'][EventHandler::generateKey($row['eventClassName'], $row['eventName'])][] = $row;\r
-                       }\r
-                       else {\r
-                               if (!isset($data['inheritedActions'][$row['eventClassName']])) $data['inheritedActions'][$row['eventClassName']] = array();\r
-                               $data['inheritedActions'][$row['eventClassName']][$row['eventName']][] = $row;  \r
-                       }\r
-               }\r
-               \r
-               // sort data by nice value and class name\r
-               foreach ($data['actions'] as $key => $listeners) {\r
-                       uasort($data['actions'][$key], array(__CLASS__, 'sortListeners'));\r
-               }\r
-               \r
-               foreach ($data['inheritedActions'] as $class => $listeners) {\r
-                       foreach ($listeners as $key => $val) {\r
-                               uasort($data['inheritedActions'][$class][$key], array(__CLASS__, 'sortListeners'));\r
-                       }\r
-               }\r
-               \r
-               return $data;\r
-       }\r
-       \r
-       /**\r
-        * Sorts the event listeners alphabetically.\r
-        */\r
-       public static function sortListeners($listenerA, $listenerB) {\r
-               if ($listenerA['niceValue'] < $listenerB['niceValue']) {\r
-                       return -1;\r
-               }\r
-               else if ($listenerA['niceValue'] > $listenerB['niceValue']) {\r
-                       return 1;\r
-               }\r
-               else {\r
-                       return strcmp($listenerA['listenerClassName'], $listenerB['listenerClassName']);\r
-               }       \r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\event\listener\EventHandler;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * Caches the event listeners.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderEventListener implements ICacheBuilder {
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               list($cache, $packageID) = explode('-', $cacheResource['cache']); 
+               $data = array(
+                       'actions' => array('user' => array(), 'admin' => array()),
+                       'inheritedActions' => array('user' => array(), 'admin' => array())
+               );
+               
+               // get all listeners and filter options with low priority
+               $sql = "SELECT          event_listener.*
+                       FROM            wcf".WCF_N."_event_listener event_listener
+                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency
+                       ON              (package_dependency.dependency = event_listener.packageID)
+                       WHERE           package_dependency.packageID = ?
+                       ORDER BY        package_dependency.priority ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($packageID));
+               while ($row = $statement->fetchArray()) {
+                       // distinguish between inherited actions and non-inherited actions
+                       if (!$row['inherit']) {
+                               $data['actions'][EventHandler::generateKey($row['eventClassName'], $row['eventName'])][] = $row;
+                       }
+                       else {
+                               if (!isset($data['inheritedActions'][$row['eventClassName']])) $data['inheritedActions'][$row['eventClassName']] = array();
+                               $data['inheritedActions'][$row['eventClassName']][$row['eventName']][] = $row;  
+                       }
+               }
+               
+               // sort data by nice value and class name
+               foreach ($data['actions'] as $key => $listeners) {
+                       uasort($data['actions'][$key], array(__CLASS__, 'sortListeners'));
+               }
+               
+               foreach ($data['inheritedActions'] as $class => $listeners) {
+                       foreach ($listeners as $key => $val) {
+                               uasort($data['inheritedActions'][$class][$key], array(__CLASS__, 'sortListeners'));
+                       }
+               }
+               
+               return $data;
+       }
+       
+       /**
+        * Sorts the event listeners alphabetically.
+        */
+       public static function sortListeners($listenerA, $listenerB) {
+               if ($listenerA['niceValue'] < $listenerB['niceValue']) {
+                       return -1;
+               }
+               else if ($listenerA['niceValue'] > $listenerB['niceValue']) {
+                       return 1;
+               }
+               else {
+                       return strcmp($listenerA['listenerClassName'], $listenerB['listenerClassName']);
+               }       
+       }
+}
index 029678f8e58f5f298945492bc7b47d06bc7e15b3..1908fab53d30a2e43b778e0dea7b3ddb7854e7d8 100644 (file)
@@ -1,90 +1,90 @@
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches languages, language to packages relation, package to languages relation\r
- * and the id of the default language. \r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderLanguage implements ICacheBuilder {\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               $languageToPackages = array();\r
-               $data = array(\r
-                       'codes' => array(),\r
-                       'languages' => array(), \r
-                       'packages' => array(),\r
-                       'default' => 0,\r
-                       'categories' => array()\r
-               );\r
-               \r
-               // get language to packages\r
-               $sql = "SELECT          package.languageID, package.packageID\r
-                       FROM            wcf".WCF_N."_language_to_package package\r
-                       LEFT JOIN       wcf".WCF_N."_language language\r
-                       ON              (language.languageID = package.languageID)\r
-                       ORDER BY        language.isDefault DESC,\r
-                                       language.languageCode ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               while ($row = $statement->fetchArray()) {\r
-                       // package to languages\r
-                       if (!isset($data['packages'][$row['packageID']])) {\r
-                               $data['packages'][$row['packageID']] = array();\r
-                       }\r
-                       $data['packages'][$row['packageID']][] = $row['languageID'];\r
-                       \r
-                       // language to packages\r
-                       if (!isset($languageToPackages[$row['languageID']])) {\r
-                               $languageToPackages[$row['languageID']] = array();\r
-                       }\r
-                       $languageToPackages[$row['languageID']][] = $row['packageID'];\r
-               }\r
-               \r
-               // get languages\r
-               $sql = "SELECT  *\r
-                       FROM    wcf".WCF_N."_language";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               while ($row = $statement->fetchArray()) {\r
-                       // language data\r
-                       $data['languages'][$row['languageID']] = $row;\r
-                       \r
-                       // language to packages\r
-                       if (!isset($languageToPackages[$row['languageID']])) {\r
-                               $languageToPackages[$row['languageID']] = array();\r
-                       }\r
-                       $data['languages'][$row['languageID']]['packages'] = $languageToPackages[$row['languageID']];\r
-                       \r
-                       // default language\r
-                       if ($row['isDefault']) {\r
-                               $data['default'] = $row['languageID'];\r
-                       }\r
-                       \r
-                       // language code to language id\r
-                       $data['codes'][$row['languageCode']] = $row['languageID'];\r
-               }\r
-               \r
-               // get language categories\r
-               $sql = "SELECT  *\r
-                       FROM    wcf".WCF_N."_language_category";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               while ($row = $statement->fetchArray()) {\r
-                       // package to languages\r
-                       $data['categories'][$row['languageCategory']] = $row;\r
-               }\r
-\r
-               return $data;\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches languages, language to packages relation, package to languages relation
+ * and the id of the default language. 
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderLanguage implements ICacheBuilder {
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               $languageToPackages = array();
+               $data = array(
+                       'codes' => array(),
+                       'languages' => array(), 
+                       'packages' => array(),
+                       'default' => 0,
+                       'categories' => array()
+               );
+               
+               // get language to packages
+               $sql = "SELECT          package.languageID, package.packageID
+                       FROM            wcf".WCF_N."_language_to_package package
+                       LEFT JOIN       wcf".WCF_N."_language language
+                       ON              (language.languageID = package.languageID)
+                       ORDER BY        language.isDefault DESC,
+                                       language.languageCode ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute();
+               while ($row = $statement->fetchArray()) {
+                       // package to languages
+                       if (!isset($data['packages'][$row['packageID']])) {
+                               $data['packages'][$row['packageID']] = array();
+                       }
+                       $data['packages'][$row['packageID']][] = $row['languageID'];
+                       
+                       // language to packages
+                       if (!isset($languageToPackages[$row['languageID']])) {
+                               $languageToPackages[$row['languageID']] = array();
+                       }
+                       $languageToPackages[$row['languageID']][] = $row['packageID'];
+               }
+               
+               // get languages
+               $sql = "SELECT  *
+                       FROM    wcf".WCF_N."_language";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute();
+               while ($row = $statement->fetchArray()) {
+                       // language data
+                       $data['languages'][$row['languageID']] = $row;
+                       
+                       // language to packages
+                       if (!isset($languageToPackages[$row['languageID']])) {
+                               $languageToPackages[$row['languageID']] = array();
+                       }
+                       $data['languages'][$row['languageID']]['packages'] = $languageToPackages[$row['languageID']];
+                       
+                       // default language
+                       if ($row['isDefault']) {
+                               $data['default'] = $row['languageID'];
+                       }
+                       
+                       // language code to language id
+                       $data['codes'][$row['languageCode']] = $row['languageID'];
+               }
+               
+               // get language categories
+               $sql = "SELECT  *
+                       FROM    wcf".WCF_N."_language_category";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute();
+               while ($row = $statement->fetchArray()) {
+                       // package to languages
+                       $data['categories'][$row['languageCategory']] = $row;
+               }
+
+               return $data;
+       }
+}
index 0f834e32e243f2262c34ee507233b8106db518fa..3a5432f5757180e23f43ed157187e5745501c3d6 100644 (file)
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\option\category\OptionCategory;\r
-use wcf\data\option\Option;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches the options and option categories\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderOption implements ICacheBuilder {\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               $information = explode('-', $cacheResource['cache']);\r
-               if (count($information) == 3) {\r
-                       $type = $information[0].'_';\r
-                       $packageID = $information[2];\r
-               }\r
-               else {\r
-                       $type = '';\r
-                       $packageID = $information[1];\r
-               }\r
-                \r
-               $data = array(\r
-                       'categories' => array(),\r
-                       'options' => array(),\r
-                       'categoryStructure' => array(),\r
-                       'optionToCategories' => array()\r
-               );\r
-\r
-               // option categories\r
-               // get all option categories and sort categories by priority\r
-               $sql = "SELECT          categoryName, categoryID \r
-                       FROM            wcf".WCF_N."_".$type."option_category option_category\r
-                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency\r
-                       ON              (package_dependency.dependency = option_category.packageID)\r
-                       WHERE           package_dependency.packageID = ?\r
-                       ORDER BY        package_dependency.priority ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($packageID));\r
-               $optionCategories = array();\r
-               while ($row = $statement->fetchArray()) {\r
-                       $optionCategories[$row['categoryName']] = $row['categoryID'];\r
-               }\r
-               \r
-               if (count($optionCategories) > 0) {\r
-                       // get needed option categories\r
-                       $conditions = new PreparedStatementConditionBuilder();\r
-                       $conditions->add("categoryID IN (?)", array($optionCategories));\r
-                       \r
-                       $sql = "SELECT          option_category.*, package.packageDir\r
-                               FROM            wcf".WCF_N."_".$type."option_category option_category\r
-                               LEFT JOIN       wcf".WCF_N."_package package\r
-                               ON              (package.packageID = option_category.packageID)\r
-                               ".$conditions."\r
-                               ORDER BY        showOrder ASC";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute($conditions->getParameters());\r
-                       while ($row = $statement->fetchArray()) {\r
-                               $data['categories'][$row['categoryName']] = new OptionCategory(null, $row);\r
-                               if (!isset($data['categoryStructure'][$row['parentCategoryName']])) {\r
-                                       $data['categoryStructure'][$row['parentCategoryName']] = array();\r
-                               }\r
-                               \r
-                               $data['categoryStructure'][$row['parentCategoryName']][] = $row['categoryName'];\r
-                       }\r
-               }\r
-               \r
-               // options\r
-               // get all options and sort options by priority\r
-               $optionIDs = array();\r
-               $sql = "SELECT          optionName, optionID \r
-                       FROM            wcf".WCF_N."_".$type."option option_table\r
-                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency\r
-                       ON              (package_dependency.dependency = option_table.packageID)\r
-                       WHERE           package_dependency.packageID = ?\r
-                       ORDER BY        package_dependency.priority ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($packageID));\r
-               while ($row = $statement->fetchArray()) {\r
-                       $optionIDs[$row['optionName']] = $row['optionID'];\r
-               }\r
-               \r
-               if (count($optionIDs) > 0) {\r
-                       // get needed options\r
-                       $conditions = new PreparedStatementConditionBuilder();\r
-                       $conditions->add("optionID IN (?)", array($optionIDs));\r
-                       \r
-                       $sql = "SELECT          *\r
-                               FROM            wcf".WCF_N."_".$type."option\r
-                               ".$conditions."\r
-                               ORDER BY        showOrder ASC";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute($conditions->getParameters());\r
-                       while ($row = $statement->fetchArray()) {\r
-                               $data['options'][$row['optionName']] = new Option(null, $row);\r
-                               if (!isset($data['optionToCategories'][$row['categoryName']])) {\r
-                                       $data['optionToCategories'][$row['categoryName']] = array();\r
-                               }\r
-                               \r
-                               $data['optionToCategories'][$row['categoryName']][] = $row['optionName'];\r
-                       }\r
-               }\r
-               \r
-               return $data;\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\option\category\OptionCategory;
+use wcf\data\option\Option;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches the options and option categories
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderOption implements ICacheBuilder {
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               $information = explode('-', $cacheResource['cache']);
+               if (count($information) == 3) {
+                       $type = $information[0].'_';
+                       $packageID = $information[2];
+               }
+               else {
+                       $type = '';
+                       $packageID = $information[1];
+               }
+                
+               $data = array(
+                       'categories' => array(),
+                       'options' => array(),
+                       'categoryStructure' => array(),
+                       'optionToCategories' => array()
+               );
+
+               // option categories
+               // get all option categories and sort categories by priority
+               $sql = "SELECT          categoryName, categoryID 
+                       FROM            wcf".WCF_N."_".$type."option_category option_category
+                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency
+                       ON              (package_dependency.dependency = option_category.packageID)
+                       WHERE           package_dependency.packageID = ?
+                       ORDER BY        package_dependency.priority ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($packageID));
+               $optionCategories = array();
+               while ($row = $statement->fetchArray()) {
+                       $optionCategories[$row['categoryName']] = $row['categoryID'];
+               }
+               
+               if (count($optionCategories) > 0) {
+                       // get needed option categories
+                       $conditions = new PreparedStatementConditionBuilder();
+                       $conditions->add("categoryID IN (?)", array($optionCategories));
+                       
+                       $sql = "SELECT          option_category.*, package.packageDir
+                               FROM            wcf".WCF_N."_".$type."option_category option_category
+                               LEFT JOIN       wcf".WCF_N."_package package
+                               ON              (package.packageID = option_category.packageID)
+                               ".$conditions."
+                               ORDER BY        showOrder ASC";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditions->getParameters());
+                       while ($row = $statement->fetchArray()) {
+                               $data['categories'][$row['categoryName']] = new OptionCategory(null, $row);
+                               if (!isset($data['categoryStructure'][$row['parentCategoryName']])) {
+                                       $data['categoryStructure'][$row['parentCategoryName']] = array();
+                               }
+                               
+                               $data['categoryStructure'][$row['parentCategoryName']][] = $row['categoryName'];
+                       }
+               }
+               
+               // options
+               // get all options and sort options by priority
+               $optionIDs = array();
+               $sql = "SELECT          optionName, optionID 
+                       FROM            wcf".WCF_N."_".$type."option option_table
+                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency
+                       ON              (package_dependency.dependency = option_table.packageID)
+                       WHERE           package_dependency.packageID = ?
+                       ORDER BY        package_dependency.priority ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($packageID));
+               while ($row = $statement->fetchArray()) {
+                       $optionIDs[$row['optionName']] = $row['optionID'];
+               }
+               
+               if (count($optionIDs) > 0) {
+                       // get needed options
+                       $conditions = new PreparedStatementConditionBuilder();
+                       $conditions->add("optionID IN (?)", array($optionIDs));
+                       
+                       $sql = "SELECT          *
+                               FROM            wcf".WCF_N."_".$type."option
+                               ".$conditions."
+                               ORDER BY        showOrder ASC";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditions->getParameters());
+                       while ($row = $statement->fetchArray()) {
+                               $data['options'][$row['optionName']] = new Option(null, $row);
+                               if (!isset($data['optionToCategories'][$row['categoryName']])) {
+                                       $data['optionToCategories'][$row['categoryName']] = array();
+                               }
+                               
+                               $data['optionToCategories'][$row['categoryName']][] = $row['optionName'];
+                       }
+               }
+               
+               return $data;
+       }
+}
index bebe38a088b332e620c7493ae0509f5e6e3a74d9..592a1216771ceacda64d4f1b30cdfd0d2981910f 100644 (file)
@@ -1,28 +1,28 @@
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\package\PackageList;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches all registered packages.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderPackage implements ICacheBuilder {\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               $packageList = new PackageList();\r
-               $packageList->sqlLimit = 0;\r
-               $packageList->readObjects();\r
-               \r
-               return $packageList->getObjects();\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\package\PackageList;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches all registered packages.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderPackage implements ICacheBuilder {
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               $packageList = new PackageList();
+               $packageList->sqlLimit = 0;
+               $packageList->readObjects();
+               
+               return $packageList->getObjects();
+       }
+}
index b7d944a2a1c4841aef9acad8c318aeef6899e0e8..65ad4921a38e9859f9ace581115f68270a94ffb2 100644 (file)
@@ -1,28 +1,28 @@
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\spider\SpiderList;\r
-use wcf\system\cache\ICacheBuilder;\r
-\r
-/**\r
- * Caches the list of search engine spiders.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderSpider implements ICacheBuilder {\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               $spiderList = new SpiderList();\r
-               $spiderList->sqlOrderBy = "spider.spiderID ASC";\r
-               $spiderList->sqlLimit = 0;\r
-               $spiderList->readObjects();\r
-               \r
-               return $spiderList->getObjects();\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\spider\SpiderList;
+use wcf\system\cache\ICacheBuilder;
+
+/**
+ * Caches the list of search engine spiders.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderSpider implements ICacheBuilder {
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               $spiderList = new SpiderList();
+               $spiderList->sqlOrderBy = "spider.spiderID ASC";
+               $spiderList->sqlLimit = 0;
+               $spiderList->readObjects();
+               
+               return $spiderList->getObjects();
+       }
+}
index 9834cb8ecfb70236b46b1e1e9efaf0eaa1759c2c..05097f18b31f9383b8a213bd9fde26d1fcc3a32a 100644 (file)
@@ -1,68 +1,68 @@
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\style\Style;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches the styles and style variables.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderStyle implements ICacheBuilder {\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               $data = array('default' => 0, 'styles' => array(), 'packages' => array());\r
-               \r
-               // get all styles\r
-               $sql = "SELECT          *\r
-                       FROM            wcf".WCF_N."_style\r
-                       ORDER BY        styleName ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               while ($row = $statement->fetchArray()) {\r
-                       if ($row['isDefault']) $data['default'] = $row['styleID'];\r
-                       $row['variables'] = array();\r
-                       \r
-                       // get variable\r
-                       $sql = "SELECT  *\r
-                               FROM    wcf".WCF_N."_style_variable\r
-                               WHERE   styleID = ?";\r
-                       $statement2 = WCF::getDB()->prepareStatement($sql);\r
-                       $statement2->execute(array($row['styleID']));\r
-                       while ($row = $statement2->fetchArray()) {\r
-                               \r
-                               $row['variables'][$row2['variableName']] = $row2['variableValue'];\r
-                       }\r
-                       \r
-                       $data['styles'][$row['styleID']] = new Style(null, $row);\r
-               }\r
-               \r
-               // get style to packages\r
-               $sql = "SELECT          *\r
-                       FROM            wcf".WCF_N."_style_to_package\r
-                       ORDER BY        packageID ASC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute();\r
-               while ($row = $statement->fetchArray()) {\r
-                       \r
-                       if (!isset($data['packages'][$row['packageID']])) {\r
-                               $data['packages'][$row['packageID']] = array('default' => 0, 'disabled' => array());\r
-                       }\r
-                       \r
-                       if ($row['isDefault']) {\r
-                               $data['packages'][$row['packageID']]['default'] = $row['styleID'];\r
-                       }\r
-                       $data['packages'][$row['packageID']]['disabled'][$row['styleID']] = $row['disabled'];\r
-               }\r
-               \r
-               return $data;\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\style\Style;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches the styles and style variables.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderStyle implements ICacheBuilder {
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               $data = array('default' => 0, 'styles' => array(), 'packages' => array());
+               
+               // get all styles
+               $sql = "SELECT          *
+                       FROM            wcf".WCF_N."_style
+                       ORDER BY        styleName ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute();
+               while ($row = $statement->fetchArray()) {
+                       if ($row['isDefault']) $data['default'] = $row['styleID'];
+                       $row['variables'] = array();
+                       
+                       // get variable
+                       $sql = "SELECT  *
+                               FROM    wcf".WCF_N."_style_variable
+                               WHERE   styleID = ?";
+                       $statement2 = WCF::getDB()->prepareStatement($sql);
+                       $statement2->execute(array($row['styleID']));
+                       while ($row = $statement2->fetchArray()) {
+                               
+                               $row['variables'][$row2['variableName']] = $row2['variableValue'];
+                       }
+                       
+                       $data['styles'][$row['styleID']] = new Style(null, $row);
+               }
+               
+               // get style to packages
+               $sql = "SELECT          *
+                       FROM            wcf".WCF_N."_style_to_package
+                       ORDER BY        packageID ASC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute();
+               while ($row = $statement->fetchArray()) {
+                       
+                       if (!isset($data['packages'][$row['packageID']])) {
+                               $data['packages'][$row['packageID']] = array('default' => 0, 'disabled' => array());
+                       }
+                       
+                       if ($row['isDefault']) {
+                               $data['packages'][$row['packageID']]['default'] = $row['styleID'];
+                       }
+                       $data['packages'][$row['packageID']]['disabled'][$row['styleID']] = $row['disabled'];
+               }
+               
+               return $data;
+       }
+}
index 5ab61ad4786b548fd81f8f985b5f723726f0b9f4..95cf542b66ddfa5ef416c4fc99136750fd206ba8 100644 (file)
@@ -1,58 +1,58 @@
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches the structure of templates.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderTemplate implements ICacheBuilder {\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               $information = explode('-', $cacheResource['cache']);\r
-               if (count($information) == 3) {\r
-                       $prefix = $information[0].'_';\r
-                       $packageID = $information[2];\r
-               }\r
-               else {\r
-                       $prefix = '';\r
-                       $packageID = $information[1];\r
-               }\r
-               \r
-               $data = array();\r
-               \r
-               // get package directory for given package id\r
-               $sql = "SELECT  packageDir\r
-                       FROM    wcf".WCF_N."_package\r
-                       WHERE   packageID = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($packageID));\r
-               $row = $statement->fetchArray();\r
-               \r
-               // get all templates and filter options with low priority\r
-               $sql = "SELECT          templateName, template.packageID \r
-                       FROM            wcf".WCF_N."_".$prefix."template template\r
-                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency\r
-                       ON              (package_dependency.dependency = template.packageID)\r
-                       WHERE           package_dependency.packageID = ?\r
-                       ORDER BY        package_dependency.priority DESC";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($packageID));\r
-               while ($row = $statement->fetchArray()) {\r
-                       if (!isset($data[$row['templateName']]) || $packageID == $row['packageID']) {\r
-                               $data[$row['templateName']] = $row['packageID'];\r
-                       }\r
-               }\r
-               \r
-               return $data;\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches the structure of templates.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderTemplate implements ICacheBuilder {
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               $information = explode('-', $cacheResource['cache']);
+               if (count($information) == 3) {
+                       $prefix = $information[0].'_';
+                       $packageID = $information[2];
+               }
+               else {
+                       $prefix = '';
+                       $packageID = $information[1];
+               }
+               
+               $data = array();
+               
+               // get package directory for given package id
+               $sql = "SELECT  packageDir
+                       FROM    wcf".WCF_N."_package
+                       WHERE   packageID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($packageID));
+               $row = $statement->fetchArray();
+               
+               // get all templates and filter options with low priority
+               $sql = "SELECT          templateName, template.packageID 
+                       FROM            wcf".WCF_N."_".$prefix."template template
+                       LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency
+                       ON              (package_dependency.dependency = template.packageID)
+                       WHERE           package_dependency.packageID = ?
+                       ORDER BY        package_dependency.priority DESC";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($packageID));
+               while ($row = $statement->fetchArray()) {
+                       if (!isset($data[$row['templateName']]) || $packageID == $row['packageID']) {
+                               $data[$row['templateName']] = $row['packageID'];
+                       }
+               }
+               
+               return $data;
+       }
+}
index 94731a3ef98721ee628860eb9fd075d8bc07261f..a5f3fbb4fa606cc68a7ccbee1383fd94e757d7cf 100644 (file)
@@ -1,41 +1,41 @@
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\user\group\UserGroupList;\r
-use wcf\system\cache\ICacheBuilder;\r
-\r
-/**\r
- * Caches all user groups.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderUserGroup implements ICacheBuilder {\r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               $data = array('types' => array(), 'groups' => array());\r
-\r
-               // get all user groups\r
-               $groupList = new UserGroupList();\r
-               $groupList->sqlOrderBy = "user_group.groupName";\r
-               $groupList->sqlLimit = 0;\r
-               $groupList->readObjects();\r
-               $groups = $groupList->getObjects();\r
-               \r
-               foreach ($groups as $group) {\r
-                       if (!isset($data['types'][$group->groupType])) {\r
-                               $data['types'][$group->groupType] = array();\r
-                       }\r
-                       \r
-                       $data['types'][$group->groupType][] = $group->groupID;\r
-                       $data['groups'][$group->groupID] = $group;\r
-               }\r
-               \r
-               return $data;\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\user\group\UserGroupList;
+use wcf\system\cache\ICacheBuilder;
+
+/**
+ * Caches all user groups.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderUserGroup implements ICacheBuilder {
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               $data = array('types' => array(), 'groups' => array());
+
+               // get all user groups
+               $groupList = new UserGroupList();
+               $groupList->sqlOrderBy = "user_group.groupName";
+               $groupList->sqlLimit = 0;
+               $groupList->readObjects();
+               $groups = $groupList->getObjects();
+               
+               foreach ($groups as $group) {
+                       if (!isset($data['types'][$group->groupType])) {
+                               $data['types'][$group->groupType] = array();
+                       }
+                       
+                       $data['types'][$group->groupType][] = $group->groupID;
+                       $data['groups'][$group->groupID] = $group;
+               }
+               
+               return $data;
+       }
+}
index 5c2ea3b5ff3aa07316f4d8392256c127d34b3895..dcce1093455c4a1d889463aaf5f353d40cc2200c 100644 (file)
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\WCF;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * Caches the merged group options of a group combination.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category   Community Framework\r
- */\r
-class CacheBuilderUserGroupPermission implements ICacheBuilder {\r
-       protected $typeObjects = array();\r
-       \r
-       /**\r
-        * @see wcf\system\cache\ICacheBuilder::getData()\r
-        */\r
-       public function getData($cacheResource) {\r
-               list($cache, $packageID, $groupIDs) = explode('-', $cacheResource['cache']);\r
-               $data = array();\r
-               \r
-               // get all options and filter options with low priority\r
-               if ($packageID == 0) {\r
-                       // during the installation of the package wcf\r
-                       $sql = "SELECT          optionName, optionID \r
-                               FROM            wcf".WCF_N."_user_group_option\r
-                               WHERE           packageID IS NULL";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute();\r
-               }\r
-               else {\r
-                       $sql = "SELECT          optionName, optionID \r
-                               FROM            wcf".WCF_N."_user_group_option option_table\r
-                               LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency\r
-                               ON              (package_dependency.dependency = option_table.packageID)\r
-                               WHERE           package_dependency.packageID = ?\r
-                               ORDER BY        package_dependency.priority ASC";\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute(array($packageID));\r
-               }\r
-               \r
-               $options = array();\r
-               while ($row = $statement->fetchArray()) {\r
-                       $options[$row['optionName']] = $row['optionID'];\r
-               }\r
-               \r
-               if (count($options) > 0) {\r
-                       // get needed options\r
-                       $conditions = new PreparedStatementConditionBuilder();\r
-                       $conditions->add("option_value.groupID IN (?)", array(explode(',', $groupIDs)));\r
-                       $conditions->add("option_value.optionID IN (?)", array($options));\r
-                       \r
-                       $sql = "SELECT          option_table.optionName, option_table.optionType, option_value.optionValue\r
-                               FROM            wcf".WCF_N."_user_group_option_value option_value\r
-                               LEFT JOIN       wcf".WCF_N."_user_group_option option_table\r
-                               ON              (option_table.optionID = option_value.optionID)\r
-                               ".$conditions;\r
-                       $statement = WCF::getDB()->prepareStatement($sql);\r
-                       $statement->execute($conditions->getParameters());\r
-                       while ($row = $statement->fetchArray()) {\r
-                               if (!isset($data[$row['optionName']])) {\r
-                                       $data[$row['optionName']] = array('type' => $row['optionType'], 'values' => array());\r
-                               }\r
-                               \r
-                               $data[$row['optionName']]['values'][] = $row['optionValue'];\r
-                       }\r
-                       \r
-                       // merge values\r
-                       foreach ($data as $optionName => $option) {\r
-                               if (count($option['values']) == 1) {\r
-                                       $result = $option['values'][0];\r
-                               }\r
-                               else {\r
-                                       $typeObj = $this->getTypeObject($option['type']);\r
-                                       $result = $typeObj->merge($option['values']);\r
-                               }\r
-                               \r
-                               // unset false values\r
-                               if ($result === false) {\r
-                                       unset($data[$optionName]);\r
-                               }\r
-                               else {\r
-                                       $data[$optionName] = $result;\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               $data['groupIDs'] = $groupIDs;\r
-               return $data;\r
-       }\r
-       \r
-       /**\r
-        * Returns an object of the requested group option type.\r
-        * \r
-        * @param       string                  $type\r
-        * @return      wcf\system\option\group\IGroupOptionType\r
-        */\r
-       protected function getTypeObject($type) {\r
-               if (!isset($this->typeObjects[$type])) {\r
-                       $className = 'wcf\system\option\group\GroupOptionType'.ucfirst($type);\r
-                       \r
-                       // validate class\r
-                       if (!class_exists($className)) {\r
-                               throw new SystemException("unable to find class '".$className."'", 11001);\r
-                       }\r
-                       if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\group\IGroupOptionType')) {\r
-                               throw new SystemException("'".$className."' should implement wcf\system\option\group\IGroupOptionType");\r
-                       }\r
-                       \r
-                       // create instance\r
-                       $this->typeObjects[$type] = new $className();\r
-               }\r
-               \r
-               return $this->typeObjects[$type];\r
-       }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\SystemException;
+use wcf\system\WCF;
+use wcf\util\ClassUtil;
+
+/**
+ * Caches the merged group options of a group combination.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category   Community Framework
+ */
+class CacheBuilderUserGroupPermission implements ICacheBuilder {
+       protected $typeObjects = array();
+       
+       /**
+        * @see wcf\system\cache\ICacheBuilder::getData()
+        */
+       public function getData($cacheResource) {
+               list($cache, $packageID, $groupIDs) = explode('-', $cacheResource['cache']);
+               $data = array();
+               
+               // get all options and filter options with low priority
+               if ($packageID == 0) {
+                       // during the installation of the package wcf
+                       $sql = "SELECT          optionName, optionID 
+                               FROM            wcf".WCF_N."_user_group_option
+                               WHERE           packageID IS NULL";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute();
+               }
+               else {
+                       $sql = "SELECT          optionName, optionID 
+                               FROM            wcf".WCF_N."_user_group_option option_table
+                               LEFT JOIN       wcf".WCF_N."_package_dependency package_dependency
+                               ON              (package_dependency.dependency = option_table.packageID)
+                               WHERE           package_dependency.packageID = ?
+                               ORDER BY        package_dependency.priority ASC";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute(array($packageID));
+               }
+               
+               $options = array();
+               while ($row = $statement->fetchArray()) {
+                       $options[$row['optionName']] = $row['optionID'];
+               }
+               
+               if (count($options) > 0) {
+                       // get needed options
+                       $conditions = new PreparedStatementConditionBuilder();
+                       $conditions->add("option_value.groupID IN (?)", array(explode(',', $groupIDs)));
+                       $conditions->add("option_value.optionID IN (?)", array($options));
+                       
+                       $sql = "SELECT          option_table.optionName, option_table.optionType, option_value.optionValue
+                               FROM            wcf".WCF_N."_user_group_option_value option_value
+                               LEFT JOIN       wcf".WCF_N."_user_group_option option_table
+                               ON              (option_table.optionID = option_value.optionID)
+                               ".$conditions;
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditions->getParameters());
+                       while ($row = $statement->fetchArray()) {
+                               if (!isset($data[$row['optionName']])) {
+                                       $data[$row['optionName']] = array('type' => $row['optionType'], 'values' => array());
+                               }
+                               
+                               $data[$row['optionName']]['values'][] = $row['optionValue'];
+                       }
+                       
+                       // merge values
+                       foreach ($data as $optionName => $option) {
+                               if (count($option['values']) == 1) {
+                                       $result = $option['values'][0];
+                               }
+                               else {
+                                       $typeObj = $this->getTypeObject($option['type']);
+                                       $result = $typeObj->merge($option['values']);
+                               }
+                               
+                               // unset false values
+                               if ($result === false) {
+                                       unset($data[$optionName]);
+                               }
+                               else {
+                                       $data[$optionName] = $result;
+                               }
+                       }
+               }
+               
+               $data['groupIDs'] = $groupIDs;
+               return $data;
+       }
+       
+       /**
+        * Returns an object of the requested group option type.
+        * 
+        * @param       string                  $type
+        * @return      wcf\system\option\group\IGroupOptionType
+        */
+       protected function getTypeObject($type) {
+               if (!isset($this->typeObjects[$type])) {
+                       $className = 'wcf\system\option\group\GroupOptionType'.ucfirst($type);
+                       
+                       // validate class
+                       if (!class_exists($className)) {
+                               throw new SystemException("unable to find class '".$className."'", 11001);
+                       }
+                       if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\group\IGroupOptionType')) {
+                               throw new SystemException("'".$className."' should implement wcf\system\option\group\IGroupOptionType");
+                       }
+                       
+                       // create instance
+                       $this->typeObjects[$type] = new $className();
+               }
+               
+               return $this->typeObjects[$type];
+       }
+}
index 9eb5cd88ef928bdd9ff632bf11c89e6e7fbabfa4..5cf711ba05713981800aea04d557d21fbd0741a9 100644 (file)
@@ -1,21 +1,21 @@
-<?php\r
-namespace wcf\system\cleanup;\r
-\r
-/**\r
- * Default interface for cleanup adapters.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cleanup\r
- * @category   Community Framework\r
- */\r
-interface ICleanupAdapter {\r
-       /**\r
-        * Executes this adapter.\r
-        * \r
-        * @param       array           $objectIDs\r
-        */\r
-       public function execute(array $objectIDs);\r
+<?php
+namespace wcf\system\cleanup;
+
+/**
+ * Default interface for cleanup adapters.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cleanup
+ * @category   Community Framework
+ */
+interface ICleanupAdapter {
+       /**
+        * Executes this adapter.
+        * 
+        * @param       array           $objectIDs
+        */
+       public function execute(array $objectIDs);
 }
index ef75c155b235708a5b1bb340865dea139e3f1c2d..d33bfc74c47c56c9fa678058c73726ce39ad0376 100644 (file)
@@ -1,22 +1,22 @@
-<?php\r
-namespace wcf\system\cronjob;\r
-use wcf\system\cleanup\CleanupHandler;\r
-\r
-/**\r
- * Executes cleanup adapters.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cronjob\r
- * @category   Community Framework\r
- */\r
-class CleanupListenerCronjob implements ICronjob {\r
-       /**\r
-        * @see wcf\system\ICronjob::execute()\r
-        */\r
-       public function execute(array $data) {\r
-               CleanupHandler::getInstance()->execute();\r
-       }\r
+<?php
+namespace wcf\system\cronjob;
+use wcf\system\cleanup\CleanupHandler;
+
+/**
+ * Executes cleanup adapters.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cronjob
+ * @category   Community Framework
+ */
+class CleanupListenerCronjob implements ICronjob {
+       /**
+        * @see wcf\system\ICronjob::execute()
+        */
+       public function execute(array $data) {
+               CleanupHandler::getInstance()->execute();
+       }
 }
index 76a943f0b743e654025fd74ee28b5655ef2c87b1..1d9955c63a74254e5d9c31ce41ab2cb82d992b54 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\cronjob;\r
-use wcf\acp\package\update\PackageUpdate;\r
-\r
-/**\r
- * Gets update package information.\r
- * \r
- * @author     Siegfried Schweizer\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.cronjob\r
- * @category   Community Framework\r
- */\r
-class GetUpdateInfoCronjob implements ICronjob {\r
-       /**\r
-        * @see wcf\system\ICronjob::execute()\r
-        * @TODO Change path and move method to lib/system/package\r
-        */\r
-       public function execute(array $data) {\r
-               PackageUpdate::refreshPackageDatabaseAutomatically();\r
-       }\r
+<?php
+namespace wcf\system\cronjob;
+use wcf\acp\package\update\PackageUpdate;
+
+/**
+ * Gets update package information.
+ * 
+ * @author     Siegfried Schweizer
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.cronjob
+ * @category   Community Framework
+ */
+class GetUpdateInfoCronjob implements ICronjob {
+       /**
+        * @see wcf\system\ICronjob::execute()
+        * @TODO Change path and move method to lib/system/package
+        */
+       public function execute(array $data) {
+               PackageUpdate::refreshPackageDatabaseAutomatically();
+       }
 }
index 8970c7b7d880b3e24fc55727d9f9c21878ddc5da..b0759cfe91718406316e8b2330495220e9a2fd6b 100644 (file)
@@ -1,25 +1,25 @@
-<?php\r
-namespace wcf\system\cronjob;\r
-\r
-/**\r
- * Any Cronjob should implement this interface.\r
- * \r
- * @author     Siegfried Schweizer\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf.data.cronjobs\r
- * @subpackage system.cronjob\r
- * @category   Community Framework\r
- */\r
-interface ICronjob {\r
-       /**\r
-        * To be called when executing the cronjob; the $data array e.g. might be used for passing\r
-        * meaningful values to the cronjob in order to reasonably avail multipleExecs.\r
-        * \r
-        * @param       array           $data           This array should basically contain the dataset \r
-        *                                              associated to the executed cronjob, particularly \r
-        *                                              the date of the planned execution (the nextExec \r
-        *                                              field).\r
-        */\r
-       public function execute(array $data);\r
+<?php
+namespace wcf\system\cronjob;
+
+/**
+ * Any Cronjob should implement this interface.
+ * 
+ * @author     Siegfried Schweizer
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf.data.cronjobs
+ * @subpackage system.cronjob
+ * @category   Community Framework
+ */
+interface ICronjob {
+       /**
+        * To be called when executing the cronjob; the $data array e.g. might be used for passing
+        * meaningful values to the cronjob in order to reasonably avail multipleExecs.
+        * 
+        * @param       array           $data           This array should basically contain the dataset 
+        *                                              associated to the executed cronjob, particularly 
+        *                                              the date of the planned execution (the nextExec 
+        *                                              field).
+        */
+       public function execute(array $data);
 }
index d4a3c0806fd00d9912a4591d6de732e5caea1fab..b99be3abe16b921e48e61f37db2bb7b0362e9bb8 100644 (file)
-<?php\r
-namespace wcf\system\database;\r
-use wcf\system\database\statement\PreparedStatement;\r
-use wcf\data\DatabaseObject;\r
-use wcf\system\SystemException;\r
-\r
-/**\r
- * This is an abstract implementation of a database access class using PDO.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.database\r
- * @category   Community Framework\r
- */\r
-abstract class Database {\r
-       /**\r
-        * Name of the class used for prepared statements.\r
-        * @var string\r
-        */\r
-       protected $preparedStatementClassName = 'wcf\system\database\statement\PreparedStatement';\r
-\r
-       /**\r
-        * Name of the database editor class\r
-        * @var string\r
-        */\r
-       protected $editorClassName = 'wcf\system\database\editor\DatabaseEditor';\r
-       \r
-       /**\r
-        * sql server hostname\r
-        * @var string\r
-        */\r
-       protected $host = '';\r
-       \r
-       /**\r
-        * sql server post\r
-        * @var integer\r
-        */\r
-       protected $port = 0;\r
-       \r
-       /**\r
-        * sql server login name\r
-        * @var string\r
-        */\r
-       protected $user = '';\r
-       \r
-       /**\r
-        * sql server login password\r
-        * @var string\r
-        */\r
-       protected $password = '';\r
-       \r
-       /**\r
-        * database name\r
-        * @var string\r
-        */\r
-       protected $database = '';\r
-       \r
-       /**\r
-        * number of executed queries\r
-        * @var integer\r
-        */\r
-       protected $queryCount = 0;\r
-       \r
-       /**\r
-        * database editor object\r
-        * @var wcf\system\database\editor\DatabaseEditor\r
-        */\r
-       protected $editor = null;\r
-       \r
-       /**\r
-        * pdo object\r
-        * @var \PDO\r
-        */\r
-       protected $pdo = null;\r
-       \r
-       /**\r
-        * Indicates if there is an open transaction.\r
-        * @var boolean\r
-        */\r
-       protected $hasActiveTransaction = false;\r
-       \r
-       /**\r
-        * Creates a Dabatase Object.\r
-        * \r
-        * @param       string          $host                   SQL database server host address\r
-        * @param       string          $user                   SQL database server username\r
-        * @param       string          $password               SQL database server password\r
-        * @param       string          $database               SQL database server database name\r
-        * @param       integer         $port                   SQL database server port\r
-        */\r
-       public function __construct($host, $user, $password, $database, $port) {\r
-               $this->host = $host;\r
-               $this->port = $port;\r
-               $this->user = $user;\r
-               $this->password = $password;\r
-               $this->database = $database;\r
-               \r
-               // connect database\r
-               $this->connect();\r
-       }\r
-       \r
-       /**\r
-        * Connects to database server.\r
-        */\r
-       public abstract function connect();\r
-       \r
-       /**\r
-        * Returns ID from last insert.\r
-        *\r
-        * @param       string          $table\r
-        * @param       string          $field\r
-        * @return      integer                         last insert ID\r
-        */\r
-       public function getInsertID($table, $field) {\r
-               try {\r
-                       return $this->pdo->lastInsertId();\r
-               }\r
-               catch (\PDOException $e) {\r
-                       throw new DatabaseException("Can not fetch last insert id", $this);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Initiates a transaction.\r
-        *\r
-        * @return      boolean         true on success\r
-        */\r
-       public function beginTransaction() {\r
-               try {\r
-                       if ($this->hasActiveTransaction) {\r
-                               return false;\r
-                       }\r
-                       else {\r
-                               $this->hasActiveTransaction = $this->pdo->beginTransaction();\r
-                               return $this->hasActiveTransaction;\r
-                       }\r
-               }\r
-               catch (\PDOException $e) {\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Commits a transaction.\r
-        *\r
-        * @return      boolean         true on success\r
-        */\r
-       public function commitTransaction() {\r
-               try {\r
-                       $this->hasActiveTransaction = false;\r
-                       return $this->pdo->commit();\r
-               }\r
-               catch (\PDOException $e) {\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Rolls back a transaction.\r
-        *\r
-        * @return      boolean         true on success\r
-        */\r
-       public function rollBackTransaction() {\r
-               try {\r
-                       $this->hasActiveTransaction = false;\r
-                       return $this->pdo->rollBack();\r
-               }\r
-               catch (\PDOException $e) {\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Prepares a statement for execution and returns a statement object.\r
-        *\r
-        * @param       string                  $statement\r
-        * @param       integer                 $limit\r
-        * @param       integer                 $offset\r
-        * @return      wcf\system\database\statement\PreparedStatement\r
-        */\r
-       public function prepareStatement($statement, $limit = 0, $offset = 0) {\r
-               $statement = $this->handleLimitParameter($statement, $limit, $offset);\r
-               \r
-               try {\r
-                       $pdoStatement = $this->pdo->prepare($statement);\r
-                       if ($pdoStatement instanceof \PDOStatement) {\r
-                               return new $this->preparedStatementClassName($this, $pdoStatement);\r
-                       }\r
-                       throw new DatabaseException("Can not prepare statement: ".$statement, $this);\r
-               }\r
-               catch (\PDOException $e) {\r
-                       throw new DatabaseException("Can not prepare statement: ".$statement, $this);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Handles the limit and offset parameter in SELECT queries.\r
-        * This is a default implementation compatible to MySQL and PostgreSQL.\r
-        * Other database implementations should override this function. \r
-        * \r
-        * @param       string          $query\r
-        * @param       integer         $limit\r
-        * @param       integer         $offset\r
-        * @return      string          $query\r
-        */\r
-       public function handleLimitParameter($query, $limit = 0, $offset = 0) {\r
-               if ($limit != 0) {\r
-                       $query .= " LIMIT " . $limit . " OFFSET " . $offset;\r
-               }\r
-\r
-               return $query;\r
-       }\r
-       \r
-       /**\r
-        * Returns the number of the last error.\r
-        * \r
-        * @return integer\r
-        */\r
-       public function getErrorNumber() {\r
-               if ($this->pdo !== null) return $this->pdo->errorCode();\r
-               return 0;\r
-       }\r
-\r
-       /**\r
-        * Returns the description of the last error.\r
-        * \r
-        * @return string\r
-        */\r
-       public function getErrorDesc() {\r
-               if ($this->pdo !== null) {\r
-                       $errorInfoArray = $this->pdo->errorInfo();\r
-                       if (isset($errorInfoArray[2])) return $errorInfoArray[2];\r
-               }\r
-               return '';\r
-       }\r
-\r
-       /**\r
-        * Gets the current database type.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getDBType() {\r
-               return get_class($this);\r
-       }\r
-\r
-       /**\r
-        * Escapes a string for use in sql query.\r
-        * \r
-        * @param       string          $string\r
-        * @return      string\r
-        */\r
-       public function escapeString($string) {\r
-               return addslashes($string);\r
-       }\r
-       \r
-       /**\r
-        * Gets the sql version.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getVersion() {\r
-               try {\r
-                       if ($this->pdo !== null) {\r
-                               return $this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION);\r
-                       }\r
-               }\r
-               catch (\PDOException $e) {}\r
-                \r
-               return 'unknown';\r
-       }\r
-       \r
-       /**\r
-        * Gets the database name.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getDatabaseName() {\r
-               return $this->database;\r
-       }\r
-       \r
-       /**\r
-        * Returns the name of the database user.\r
-        *\r
-        * @param       string          user name\r
-        */\r
-       public function getUser() {\r
-               return $this->user;\r
-       }\r
-       \r
-       /**\r
-        * Returns the amount of executed sql queries.\r
-        *\r
-        * @return      integer\r
-        */\r
-       public function getQueryCount() {\r
-               return $this->queryCount;\r
-       }\r
-       \r
-       /**\r
-        * Increments the query counter by one.\r
-        */\r
-       public function incrementQueryCount() {\r
-               $this->queryCount++;\r
-       }\r
-       \r
-       /**\r
-        * Returns a database editor object.\r
-        *\r
-        * @return      wcf\system\database\editor\DatabaseEditor\r
-        */\r
-       public function getEditor() {\r
-               if ($this->editor === null) {\r
-                       $this->editor = new $this->editorClassName($this);\r
-               }\r
-               \r
-               return $this->editor;\r
-       }\r
-       \r
-       /**\r
-        * Returns true, if this database type is supported.\r
-        *\r
-        * @return      boolean\r
-        */\r
-       public static function isSupported() {\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * Sets default connection attributes.\r
-        */\r
-       protected function setAttributes() {\r
-               $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);\r
-               $this->pdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_NATURAL);\r
-               $this->pdo->setAttribute(\PDO::ATTR_STRINGIFY_FETCHES, false);\r
-       }\r
+<?php
+namespace wcf\system\database;
+use wcf\system\database\statement\PreparedStatement;
+use wcf\data\DatabaseObject;
+use wcf\system\SystemException;
+
+/**
+ * This is an abstract implementation of a database access class using PDO.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.database
+ * @category   Community Framework
+ */
+abstract class Database {
+       /**
+        * Name of the class used for prepared statements.
+        * @var string
+        */
+       protected $preparedStatementClassName = 'wcf\system\database\statement\PreparedStatement';
+
+       /**
+        * Name of the database editor class
+        * @var string
+        */
+       protected $editorClassName = 'wcf\system\database\editor\DatabaseEditor';
+       
+       /**
+        * sql server hostname
+        * @var string
+        */
+       protected $host = '';
+       
+       /**
+        * sql server post
+        * @var integer
+        */
+       protected $port = 0;
+       
+       /**
+        * sql server login name
+        * @var string
+        */
+       protected $user = '';
+       
+       /**
+        * sql server login password
+        * @var string
+        */
+       protected $password = '';
+       
+       /**
+        * database name
+        * @var string
+        */
+       protected $database = '';
+       
+       /**
+        * number of executed queries
+        * @var integer
+        */
+       protected $queryCount = 0;
+       
+       /**
+        * database editor object
+        * @var wcf\system\database\editor\DatabaseEditor
+        */
+       protected $editor = null;
+       
+       /**
+        * pdo object
+        * @var \PDO
+        */
+       protected $pdo = null;
+       
+       /**
+        * Indicates if there is an open transaction.
+        * @var boolean
+        */
+       protected $hasActiveTransaction = false;
+       
+       /**
+        * Creates a Dabatase Object.
+        * 
+        * @param       string          $host                   SQL database server host address
+        * @param       string          $user                   SQL database server username
+        * @param       string          $password               SQL database server password
+        * @param       string          $database               SQL database server database name
+        * @param       integer         $port                   SQL database server port
+        */
+       public function __construct($host, $user, $password, $database, $port) {
+               $this->host = $host;
+               $this->port = $port;
+               $this->user = $user;
+               $this->password = $password;
+               $this->database = $database;
+               
+               // connect database
+               $this->connect();
+       }
+       
+       /**
+        * Connects to database server.
+        */
+       public abstract function connect();
+       
+       /**
+        * Returns ID from last insert.
+        *
+        * @param       string          $table
+        * @param       string          $field
+        * @return      integer                         last insert ID
+        */
+       public function getInsertID($table, $field) {
+               try {
+                       return $this->pdo->lastInsertId();
+               }
+               catch (\PDOException $e) {
+                       throw new DatabaseException("Can not fetch last insert id", $this);
+               }
+       }
+       
+       /**
+        * Initiates a transaction.
+        *
+        * @return      boolean         true on success
+        */
+       public function beginTransaction() {
+               try {
+                       if ($this->hasActiveTransaction) {
+                               return false;
+                       }
+                       else {
+                               $this->hasActiveTransaction = $this->pdo->beginTransaction();
+                               return $this->hasActiveTransaction;
+                       }
+               }
+               catch (\PDOException $e) {
+                       return false;
+               }
+       }
+       
+       /**
+        * Commits a transaction.
+        *
+        * @return      boolean         true on success
+        */
+       public function commitTransaction() {
+               try {
+                       $this->hasActiveTransaction = false;
+                       return $this->pdo->commit();
+               }
+               catch (\PDOException $e) {
+                       return false;
+               }
+       }
+       
+       /**
+        * Rolls back a transaction.
+        *
+        * @return      boolean         true on success
+        */
+       public function rollBackTransaction() {
+               try {
+                       $this->hasActiveTransaction = false;
+                       return $this->pdo->rollBack();
+               }
+               catch (\PDOException $e) {
+                       return false;
+               }
+       }
+       
+       /**
+        * Prepares a statement for execution and returns a statement object.
+        *
+        * @param       string                  $statement
+        * @param       integer                 $limit
+        * @param       integer                 $offset
+        * @return      wcf\system\database\statement\PreparedStatement
+        */
+       public function prepareStatement($statement, $limit = 0, $offset = 0) {
+               $statement = $this->handleLimitParameter($statement, $limit, $offset);
+               
+               try {
+                       $pdoStatement = $this->pdo->prepare($statement);
+                       if ($pdoStatement instanceof \PDOStatement) {
+                               return new $this->preparedStatementClassName($this, $pdoStatement);
+                       }
+                       throw new DatabaseException("Can not prepare statement: ".$statement, $this);
+               }
+               catch (\PDOException $e) {
+                       throw new DatabaseException("Can not prepare statement: ".$statement, $this);
+               }
+       }
+       
+       /**
+        * Handles the limit and offset parameter in SELECT queries.
+        * This is a default implementation compatible to MySQL and PostgreSQL.
+        * Other database implementations should override this function. 
+        * 
+        * @param       string          $query
+        * @param       integer         $limit
+        * @param       integer         $offset
+        * @return      string          $query
+        */
+       public function handleLimitParameter($query, $limit = 0, $offset = 0) {
+               if ($limit != 0) {
+                       $query .= " LIMIT " . $limit . " OFFSET " . $offset;
+               }
+
+               return $query;
+       }
+       
+       /**
+        * Returns the number of the last error.
+        * 
+        * @return integer
+        */
+       public function getErrorNumber() {
+               if ($this->pdo !== null) return $this->pdo->errorCode();
+               return 0;
+       }
+
+       /**
+        * Returns the description of the last error.
+        * 
+        * @return string
+        */
+       public function getErrorDesc() {
+               if ($this->pdo !== null) {
+                       $errorInfoArray = $this->pdo->errorInfo();
+                       if (isset($errorInfoArray[2])) return $errorInfoArray[2];
+               }
+               return '';
+       }
+
+       /**
+        * Gets the current database type.
+        *
+        * @return      string
+        */
+       public function getDBType() {
+               return get_class($this);
+       }
+
+       /**
+        * Escapes a string for use in sql query.
+        * 
+        * @param       string          $string
+        * @return      string
+        */
+       public function escapeString($string) {
+               return addslashes($string);
+       }
+       
+       /**
+        * Gets the sql version.
+        *
+        * @return      string
+        */
+       public function getVersion() {
+               try {
+                       if ($this->pdo !== null) {
+                               return $this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION);
+                       }
+               }
+               catch (\PDOException $e) {}
+                
+               return 'unknown';
+       }
+       
+       /**
+        * Gets the database name.
+        *
+        * @return      string
+        */
+       public function getDatabaseName() {
+               return $this->database;
+       }
+       
+       /**
+        * Returns the name of the database user.
+        *
+        * @param       string          user name
+        */
+       public function getUser() {
+               return $this->user;
+       }
+       
+       /**
+        * Returns the amount of executed sql queries.
+        *
+        * @return      integer
+        */
+       public function getQueryCount() {
+               return $this->queryCount;
+       }
+       
+       /**
+        * Increments the query counter by one.
+        */
+       public function incrementQueryCount() {
+               $this->queryCount++;
+       }
+       
+       /**
+        * Returns a database editor object.
+        *
+        * @return      wcf\system\database\editor\DatabaseEditor
+        */
+       public function getEditor() {
+               if ($this->editor === null) {
+                       $this->editor = new $this->editorClassName($this);
+               }
+               
+               return $this->editor;
+       }
+       
+       /**
+        * Returns true, if this database type is supported.
+        *
+        * @return      boolean
+        */
+       public static function isSupported() {
+               return false;
+       }
+       
+       /**
+        * Sets default connection attributes.
+        */
+       protected function setAttributes() {
+               $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+               $this->pdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_NATURAL);
+               $this->pdo->setAttribute(\PDO::ATTR_STRINGIFY_FETCHES, false);
+       }
 }
index 1f63a496e195062ab2d2d818381b99553ec406c6..aac52273749b930e0fb558293fec1bb48e2fa17d 100644 (file)
-<?php\r
-namespace wcf\system\database;\r
-use wcf\system\database\statement\PreparedStatement;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * DatabaseException is a specific SystemException for database errors.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.database\r
- * @category   Community Framework\r
- */\r
-class DatabaseException extends SystemException {\r
-       /**\r
-        * error number\r
-        * @var integer\r
-        */\r
-       protected $errorNumber = null;\r
-       \r
-       /**\r
-        * error description\r
-        * @var string\r
-        */\r
-       protected $errorDesc = null;\r
-       \r
-       /**\r
-        * sql version number\r
-        * @var string\r
-        */\r
-       protected $sqlVersion = null;\r
-       \r
-       /**\r
-        * sql type\r
-        * @var string\r
-        */\r
-       protected $DBType = null;\r
-       \r
-       /**\r
-        * Database object\r
-        * @var Database\r
-        */\r
-       protected $db = null;\r
-       \r
-       /**\r
-        * PreparedStatement object\r
-        * @var PreparedStatement\r
-        */\r
-       protected $preparedStatement = null;\r
-       \r
-       /**\r
-        * Creates a new DatabaseException.\r
-        * \r
-        * @param       string                  $message                error message\r
-        * @param       Database                $db                     affected db object\r
-        * @param       PreparedStatement       $preparedStatement      affected prepared statement\r
-        */\r
-       public function __construct($message, Database $db, PreparedStatement $preparedStatement = null) {\r
-               $this->db = $db;\r
-               $this->DBType = $db->getDBType();\r
-               $this->preparedStatement = $preparedStatement;\r
-               \r
-               // prefer errors from prepared statement\r
-               if (($this->preparedStatement instanceof PreparedStatement) && $this->preparedStatement->getErrorNumber()) {\r
-                       $this->errorNumber = $this->preparedStatement->getErrorNumber();\r
-                       $this->errorDesc = $this->preparedStatement->getErrorDesc();\r
-               }\r
-               else {\r
-                       $this->errorNumber = $this->db->getErrorNumber();\r
-                       $this->errorDesc = $this->db->getErrorDesc();\r
-               }\r
-               \r
-               parent::__construct($message, intval($this->errorNumber));\r
-       }\r
-       \r
-       /**\r
-        * Returns the error number of this exception.\r
-        * \r
-        * @return      integer\r
-        */\r
-       public function getErrorNumber() {\r
-               return $this->errorNumber;\r
-       }\r
-       \r
-       /**\r
-        * Returns the error description of this exception.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getErrorDesc() {\r
-               return $this->errorDesc;\r
-       }\r
-       \r
-       /**\r
-        * Returns the current sql version of the database.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getSQLVersion() {\r
-               if ($this->sqlVersion === null) {\r
-                       try {\r
-                               $this->sqlVersion = $this->db->getVersion();\r
-                       }\r
-                       catch (DatabaseException $e) {\r
-                               $this->sqlVersion = 'unknown';\r
-                       }\r
-               }\r
-               \r
-               return $this->sqlVersion;\r
-       }\r
-       \r
-       /**\r
-        * Returns the sql type of the active database.\r
-        * \r
-        * @return      string \r
-        */\r
-       public function getDBType() {\r
-               return $this->DBType;\r
-       }\r
-       \r
-       /**\r
-        * Prints the error page.\r
-        */\r
-       public function show() {\r
-               $this->information .= '<b>sql type:</b> ' . StringUtil::encodeHTML($this->getDBType()) . '<br />';\r
-               $this->information .= '<b>sql error:</b> ' . StringUtil::encodeHTML($this->getErrorDesc()) . '<br />';\r
-               $this->information .= '<b>sql error number:</b> ' . StringUtil::encodeHTML($this->getErrorNumber()) . '<br />';\r
-               $this->information .= '<b>sql version:</b> ' . StringUtil::encodeHTML($this->getSQLVersion()) . '<br />';\r
-               \r
-               $this->information .= "\n<!-- db error: #".$this->db->getErrorNumber().': '.$this->db->getErrorDesc()." -->\n";\r
-               if ($this->preparedStatement !== null) {\r
-                       $this->information .= "\n<!-- statement error: #".$this->preparedStatement->getErrorNumber().': '.$this->preparedStatement->getErrorDesc()." -->\n";\r
-               }\r
-               \r
-               parent::show();\r
-       }\r
+<?php
+namespace wcf\system\database;
+use wcf\system\database\statement\PreparedStatement;
+use wcf\system\exception\SystemException;
+use wcf\util\StringUtil;
+
+/**
+ * DatabaseException is a specific SystemException for database errors.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.database
+ * @category   Community Framework
+ */
+class DatabaseException extends SystemException {
+       /**
+        * error number
+        * @var integer
+        */
+       protected $errorNumber = null;
+       
+       /**
+        * error description
+        * @var string
+        */
+       protected $errorDesc = null;
+       
+       /**
+        * sql version number
+        * @var string
+        */
+       protected $sqlVersion = null;
+       
+       /**
+        * sql type
+        * @var string
+        */
+       protected $DBType = null;
+       
+       /**
+        * Database object
+        * @var Database
+        */
+       protected $db = null;
+       
+       /**
+        * PreparedStatement object
+        * @var PreparedStatement
+        */
+       protected $preparedStatement = null;
+       
+       /**
+        * Creates a new DatabaseException.
+        * 
+        * @param       string                  $message                error message
+        * @param       Database                $db                     affected db object
+        * @param       PreparedStatement       $preparedStatement      affected prepared statement
+        */
+       public function __construct($message, Database $db, PreparedStatement $preparedStatement = null) {
+               $this->db = $db;
+               $this->DBType = $db->getDBType();
+               $this->preparedStatement = $preparedStatement;
+               
+               // prefer errors from prepared statement
+               if (($this->preparedStatement instanceof PreparedStatement) && $this->preparedStatement->getErrorNumber()) {
+                       $this->errorNumber = $this->preparedStatement->getErrorNumber();
+                       $this->errorDesc = $this->preparedStatement->getErrorDesc();
+               }
+               else {
+                       $this->errorNumber = $this->db->getErrorNumber();
+                       $this->errorDesc = $this->db->getErrorDesc();
+               }
+               
+               parent::__construct($message, intval($this->errorNumber));
+       }
+       
+       /**
+        * Returns the error number of this exception.
+        * 
+        * @return      integer
+        */
+       public function getErrorNumber() {
+               return $this->errorNumber;
+       }
+       
+       /**
+        * Returns the error description of this exception.
+        * 
+        * @return      string
+        */
+       public function getErrorDesc() {
+               return $this->errorDesc;
+       }
+       
+       /**
+        * Returns the current sql version of the database.
+        * 
+        * @return      string
+        */
+       public function getSQLVersion() {
+               if ($this->sqlVersion === null) {
+                       try {
+                               $this->sqlVersion = $this->db->getVersion();
+                       }
+                       catch (DatabaseException $e) {
+                               $this->sqlVersion = 'unknown';
+                       }
+               }
+               
+               return $this->sqlVersion;
+       }
+       
+       /**
+        * Returns the sql type of the active database.
+        * 
+        * @return      string 
+        */
+       public function getDBType() {
+               return $this->DBType;
+       }
+       
+       /**
+        * Prints the error page.
+        */
+       public function show() {
+               $this->information .= '<b>sql type:</b> ' . StringUtil::encodeHTML($this->getDBType()) . '<br />';
+               $this->information .= '<b>sql error:</b> ' . StringUtil::encodeHTML($this->getErrorDesc()) . '<br />';
+               $this->information .= '<b>sql error number:</b> ' . StringUtil::encodeHTML($this->getErrorNumber()) . '<br />';
+               $this->information .= '<b>sql version:</b> ' . StringUtil::encodeHTML($this->getSQLVersion()) . '<br />';
+               
+               $this->information .= "\n<!-- db error: #".$this->db->getErrorNumber().': '.$this->db->getErrorDesc()." -->\n";
+               if ($this->preparedStatement !== null) {
+                       $this->information .= "\n<!-- statement error: #".$this->preparedStatement->getErrorNumber().': '.$this->preparedStatement->getErrorDesc()." -->\n";
+               }
+               
+               parent::show();
+       }
 }
index 18c60145b9692c50626bc19cc4d0a17a6117a150..2ce6b6efa22d97ebe9d5f1d62805e156b209e4ac 100644 (file)
@@ -79,9 +79,9 @@ class PostgreSQLDatabase extends Database {
        
        /**
         * By default identifiers are case insensitive in PostgreSQL.
-        * We need to double quote identifiers here automatically.\r
-        * \r
-        * @param       string          $query\r
+        * We need to double quote identifiers here automatically.
+        * 
+        * @param       string          $query
         * @return      string          $query
         */
        public static function fixQuery($query) {
index 8e0ce5c7fcc654968d85d705d47822ffa52dee6a..8a833a1b3a7b6c2b781b790e215c371a31936309 100644 (file)
@@ -1,60 +1,60 @@
-<?php\r
-namespace wcf\system\database\util;\r
-\r
-/**\r
- * Builds a sql query 'where' condition.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.database.util\r
- * @category   Community Framework\r
- */\r
-class ConditionBuilder {\r
-       /**\r
-        * conditions string\r
-        * @var string\r
-        */\r
-       protected $conditions = '';\r
-       \r
-       /**\r
-        * must be true to add the 'WHERE' keyword automatically\r
-        * @var boolean\r
-        */\r
-       protected $addWhereKeyword = true;\r
-       \r
-       /**\r
-        * Creates a new ConditionBuilder object.\r
-        *\r
-        * @param       string          $addWhereKeyword\r
-        */\r
-       public function __construct($addWhereKeyword = true) {\r
-               $this->addWhereKeyword = $addWhereKeyword;\r
-       }\r
-       \r
-       /**\r
-        * Adds a new condition.\r
-        * \r
-        * @param       mixed           $conditions\r
-        */\r
-       public function add($conditions) {\r
-               if (!is_array($conditions)) $conditions = array($conditions);\r
-               \r
-               foreach ($conditions as $condition) {\r
-                       if (!empty($this->conditions)) $this->conditions .= " AND ";\r
-                       else $this->conditions = ($this->addWhereKeyword ? " WHERE " : '');\r
-                       \r
-                       $this->conditions .= $condition;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the build condition.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function __toString() {\r
-               return $this->conditions;\r
-       }\r
+<?php
+namespace wcf\system\database\util;
+
+/**
+ * Builds a sql query 'where' condition.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.database.util
+ * @category   Community Framework
+ */
+class ConditionBuilder {
+       /**
+        * conditions string
+        * @var string
+        */
+       protected $conditions = '';
+       
+       /**
+        * must be true to add the 'WHERE' keyword automatically
+        * @var boolean
+        */
+       protected $addWhereKeyword = true;
+       
+       /**
+        * Creates a new ConditionBuilder object.
+        *
+        * @param       string          $addWhereKeyword
+        */
+       public function __construct($addWhereKeyword = true) {
+               $this->addWhereKeyword = $addWhereKeyword;
+       }
+       
+       /**
+        * Adds a new condition.
+        * 
+        * @param       mixed           $conditions
+        */
+       public function add($conditions) {
+               if (!is_array($conditions)) $conditions = array($conditions);
+               
+               foreach ($conditions as $condition) {
+                       if (!empty($this->conditions)) $this->conditions .= " AND ";
+                       else $this->conditions = ($this->addWhereKeyword ? " WHERE " : '');
+                       
+                       $this->conditions .= $condition;
+               }
+       }
+       
+       /**
+        * Returns the build condition.
+        * 
+        * @return      string
+        */
+       public function __toString() {
+               return $this->conditions;
+       }
 }
index 3bd5b2c4e8fded8579fc688a3453969075ffc1b2..07a898c7664888535643e4f01ce91792c5cce5c3 100644 (file)
@@ -1,76 +1,76 @@
-<?php\r
-namespace wcf\system\database\util;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * Builds a sql query 'where' condition for prepared statements.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.database.util\r
- * @category   Community Framework\r
- */\r
-class PreparedStatementConditionBuilder extends ConditionBuilder {\r
-       /**\r
-        * input parameters\r
-        * @var array\r
-        */\r
-       protected $parameters = array();\r
-       \r
-       /**\r
-        * Adds a new condition.\r
-        * \r
-        * @param       string          $condition\r
-        * @param       array           $parameters\r
-        */\r
-       public function add($condition, array $parameters = array()) {\r
-               if (count($parameters)) {\r
-                       $count = 0;\r
-                       $callback = function ($matches) use (&$count, $parameters) {\r
-                               if (!isset($parameters[$count])) {\r
-                                       throw new SystemException();\r
-                               }\r
-\r
-                               $result = '?';\r
-                               if (is_array($parameters[$count]) && count($parameters[$count])) {\r
-                                       $result .= str_repeat(',?', count($parameters[$count]) - 1);\r
-                               }\r
-                               \r
-                               $count++;\r
-                               return $result;\r
-                       };\r
-                       \r
-                       $condition = preg_replace_callback('/\?/', $callback, $condition);\r
-               }\r
-               \r
-               // add condtion\r
-               if (!empty($this->conditions)) $this->conditions .= " AND ";\r
-               else $this->conditions = ($this->addWhereKeyword ? " WHERE " : '');\r
-               $this->conditions .= $condition;\r
-               \r
-               // parameter handling\r
-               if (count($parameters)) {\r
-                       foreach ($parameters as $parameter) {\r
-                               if (is_array($parameter)) {\r
-                                       foreach ($parameter as $value) {\r
-                                               $this->parameters[] = $value;\r
-                                       }\r
-                               }\r
-                               else {\r
-                                       $this->parameters[] = $parameter;\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the input parameters.\r
-        * \r
-        * @return      array\r
-        */\r
-       public function getParameters() {\r
-               return $this->parameters;\r
-       }\r
+<?php
+namespace wcf\system\database\util;
+use wcf\system\exception\SystemException;
+
+/**
+ * Builds a sql query 'where' condition for prepared statements.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.database.util
+ * @category   Community Framework
+ */
+class PreparedStatementConditionBuilder extends ConditionBuilder {
+       /**
+        * input parameters
+        * @var array
+        */
+       protected $parameters = array();
+       
+       /**
+        * Adds a new condition.
+        * 
+        * @param       string          $condition
+        * @param       array           $parameters
+        */
+       public function add($condition, array $parameters = array()) {
+               if (count($parameters)) {
+                       $count = 0;
+                       $callback = function ($matches) use (&$count, $parameters) {
+                               if (!isset($parameters[$count])) {
+                                       throw new SystemException();
+                               }
+
+                               $result = '?';
+                               if (is_array($parameters[$count]) && count($parameters[$count])) {
+                                       $result .= str_repeat(',?', count($parameters[$count]) - 1);
+                               }
+                               
+                               $count++;
+                               return $result;
+                       };
+                       
+                       $condition = preg_replace_callback('/\?/', $callback, $condition);
+               }
+               
+               // add condtion
+               if (!empty($this->conditions)) $this->conditions .= " AND ";
+               else $this->conditions = ($this->addWhereKeyword ? " WHERE " : '');
+               $this->conditions .= $condition;
+               
+               // parameter handling
+               if (count($parameters)) {
+                       foreach ($parameters as $parameter) {
+                               if (is_array($parameter)) {
+                                       foreach ($parameter as $value) {
+                                               $this->parameters[] = $value;
+                                       }
+                               }
+                               else {
+                                       $this->parameters[] = $parameter;
+                               }
+                       }
+               }
+       }
+       
+       /**
+        * Returns the input parameters.
+        * 
+        * @return      array
+        */
+       public function getParameters() {
+               return $this->parameters;
+       }
 }
index 3c63ab3fd459e74fbc607d18c9347fe73e538a98..7745ac6c31404417296081b4c735c5ae339831c1 100644 (file)
-<?php\r
-namespace wcf\system\event;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\SingletonFactory;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * EventHandler executes all registered actions for a specific event.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.event\r
- * @category   Community Framework\r
- */\r
-class EventHandler extends SingletonFactory {\r
-       /**\r
-        * Registerd actions.\r
-        *\r
-        * @var array\r
-        */\r
-       protected $actions = null;\r
-       \r
-       /**\r
-        * Registerd inherit actions.\r
-        *\r
-        * @var array\r
-        */\r
-       protected $inheritedActions = null;\r
-       \r
-       /**\r
-        * Instances of registerd actions.\r
-        *\r
-        * @var array\r
-        */\r
-       protected $actionsObjects = array();\r
-       \r
-       /**\r
-        * Instances of registerd inherit actions.\r
-        *\r
-        * @var array\r
-        */\r
-       protected $inheritedActionsObjects = array();\r
-       \r
-       /**\r
-        * Instances of action objects.\r
-        *\r
-        * @var array\r
-        */\r
-       protected $listenerObjects = array();\r
-       \r
-       /**\r
-        * Loads all registered actions of the active package.\r
-        */\r
-       protected function loadActions() {\r
-               CacheHandler::getInstance()->addResource('eventListener-'.PACKAGE_ID, WCF_DIR.'cache/cache.eventListener-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderEventListener');\r
-               $cache = CacheHandler::getInstance()->get('eventListener-'.PACKAGE_ID);\r
-               if (isset($cache['actions'])) $this->actions = $cache['actions'];\r
-               if (isset($cache['inheritedActions'])) $this->inheritedActions = $cache['inheritedActions'];\r
-               unset($cache);\r
-               if (!is_array($this->actions)) $this->actions = array();\r
-               if (!is_array($this->inheritedActions)) $this->inheritedActions = array();\r
-       }\r
-       \r
-       /**\r
-        * Executes all inherited listeners for the given event.\r
-        *\r
-        * @param       mixed           $eventObj\r
-        * @param       string          $eventName\r
-        * @param       string          $className\r
-        * @param       string          $name\r
-        */\r
-       protected function executeInheritedActions($eventObj, $eventName, $className, $name) {\r
-               // create objects of the actions\r
-               if (!isset($this->inheritedActionsObjects[$name]) || !is_array($this->inheritedActionsObjects[$name])) {\r
-                       $this->inheritedActionsObjects[$name] = array();\r
-\r
-                       // get parent classes\r
-                       $familyTree = array();\r
-                       $member = (is_object($eventObj) ? get_class($eventObj) : $eventObj);\r
-                       while ($member != false) {\r
-                               $familyTree[] = $member;\r
-                               $member = get_parent_class($member);\r
-                       }\r
-\r
-                       foreach ($familyTree as $member) {\r
-                               if (isset($this->inheritedActions[$member])) {\r
-                                       $actions = $this->inheritedActions[$member];\r
-                                       if (isset($actions[$eventName]) && count($actions[$eventName]) > 0) {\r
-                                               foreach ($actions[$eventName] as $action) {\r
-                                                       if (isset($this->inheritedActionsObjects[$name][$action['listenerClassName']])) continue;\r
-\r
-                                                       // get class object\r
-                                                       if (isset($this->listenerObjects[$action['listenerClassName']])) {\r
-                                                               $object = $this->listenerObjects[$action['listenerClassName']];\r
-                                                       }\r
-                                                       else {\r
-                                                               $object = null;\r
-                                                               // instance action object\r
-                                                               if (!class_exists($action['listenerClassName'])) {\r
-                                                                       throw new SystemException("Unable to find class '".$action['listenerClassName']."'", 11001);\r
-                                                               }\r
-                                                               if (!ClassUtil::isInstanceOf($action['listenerClassName'], 'wcf\system\event\IEventListener')) {\r
-                                                                       throw new SystemException("'".$action['listenerClassName']."' should implement interface wcf\system\event\IEventListener");\r
-                                                               }\r
-       \r
-                                                               $object = new $action['listenerClassName'];\r
-                                                               $this->listenerObjects[] = $object;\r
-                                                       }\r
-                                                       \r
-                                                       if ($object !== null) $this->inheritedActionsObjects[$name][$action['listenerClassName']] = $object;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               // execute actions\r
-               foreach ($this->inheritedActionsObjects[$name] as $actionObj) {\r
-                       $actionObj->execute($eventObj, $className, $eventName);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Executes all registered listeners for the given event.\r
-        *\r
-        * @param       mixed           $eventObj\r
-        * @param       string          $eventName\r
-        */\r
-       public function fireAction($eventObj, $eventName) {\r
-               // get class name\r
-               if (is_object($eventObj)) $className = get_class($eventObj);\r
-               else $className = $eventObj;\r
-               \r
-               // load actions from cache if necessary\r
-               if ($this->actions === null && $this->inheritedActions === null) {\r
-                       $this->loadActions();\r
-               }\r
-               \r
-               // generate action name\r
-               $name = self::generateKey($className, $eventName);\r
-\r
-               // execute inherited actions first\r
-               if (count($this->inheritedActions) > 0) {\r
-                       $this->executeInheritedActions($eventObj, $eventName, $className, $name);\r
-               }\r
-               \r
-               // create objects of the actions\r
-               if (!isset($this->actionsObjects[$name]) || !is_array($this->actionsObjects[$name])) {\r
-                       if (!isset($this->actions[$name]) || !is_array($this->actions[$name])) {\r
-                               // no action registered\r
-                               return false;\r
-                       }\r
-               \r
-                       $this->actionsObjects[$name] = array();\r
-                       foreach ($this->actions[$name] as $action) {\r
-                               if (isset($this->actionsObjects[$name][$action['listenerClassName']])) continue;\r
-\r
-                               // get class object\r
-                               if (isset($this->listenerObjects[$action['listenerClassName']])) {\r
-                                       $object = $this->listenerObjects[$action['listenerClassName']];\r
-                               }\r
-                               else {\r
-                                       // instance action object\r
-                                       if (!class_exists($action['listenerClassName'])) {\r
-                                               throw new SystemException("Unable to find class '".$action['listenerClassName']."'", 11001);\r
-                                       }\r
-                                       if (!ClassUtil::isInstanceOf($action['listenerClassName'], 'wcf\system\event\IEventListener')) {\r
-                                               throw new SystemException("'".$action['listenerClassName']."' should implement interface wcf\system\event\IEventListener");\r
-                                       }\r
-                               \r
-                                       $object = new $action['listenerClassName'];\r
-                                       $this->listenerObjects[$path] = $object;\r
-                               }\r
-                               \r
-                               $this->actionsObjects[$name][$action['listenerClassName']] = $object;\r
-                       }\r
-               }\r
-               \r
-               // execute actions\r
-               foreach ($this->actionsObjects[$name] as $actionObj) {\r
-                       $actionObj->execute($eventObj, $className, $eventName);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Generates an unique name for an action.\r
-        *\r
-        * @param       string          $className\r
-        * @param       string          $eventName\r
-        */\r
-       public static function generateKey($className, $eventName) {\r
-               return $eventName.'@'.$className;\r
-       }\r
-}\r
+<?php
+namespace wcf\system\event;
+use wcf\system\cache\CacheHandler;
+use wcf\system\exception\SystemException;
+use wcf\system\SingletonFactory;
+use wcf\util\ClassUtil;
+
+/**
+ * EventHandler executes all registered actions for a specific event.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.event
+ * @category   Community Framework
+ */
+class EventHandler extends SingletonFactory {
+       /**
+        * Registerd actions.
+        *
+        * @var array
+        */
+       protected $actions = null;
+       
+       /**
+        * Registerd inherit actions.
+        *
+        * @var array
+        */
+       protected $inheritedActions = null;
+       
+       /**
+        * Instances of registerd actions.
+        *
+        * @var array
+        */
+       protected $actionsObjects = array();
+       
+       /**
+        * Instances of registerd inherit actions.
+        *
+        * @var array
+        */
+       protected $inheritedActionsObjects = array();
+       
+       /**
+        * Instances of action objects.
+        *
+        * @var array
+        */
+       protected $listenerObjects = array();
+       
+       /**
+        * Loads all registered actions of the active package.
+        */
+       protected function loadActions() {
+               CacheHandler::getInstance()->addResource('eventListener-'.PACKAGE_ID, WCF_DIR.'cache/cache.eventListener-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderEventListener');
+               $cache = CacheHandler::getInstance()->get('eventListener-'.PACKAGE_ID);
+               if (isset($cache['actions'])) $this->actions = $cache['actions'];
+               if (isset($cache['inheritedActions'])) $this->inheritedActions = $cache['inheritedActions'];
+               unset($cache);
+               if (!is_array($this->actions)) $this->actions = array();
+               if (!is_array($this->inheritedActions)) $this->inheritedActions = array();
+       }
+       
+       /**
+        * Executes all inherited listeners for the given event.
+        *
+        * @param       mixed           $eventObj
+        * @param       string          $eventName
+        * @param       string          $className
+        * @param       string          $name
+        */
+       protected function executeInheritedActions($eventObj, $eventName, $className, $name) {
+               // create objects of the actions
+               if (!isset($this->inheritedActionsObjects[$name]) || !is_array($this->inheritedActionsObjects[$name])) {
+                       $this->inheritedActionsObjects[$name] = array();
+
+                       // get parent classes
+                       $familyTree = array();
+                       $member = (is_object($eventObj) ? get_class($eventObj) : $eventObj);
+                       while ($member != false) {
+                               $familyTree[] = $member;
+                               $member = get_parent_class($member);
+                       }
+
+                       foreach ($familyTree as $member) {
+                               if (isset($this->inheritedActions[$member])) {
+                                       $actions = $this->inheritedActions[$member];
+                                       if (isset($actions[$eventName]) && count($actions[$eventName]) > 0) {
+                                               foreach ($actions[$eventName] as $action) {
+                                                       if (isset($this->inheritedActionsObjects[$name][$action['listenerClassName']])) continue;
+
+                                                       // get class object
+                                                       if (isset($this->listenerObjects[$action['listenerClassName']])) {
+                                                               $object = $this->listenerObjects[$action['listenerClassName']];
+                                                       }
+                                                       else {
+                                                               $object = null;
+                                                               // instance action object
+                                                               if (!class_exists($action['listenerClassName'])) {
+                                                                       throw new SystemException("Unable to find class '".$action['listenerClassName']."'", 11001);
+                                                               }
+                                                               if (!ClassUtil::isInstanceOf($action['listenerClassName'], 'wcf\system\event\IEventListener')) {
+                                                                       throw new SystemException("'".$action['listenerClassName']."' should implement interface wcf\system\event\IEventListener");
+                                                               }
+       
+                                                               $object = new $action['listenerClassName'];
+                                                               $this->listenerObjects[] = $object;
+                                                       }
+                                                       
+                                                       if ($object !== null) $this->inheritedActionsObjects[$name][$action['listenerClassName']] = $object;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+               // execute actions
+               foreach ($this->inheritedActionsObjects[$name] as $actionObj) {
+                       $actionObj->execute($eventObj, $className, $eventName);
+               }
+       }
+       
+       /**
+        * Executes all registered listeners for the given event.
+        *
+        * @param       mixed           $eventObj
+        * @param       string          $eventName
+        */
+       public function fireAction($eventObj, $eventName) {
+               // get class name
+               if (is_object($eventObj)) $className = get_class($eventObj);
+               else $className = $eventObj;
+               
+               // load actions from cache if necessary
+               if ($this->actions === null && $this->inheritedActions === null) {
+                       $this->loadActions();
+               }
+               
+               // generate action name
+               $name = self::generateKey($className, $eventName);
+
+               // execute inherited actions first
+               if (count($this->inheritedActions) > 0) {
+                       $this->executeInheritedActions($eventObj, $eventName, $className, $name);
+               }
+               
+               // create objects of the actions
+               if (!isset($this->actionsObjects[$name]) || !is_array($this->actionsObjects[$name])) {
+                       if (!isset($this->actions[$name]) || !is_array($this->actions[$name])) {
+                               // no action registered
+                               return false;
+                       }
+               
+                       $this->actionsObjects[$name] = array();
+                       foreach ($this->actions[$name] as $action) {
+                               if (isset($this->actionsObjects[$name][$action['listenerClassName']])) continue;
+
+                               // get class object
+                               if (isset($this->listenerObjects[$action['listenerClassName']])) {
+                                       $object = $this->listenerObjects[$action['listenerClassName']];
+                               }
+                               else {
+                                       // instance action object
+                                       if (!class_exists($action['listenerClassName'])) {
+                                               throw new SystemException("Unable to find class '".$action['listenerClassName']."'", 11001);
+                                       }
+                                       if (!ClassUtil::isInstanceOf($action['listenerClassName'], 'wcf\system\event\IEventListener')) {
+                                               throw new SystemException("'".$action['listenerClassName']."' should implement interface wcf\system\event\IEventListener");
+                                       }
+                               
+                                       $object = new $action['listenerClassName'];
+                                       $this->listenerObjects[$path] = $object;
+                               }
+                               
+                               $this->actionsObjects[$name][$action['listenerClassName']] = $object;
+                       }
+               }
+               
+               // execute actions
+               foreach ($this->actionsObjects[$name] as $actionObj) {
+                       $actionObj->execute($eventObj, $className, $eventName);
+               }
+       }
+       
+       /**
+        * Generates an unique name for an action.
+        *
+        * @param       string          $className
+        * @param       string          $eventName
+        */
+       public static function generateKey($className, $eventName) {
+               return $eventName.'@'.$className;
+       }
+}
index bfb054e00e0092f511ea474e260e2bbe90e4ed52..ef8e36027a5434a81d359b5ae91a0ffed2d77103 100644 (file)
@@ -1,24 +1,24 @@
-<?php\r
-namespace wcf\system\event;\r
-use wcf\data\DatabaseObjectProcessor;\r
-\r
-/**\r
- * EventListeners can be registered for a specific event in many controller objects.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.event\r
- * @category   Community Framework\r
- */\r
-interface IEventListener {\r
-       /**\r
-        * Executes this action.\r
-        * \r
-        * @param       object          $eventObj\r
-        * @param       string          $className\r
-        * @param       string          $eventName\r
-        */\r
-       public function execute($eventObj, $className, $eventName);\r
+<?php
+namespace wcf\system\event;
+use wcf\data\DatabaseObjectProcessor;
+
+/**
+ * EventListeners can be registered for a specific event in many controller objects.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.event
+ * @category   Community Framework
+ */
+interface IEventListener {
+       /**
+        * Executes this action.
+        * 
+        * @param       object          $eventObj
+        * @param       string          $className
+        * @param       string          $eventName
+        */
+       public function execute($eventObj, $className, $eventName);
 }
index 68e43b90ec0284a995633a3289ff0e31cbe85946..df5d2fd080ee962f4dba373c5a83065229b5dfc8 100644 (file)
@@ -1,30 +1,30 @@
-<?php\r
-namespace wcf\system\exception;\r
-use wcf\util\JSON;\r
-\r
-/**\r
- * AJAXException provides JSON-encoded exceptions.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category   Community Framework\r
- */\r
-class AJAXException extends \Exception {\r
-       /**\r
-        * Throws a JSON-encoded error message\r
-        * \r
-        * @param       string          $message\r
-        */\r
-       public function __construct($message) {\r
-               //header('HTTP/1.0 418 I\'m a Teapot');\r
-               header('HTTP/1.0 503 Service Unavailable');\r
-               header('Content-type: application/json');\r
-               echo JSON::encode(array(\r
-                       'message' => $message\r
-               ));\r
-               exit;\r
-       }\r
+<?php
+namespace wcf\system\exception;
+use wcf\util\JSON;
+
+/**
+ * AJAXException provides JSON-encoded exceptions.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.exception
+ * @category   Community Framework
+ */
+class AJAXException extends \Exception {
+       /**
+        * Throws a JSON-encoded error message
+        * 
+        * @param       string          $message
+        */
+       public function __construct($message) {
+               //header('HTTP/1.0 418 I\'m a Teapot');
+               header('HTTP/1.0 503 Service Unavailable');
+               header('Content-type: application/json');
+               echo JSON::encode(array(
+                       'message' => $message
+               ));
+               exit;
+       }
 }
index 579a9ed2fe93bdab2038f0f268986ee974f728bf..c4c6f003384e7d49522e8c9e94981cefdb40c0b0 100644 (file)
@@ -1,20 +1,20 @@
-<?php\r
-namespace wcf\system\exception;\r
-\r
-/**\r
- * WCF::handleException() calls the show method on exceptions that implement this interface.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category   Community Framework\r
- */\r
-interface IPrintableException {\r
-       /**\r
-        * Prints this exception.\r
-        * This method is called by WCF::handleException().\r
-        */\r
-       public function show();\r
+<?php
+namespace wcf\system\exception;
+
+/**
+ * WCF::handleException() calls the show method on exceptions that implement this interface.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.exception
+ * @category   Community Framework
+ */
+interface IPrintableException {
+       /**
+        * Prints this exception.
+        * This method is called by WCF::handleException().
+        */
+       public function show();
 }
index 0873f88dfce9f10aa431e51e82460b4929e2dfe1..9ea72169dad4335d27173b90d9218a7760b49f11 100644 (file)
@@ -1,30 +1,30 @@
-<?php\r
-namespace wcf\system\exception;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * IllegalLinkException shows the unknown link error page.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category   Community Framework\r
- */\r
-class IllegalLinkException extends NamedUserException {\r
-       /**\r
-        * Creates a new IllegalLinkException object.\r
-        */\r
-       public function __construct() {\r
-               parent::__construct(WCF::getLanguage()->get('wcf.global.error.illegalLink'));\r
-       }\r
-       \r
-       /**\r
-        * @see NamedUserException::show();\r
-        */\r
-       public function show() {\r
-               @header('HTTP/1.0 404 Not Found');\r
-               parent::show();\r
-       }\r
+<?php
+namespace wcf\system\exception;
+use wcf\system\WCF;
+
+/**
+ * IllegalLinkException shows the unknown link error page.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.exception
+ * @category   Community Framework
+ */
+class IllegalLinkException extends NamedUserException {
+       /**
+        * Creates a new IllegalLinkException object.
+        */
+       public function __construct() {
+               parent::__construct(WCF::getLanguage()->get('wcf.global.error.illegalLink'));
+       }
+       
+       /**
+        * @see NamedUserException::show();
+        */
+       public function show() {
+               @header('HTTP/1.0 404 Not Found');
+               parent::show();
+       }
 }
index 08d710f478f69fcf07d258bb89b1b11a3c80c184..e77d12509030a555dc03e2cdad1a42722070fa4c 100644 (file)
@@ -1,38 +1,38 @@
-<?php\r
-namespace wcf\system\exception;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * NamedUserException shows a (well) styled page with the given error message.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category   Community Framework\r
- */\r
-class NamedUserException extends UserException {\r
-       /**\r
-        * Creates a new NamedUserException object.\r
-        * \r
-        * @param       string          $message\r
-        */\r
-       public function __construct($message) {\r
-               parent::__construct($message);\r
-       }\r
-       \r
-       /**\r
-        * Shows a styled page with the given error message.\r
-        */\r
-       public function show() {\r
-               WCF::getTPL()->assign(array(\r
-                       'name' => get_class($this),\r
-                       'file' => $this->getFile(),\r
-                       'line' => $this->getLine(),\r
-                       'message' => $this->getMessage(),\r
-                       'stacktrace' => $this->getTraceAsString()\r
-               ));\r
-               WCF::getTPL()->display('userException');\r
-       }\r
+<?php
+namespace wcf\system\exception;
+use wcf\system\WCF;
+
+/**
+ * NamedUserException shows a (well) styled page with the given error message.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.exception
+ * @category   Community Framework
+ */
+class NamedUserException extends UserException {
+       /**
+        * Creates a new NamedUserException object.
+        * 
+        * @param       string          $message
+        */
+       public function __construct($message) {
+               parent::__construct($message);
+       }
+       
+       /**
+        * Shows a styled page with the given error message.
+        */
+       public function show() {
+               WCF::getTPL()->assign(array(
+                       'name' => get_class($this),
+                       'file' => $this->getFile(),
+                       'line' => $this->getLine(),
+                       'message' => $this->getMessage(),
+                       'stacktrace' => $this->getTraceAsString()
+               ));
+               WCF::getTPL()->display('userException');
+       }
 }
index cefbe58e659f761e53dd561e99af249d827b2bc4..45ebe49365b2a40c3da0c090475094b6060c2c3b 100644 (file)
@@ -1,30 +1,30 @@
-<?php\r
-namespace wcf\system\exception;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * A PermissionDeniedException is thrown when a user has no permission to access to a specific area.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category   Community Framework\r
- */\r
-class PermissionDeniedException extends UserException {\r
-       /**\r
-        * Creates a new IllegalLinkException object.\r
-        */\r
-       public function __construct() {\r
-               parent::__construct(WCF::getLanguage()->get('wcf.global.error.permissionDenied'));\r
-       }\r
-\r
-       /**\r
-        * Prints a permission denied exception.\r
-        */\r
-       public function show() {\r
-               @header('HTTP/1.0 403 Forbidden');\r
-               WCF::getTPL()->display('permissionDenied');\r
-       }\r
+<?php
+namespace wcf\system\exception;
+use wcf\system\WCF;
+
+/**
+ * A PermissionDeniedException is thrown when a user has no permission to access to a specific area.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.exception
+ * @category   Community Framework
+ */
+class PermissionDeniedException extends UserException {
+       /**
+        * Creates a new IllegalLinkException object.
+        */
+       public function __construct() {
+               parent::__construct(WCF::getLanguage()->get('wcf.global.error.permissionDenied'));
+       }
+
+       /**
+        * Prints a permission denied exception.
+        */
+       public function show() {
+               @header('HTTP/1.0 403 Forbidden');
+               WCF::getTPL()->display('permissionDenied');
+       }
 }
index 72854508d0e44bf09f7bce76af00700d61ff1ec8..79939c1e18932b68d850f52c14f667edcee3ab45 100644 (file)
@@ -1,21 +1,21 @@
-<?php\r
-namespace wcf\system\exception;\r
-\r
-/**\r
- * A UserException is thrown when a user gives invalid input data.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category   Community Framework\r
- */\r
-abstract class UserException extends \Exception implements IPrintableException {\r
-       /**\r
-        * @see wcf\system\exception\IPrintableException::show()\r
-        */\r
-       public function show() {\r
-               echo '<pre>' . $this->getTraceAsString() . '</pre>';\r
-       }\r
+<?php
+namespace wcf\system\exception;
+
+/**
+ * A UserException is thrown when a user gives invalid input data.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.exception
+ * @category   Community Framework
+ */
+abstract class UserException extends \Exception implements IPrintableException {
+       /**
+        * @see wcf\system\exception\IPrintableException::show()
+        */
+       public function show() {
+               echo '<pre>' . $this->getTraceAsString() . '</pre>';
+       }
 }
index 79d97530e42ecd9ea7303f828477f4a87f74bd3e..0b93eab51213c1d770d58cdbf5cb264406de36dd 100644 (file)
@@ -1,59 +1,59 @@
-<?php\r
-namespace wcf\system\exception;\r
-\r
-/**\r
- * UserInputException handles all formular input errors.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category   Community Framework\r
- */\r
-class UserInputException extends UserException {\r
-       /**\r
-        * Name of error field.\r
-        *\r
-        * @var string\r
-        */\r
-       protected $field = null;\r
-       \r
-       /**\r
-        * Error type.\r
-        *\r
-        * @var string\r
-        */\r
-       protected $type = null;\r
-       \r
-       /**\r
-        * Creates a new UserInputException.\r
-        * \r
-        * @param       string          $field          affected formular field\r
-        * @param       string          $type           kind of this error\r
-        */\r
-       public function __construct($field = '', $type = 'empty') {\r
-               $this->field = $field;\r
-               $this->type = $type;\r
-               \r
-               parent::__construct();\r
-       }\r
-       \r
-       /**\r
-        * Returns the affected formular field of this error.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getField() {\r
-               return $this->field;\r
-       }\r
-       \r
-       /**\r
-        * Returns the kind of this error.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getType() {\r
-               return $this->type;\r
-       }\r
+<?php
+namespace wcf\system\exception;
+
+/**
+ * UserInputException handles all formular input errors.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.exception
+ * @category   Community Framework
+ */
+class UserInputException extends UserException {
+       /**
+        * Name of error field.
+        *
+        * @var string
+        */
+       protected $field = null;
+       
+       /**
+        * Error type.
+        *
+        * @var string
+        */
+       protected $type = null;
+       
+       /**
+        * Creates a new UserInputException.
+        * 
+        * @param       string          $field          affected formular field
+        * @param       string          $type           kind of this error
+        */
+       public function __construct($field = '', $type = 'empty') {
+               $this->field = $field;
+               $this->type = $type;
+               
+               parent::__construct();
+       }
+       
+       /**
+        * Returns the affected formular field of this error.
+        * 
+        * @return      string
+        */
+       public function getField() {
+               return $this->field;
+       }
+       
+       /**
+        * Returns the kind of this error.
+        * 
+        * @return      string
+        */
+       public function getType() {
+               return $this->type;
+       }
 }
index c11bc99e46d793712797a8fffcb595bfcc40b0ba..ae12b2043bc5dcf7cd8eb92250494b6ba7f921fe 100644 (file)
@@ -1,13 +1,13 @@
-<?php\r
-namespace wcf\system\exception;\r
-\r
-/**\r
- * @todo       Ableitung von welcher Exception und wie soll die\r
- *             konkrete Anzeige sein, wenn diese Exception nicht\r
- *             ordnungsgemäß abgefangen wird?\r
- */\r
-class ValidateActionException extends \Exception {\r
-       public function __construct($message) {\r
-               die($message);\r
-       }\r
+<?php
+namespace wcf\system\exception;
+
+/**
+ * @todo       Ableitung von welcher Exception und wie soll die
+ *             konkrete Anzeige sein, wenn diese Exception nicht
+ *             ordnungsgemäß abgefangen wird?
+ */
+class ValidateActionException extends \Exception {
+       public function __construct($message) {
+               die($message);
+       }
 }
index f8d4209b9f5192c182f3f88e5a6882bf8f744b61..1758680922b22457e70f3b5c062c9ab9bd6e5edb 100644 (file)
-<?php\r
-namespace wcf\system\form;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * FormDocument holds the page structure based upon form element containers.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class FormDocument {\r
-       /**\r
-        * list of FormElementContainer objects\r
-        *\r
-        * @var array<wcf\system\form\IFormElementContainer>\r
-        */\r
-       protected $containers = array();\r
-       \r
-       /**\r
-        * form document name\r
-        *\r
-        * @var string\r
-        */\r
-       protected $name = '';\r
-       \r
-       /**\r
-        * Creates a new instance of FormDocument.\r
-        *\r
-        * @param       string          $name\r
-        */\r
-       public function __construct($name) {\r
-               $this->name = StringUtil::trim($name);\r
-       }\r
-       \r
-       /**\r
-        * Returns form document name.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getName() {\r
-               return $this->name;\r
-       }\r
-       \r
-       /**\r
-        * Appends a FormElementContainer object.\r
-        *\r
-        * @param       wcf\system\form\IFormElementContainer           $container\r
-        */\r
-       public function appendContainer(IFormElementContainer $container) {\r
-               $this->containers[] = $container;\r
-       }\r
-       \r
-       /**\r
-        * Prepends a FormElementContainer object.\r
-        *\r
-        * @param       wcf\system\form\IFormElementContainer           $container\r
-        */\r
-       public function prependContainer(IFormElementContainer $container) {\r
-               array_unshift($this->containers, $container);\r
-       }\r
-       \r
-       /**\r
-        * Returns assigned FormElementContainer objects.\r
-        *\r
-        * @return      array<wcf\system\form\IFormElementContainer>\r
-        */\r
-       public function getContainers() {\r
-               return $this->containers;\r
-       }\r
-       \r
-       /**\r
-        * Returns the value of container's child element with given name.\r
-        *\r
-        * @param       string          $key\r
-        * @return      mixed\r
-        */\r
-       public function getValue($key) {\r
-               foreach ($this->containers as $container) {\r
-                       $value = $container->getValue($key);\r
-                       if ($value !== null) {\r
-                               return $value;\r
-                       }\r
-               }\r
-               \r
-               return null;\r
-       }\r
-       \r
-       /**\r
-        * Returns HTML-representation of current document.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getHTML() {\r
-               $content = '';\r
-               \r
-               foreach ($this->containers as $container) {\r
-                       $content .= $container->getHTML($this->getName().'_');\r
-               }\r
-               \r
-               return $content;\r
-       }\r
-       \r
-       /**\r
-        * Handles request input variables.\r
-        */\r
-       public function handleRequest() {\r
-               $variables = array();\r
-               \r
-               foreach ($_REQUEST as $key => $value) {\r
-                       if (StringUtil::indexOf($key, $this->getName().'_') !== false) {\r
-                               $key = StringUtil::replace($this->getName().'_', '', $key);\r
-                               $variables[$key] = $value;\r
-                       }\r
-               }\r
-               \r
-               if (!empty($variables)) {\r
-                       foreach ($this->containers as $container) {\r
-                               $container->handleRequest($variables);\r
-                       }\r
-               }\r
-       }\r
+<?php
+namespace wcf\system\form;
+use wcf\util\StringUtil;
+
+/**
+ * FormDocument holds the page structure based upon form element containers.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class FormDocument {
+       /**
+        * list of FormElementContainer objects
+        *
+        * @var array<wcf\system\form\IFormElementContainer>
+        */
+       protected $containers = array();
+       
+       /**
+        * form document name
+        *
+        * @var string
+        */
+       protected $name = '';
+       
+       /**
+        * Creates a new instance of FormDocument.
+        *
+        * @param       string          $name
+        */
+       public function __construct($name) {
+               $this->name = StringUtil::trim($name);
+       }
+       
+       /**
+        * Returns form document name.
+        *
+        * @return      string
+        */
+       public function getName() {
+               return $this->name;
+       }
+       
+       /**
+        * Appends a FormElementContainer object.
+        *
+        * @param       wcf\system\form\IFormElementContainer           $container
+        */
+       public function appendContainer(IFormElementContainer $container) {
+               $this->containers[] = $container;
+       }
+       
+       /**
+        * Prepends a FormElementContainer object.
+        *
+        * @param       wcf\system\form\IFormElementContainer           $container
+        */
+       public function prependContainer(IFormElementContainer $container) {
+               array_unshift($this->containers, $container);
+       }
+       
+       /**
+        * Returns assigned FormElementContainer objects.
+        *
+        * @return      array<wcf\system\form\IFormElementContainer>
+        */
+       public function getContainers() {
+               return $this->containers;
+       }
+       
+       /**
+        * Returns the value of container's child element with given name.
+        *
+        * @param       string          $key
+        * @return      mixed
+        */
+       public function getValue($key) {
+               foreach ($this->containers as $container) {
+                       $value = $container->getValue($key);
+                       if ($value !== null) {
+                               return $value;
+                       }
+               }
+               
+               return null;
+       }
+       
+       /**
+        * Returns HTML-representation of current document.
+        *
+        * @return      string
+        */
+       public function getHTML() {
+               $content = '';
+               
+               foreach ($this->containers as $container) {
+                       $content .= $container->getHTML($this->getName().'_');
+               }
+               
+               return $content;
+       }
+       
+       /**
+        * Handles request input variables.
+        */
+       public function handleRequest() {
+               $variables = array();
+               
+               foreach ($_REQUEST as $key => $value) {
+                       if (StringUtil::indexOf($key, $this->getName().'_') !== false) {
+                               $key = StringUtil::replace($this->getName().'_', '', $key);
+                               $variables[$key] = $value;
+                       }
+               }
+               
+               if (!empty($variables)) {
+                       foreach ($this->containers as $container) {
+                               $container->handleRequest($variables);
+                       }
+               }
+       }
 }
index 73a94038f24146c2dde38176d447ad51b6481f7e..3f824892bcfdcc9dc4fa12a028fcfe8d19fcead1 100644 (file)
@@ -1,64 +1,64 @@
-<?php\r
-namespace wcf\system\form;\r
-\r
-/**\r
- * Interface for form elements.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-interface IFormElement {\r
-       /**\r
-        * Creates a new object of type FormElement.\r
-        *\r
-        * @param       wcf\system\form\IFormElementContainer           $parent\r
-        */\r
-       public function __construct(IFormElementContainer $parent);\r
-       \r
-       /**\r
-        * Returns help message.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getDescription();\r
-       \r
-       /**\r
-        * Sets help message.\r
-        *\r
-        * @param       string          $description\r
-        */\r
-       public function setDescription($description);\r
-       \r
-       /**\r
-        * Returns label.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getLabel();\r
-       \r
-       /**\r
-        * Sets label.\r
-        *\r
-        * @param       string          $label\r
-        */\r
-       public function setLabel($label);\r
-       \r
-       /**\r
-        * Returns element's parent container element.\r
-        *\r
-        * @return      wcf\system\form\IFormElementContainer\r
-        */\r
-       public function getParent();\r
-       \r
-       /**\r
-        * Returns HTML-representation of current form element.\r
-        *\r
-        * @param       string          $formName\r
-        * @return      string\r
-        */\r
-       public function getHTML($formName);\r
+<?php
+namespace wcf\system\form;
+
+/**
+ * Interface for form elements.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+interface IFormElement {
+       /**
+        * Creates a new object of type FormElement.
+        *
+        * @param       wcf\system\form\IFormElementContainer           $parent
+        */
+       public function __construct(IFormElementContainer $parent);
+       
+       /**
+        * Returns help message.
+        *
+        * @return      string
+        */
+       public function getDescription();
+       
+       /**
+        * Sets help message.
+        *
+        * @param       string          $description
+        */
+       public function setDescription($description);
+       
+       /**
+        * Returns label.
+        *
+        * @return      string
+        */
+       public function getLabel();
+       
+       /**
+        * Sets label.
+        *
+        * @param       string          $label
+        */
+       public function setLabel($label);
+       
+       /**
+        * Returns element's parent container element.
+        *
+        * @return      wcf\system\form\IFormElementContainer
+        */
+       public function getParent();
+       
+       /**
+        * Returns HTML-representation of current form element.
+        *
+        * @param       string          $formName
+        * @return      string
+        */
+       public function getHTML($formName);
 }
index 514ddb637356975d434ba3cf5b9ef2589898e575..e52a1bce0092b38e9db0f636dc70ea35fa89274e 100644 (file)
@@ -1,86 +1,86 @@
-<?php\r
-namespace wcf\system\form;\r
-\r
-/**\r
- * Interface for form element containers.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-interface IFormElementContainer {\r
-       /**\r
-        * Returns help message.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getDescription();\r
-       \r
-       /**\r
-        * Sets help message.\r
-        *\r
-        * @param       string          $description\r
-        */\r
-       public function setDescription($description);\r
-       \r
-       /**\r
-        * Returns label.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getLabel();\r
-       \r
-       /**\r
-        * Sets label.\r
-        *\r
-        * @param       string          $label\r
-        */\r
-       public function setLabel($label);\r
-       \r
-       /**\r
-        * Returns the value of child element with given name.\r
-        *\r
-        * @param       string          $key\r
-        * @return      mixed\r
-        */\r
-       public function getValue($key);\r
-       \r
-       /**\r
-        * Returns a list of child elements.\r
-        *\r
-        * @return      array<wcf\system\form\IFormElement>\r
-        */\r
-       public function getChildren();\r
-       \r
-       /**\r
-        * Appends a new child to stack.\r
-        *\r
-        * @param       wcf\system\form\IFormElement            $element\r
-        */\r
-       public function appendChild(IFormElement $element);\r
-       \r
-       /**\r
-        * Preprens a new child to stack.\r
-        *\r
-        * @param       wcf\system\form\IFormElement            $element\r
-        */\r
-       public function prependChild(IFormElement $element);\r
-       \r
-       /**\r
-        * Handles a POST or GET request.\r
-        *\r
-        * @param       array           $variables\r
-        */\r
-       public function handleRequest(array $variables);\r
-       \r
-       /**\r
-        * Returns HTML-representation of current form element container.\r
-        *\r
-        * @param       string          $formName\r
-        * @return      string\r
-        */\r
-       public function getHTML($formName);\r
+<?php
+namespace wcf\system\form;
+
+/**
+ * Interface for form element containers.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+interface IFormElementContainer {
+       /**
+        * Returns help message.
+        *
+        * @return      string
+        */
+       public function getDescription();
+       
+       /**
+        * Sets help message.
+        *
+        * @param       string          $description
+        */
+       public function setDescription($description);
+       
+       /**
+        * Returns label.
+        *
+        * @return      string
+        */
+       public function getLabel();
+       
+       /**
+        * Sets label.
+        *
+        * @param       string          $label
+        */
+       public function setLabel($label);
+       
+       /**
+        * Returns the value of child element with given name.
+        *
+        * @param       string          $key
+        * @return      mixed
+        */
+       public function getValue($key);
+       
+       /**
+        * Returns a list of child elements.
+        *
+        * @return      array<wcf\system\form\IFormElement>
+        */
+       public function getChildren();
+       
+       /**
+        * Appends a new child to stack.
+        *
+        * @param       wcf\system\form\IFormElement            $element
+        */
+       public function appendChild(IFormElement $element);
+       
+       /**
+        * Preprens a new child to stack.
+        *
+        * @param       wcf\system\form\IFormElement            $element
+        */
+       public function prependChild(IFormElement $element);
+       
+       /**
+        * Handles a POST or GET request.
+        *
+        * @param       array           $variables
+        */
+       public function handleRequest(array $variables);
+       
+       /**
+        * Returns HTML-representation of current form element container.
+        *
+        * @param       string          $formName
+        * @return      string
+        */
+       public function getHTML($formName);
 }
index f327ae9148bd15168a1862657d2e41b4639acc1c..e4cdcec0e5ae3beea2912eff868a7545dfc5851b 100644 (file)
-<?php\r
-namespace wcf\system\form\container;\r
-use wcf\system\form\IFormElement;\r
-use wcf\system\form\IFormElementContainer;\r
-use wcf\system\form\element\AbstractNamedFormElement;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Basic implementation for form element containers.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-abstract class AbstractFormElementContainer implements IFormElementContainer {\r
-       /**\r
-        * list of FormElement objects\r
-        *\r
-        * @var array<wcf\system\form\IFormElement>\r
-        */\r
-       protected $children = array();\r
-       \r
-       /**\r
-        * element description or help text\r
-        *\r
-        * @var string\r
-        */\r
-       protected $description = '';\r
-       \r
-       /**\r
-        * element label\r
-        *\r
-        * @var string\r
-        */\r
-       protected $label = '';\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::setDescription()\r
-        */\r
-       public function setDescription($description) {\r
-               $this->description = StringUtil::trim($description);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::getDescription()\r
-        */\r
-       public function getDescription() {\r
-               return $this->description;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::setLabel()\r
-        */\r
-       public function setLabel($label) {\r
-               $this->label = StringUtil::trim($label);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::getLabel()\r
-        */\r
-       public function getLabel() {\r
-               return $this->label;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::appendChild()\r
-        */\r
-       public function appendChild(IFormElement $element) {\r
-               $this->children[] = $element;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::prependChild()\r
-        */\r
-       public function prependChild(IFormElement $element) {\r
-               array_unshift($this->children, $element);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::getChildren()\r
-        */\r
-       public function getChildren() {\r
-               return $this->children;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::getValue()\r
-        */\r
-       public function getValue($key) {\r
-               foreach ($this->children as $element) {\r
-                       if ($element instanceof AbstractNamedFormElement) {\r
-                               if ($element->getName() == $key) {\r
-                                       return $element->getValue();\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               return null;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::handleRequest()\r
-        */\r
-       public function handleRequest(array $variables) {\r
-               foreach ($this->children as $element) {\r
-                       if (!($element instanceof AbstractNamedFormElement)) {\r
-                               return;\r
-                       }\r
-                       \r
-                       if (isset($variables[$element->getName()])) {\r
-                               $element->setValue($variables[$element->getName()]);\r
-                       }\r
-               }\r
-       }\r
+<?php
+namespace wcf\system\form\container;
+use wcf\system\form\IFormElement;
+use wcf\system\form\IFormElementContainer;
+use wcf\system\form\element\AbstractNamedFormElement;
+use wcf\util\StringUtil;
+
+/**
+ * Basic implementation for form element containers.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+abstract class AbstractFormElementContainer implements IFormElementContainer {
+       /**
+        * list of FormElement objects
+        *
+        * @var array<wcf\system\form\IFormElement>
+        */
+       protected $children = array();
+       
+       /**
+        * element description or help text
+        *
+        * @var string
+        */
+       protected $description = '';
+       
+       /**
+        * element label
+        *
+        * @var string
+        */
+       protected $label = '';
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::setDescription()
+        */
+       public function setDescription($description) {
+               $this->description = StringUtil::trim($description);
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::getDescription()
+        */
+       public function getDescription() {
+               return $this->description;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::setLabel()
+        */
+       public function setLabel($label) {
+               $this->label = StringUtil::trim($label);
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::getLabel()
+        */
+       public function getLabel() {
+               return $this->label;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::appendChild()
+        */
+       public function appendChild(IFormElement $element) {
+               $this->children[] = $element;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::prependChild()
+        */
+       public function prependChild(IFormElement $element) {
+               array_unshift($this->children, $element);
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::getChildren()
+        */
+       public function getChildren() {
+               return $this->children;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::getValue()
+        */
+       public function getValue($key) {
+               foreach ($this->children as $element) {
+                       if ($element instanceof AbstractNamedFormElement) {
+                               if ($element->getName() == $key) {
+                                       return $element->getValue();
+                               }
+                       }
+               }
+               
+               return null;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::handleRequest()
+        */
+       public function handleRequest(array $variables) {
+               foreach ($this->children as $element) {
+                       if (!($element instanceof AbstractNamedFormElement)) {
+                               return;
+                       }
+                       
+                       if (isset($variables[$element->getName()])) {
+                               $element->setValue($variables[$element->getName()]);
+                       }
+               }
+       }
 }
index 022750114e4a51b8c2e773bff95e045663d2e45d..3f06fd60043e2ef88ace0dd5d75cd5eabbaa6799 100644 (file)
@@ -1,34 +1,34 @@
-<?php\r
-namespace wcf\system\form\container;\r
-\r
-/**\r
- * Provides a group form element container.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class GroupFormElementContainer extends AbstractFormElementContainer {\r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::getHTML()\r
-        */\r
-       public function getHTML($formName) {\r
-               $content = '';\r
-               foreach ($this->children as $element) {\r
-                       $content .= $element->getHTML($formName);\r
-               }\r
-               \r
-               return <<<HTML\r
-<fieldset>\r
-       <legend>{$this->getLabel()}</legend>\r
-       \r
-       <p class="description">{$this->getDescription()}</p>\r
-       \r
-       {$content}\r
-</fieldset>\r
-HTML;\r
-       }\r
+<?php
+namespace wcf\system\form\container;
+
+/**
+ * Provides a group form element container.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class GroupFormElementContainer extends AbstractFormElementContainer {
+       /**
+        * @see wcf\system\form\IFormElementContainer::getHTML()
+        */
+       public function getHTML($formName) {
+               $content = '';
+               foreach ($this->children as $element) {
+                       $content .= $element->getHTML($formName);
+               }
+               
+               return <<<HTML
+<fieldset>
+       <legend>{$this->getLabel()}</legend>
+       
+       <p class="description">{$this->getDescription()}</p>
+       
+       {$content}
+</fieldset>
+HTML;
+       }
 }
index 4e7ef024fd980306f3873ec7f7b0e74f1c06f475..ac65a137662fb243e7968e505d59ab4917e36d1e 100644 (file)
@@ -1,69 +1,69 @@
-<?php\r
-namespace wcf\system\form\container;\r
-\r
-/**\r
- * Provides a multiple selection form element container.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class MultipleSelectionFormElementContainer extends SelectionFormElementContainer {\r
-       /**\r
-        * container value\r
-        *\r
-        * @var array\r
-        */\r
-       protected $value = array();\r
-       \r
-       /**\r
-        * Sets container value.\r
-        *\r
-        * @param       array           $value\r
-        */\r
-       public function setValue(array $value) {\r
-               $this->value = $value;\r
-       }\r
-       \r
-       /**\r
-        * Returns container value.\r
-        *\r
-        * @return      array\r
-        */\r
-       public function getValue() {\r
-               return $this->value;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::getHTML()\r
-        */\r
-       public function getHTML($formName) {\r
-               $content = '';\r
-               foreach ($this->getChildren() as $element) {\r
-                       $content .= $element->getHTML($formName);\r
-               }\r
-               \r
-               return <<<HTML\r
-<div class="formGroup">\r
-       <div class="formGroupLabel">\r
-               <label>{$this->getLabel()}</label>\r
-       </div>\r
-       <div class="formGroupField">\r
-               <fieldset>\r
-                       <legend>{$this->getLabel()}</legend>\r
-                       \r
-                       <div class="formField">\r
-                               {$content}\r
-                       </div>\r
-               </fieldset>\r
-       </div>\r
-       <div class="formGroupFieldDesc">\r
-               <p>{$this->getDescription()}</p>\r
-       </div>\r
-</div>\r
-HTML;\r
-       }\r
+<?php
+namespace wcf\system\form\container;
+
+/**
+ * Provides a multiple selection form element container.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class MultipleSelectionFormElementContainer extends SelectionFormElementContainer {
+       /**
+        * container value
+        *
+        * @var array
+        */
+       protected $value = array();
+       
+       /**
+        * Sets container value.
+        *
+        * @param       array           $value
+        */
+       public function setValue(array $value) {
+               $this->value = $value;
+       }
+       
+       /**
+        * Returns container value.
+        *
+        * @return      array
+        */
+       public function getValue() {
+               return $this->value;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::getHTML()
+        */
+       public function getHTML($formName) {
+               $content = '';
+               foreach ($this->getChildren() as $element) {
+                       $content .= $element->getHTML($formName);
+               }
+               
+               return <<<HTML
+<div class="formGroup">
+       <div class="formGroupLabel">
+               <label>{$this->getLabel()}</label>
+       </div>
+       <div class="formGroupField">
+               <fieldset>
+                       <legend>{$this->getLabel()}</legend>
+                       
+                       <div class="formField">
+                               {$content}
+                       </div>
+               </fieldset>
+       </div>
+       <div class="formGroupFieldDesc">
+               <p>{$this->getDescription()}</p>
+       </div>
+</div>
+HTML;
+       }
 }
index 3ce57a6ef26192816c40546fcaf0b8310dfe5da6..0eecc8cd259925d548bef5cda4c1b5d21f0e1829 100644 (file)
@@ -1,39 +1,39 @@
-<?php\r
-namespace wcf\system\form\container;\r
-\r
-/**\r
- * Basic implementation for form selection element containers.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-abstract class SelectionFormElementContainer extends AbstractFormElementContainer {\r
-       /**\r
-        * container name\r
-        *\r
-        * @var string\r
-        */\r
-       protected $name = '';\r
-       \r
-       /**\r
-        * Sets container name.\r
-        *\r
-        * @param       string          $name\r
-        */\r
-       public function setName($name) {\r
-               $this->name = StringUtil::trim($name);\r
-       }\r
-       \r
-       /**\r
-        * Returns container name\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getName() {\r
-               return $this->name;\r
-       }\r
+<?php
+namespace wcf\system\form\container;
+
+/**
+ * Basic implementation for form selection element containers.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+abstract class SelectionFormElementContainer extends AbstractFormElementContainer {
+       /**
+        * container name
+        *
+        * @var string
+        */
+       protected $name = '';
+       
+       /**
+        * Sets container name.
+        *
+        * @param       string          $name
+        */
+       public function setName($name) {
+               $this->name = StringUtil::trim($name);
+       }
+       
+       /**
+        * Returns container name
+        *
+        * @return      string
+        */
+       public function getName() {
+               return $this->name;
+       }
 }
index 197298787515b014186ba6945225d38c03f00275..5961c1622bafb32c54a568837d028d84cd6f6127 100644 (file)
@@ -1,69 +1,69 @@
-<?php\r
-namespace wcf\system\form\container;\r
-\r
-/**\r
- * Provides a single selection form element container.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class SingleSelectionFormElementContainer extends SelectionFormElementContainer {\r
-       /**\r
-        * container value\r
-        *\r
-        * @var string\r
-        */\r
-       protected $value = '';\r
-       \r
-       /**\r
-        * Sets container value.\r
-        *\r
-        * @param       string          $value\r
-        */\r
-       public function setValue($value) {\r
-               $this->value = StringUtil::trim($value);\r
-       }\r
-       \r
-       /**\r
-        * Returns container value.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getValue() {\r
-               return $this->value;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElementContainer::getHTML()\r
-        */\r
-       public function getHTML($formName) {\r
-               $content = '';\r
-               foreach ($this->getChildren() as $element) {\r
-                       $content .= $element->getHTML($formName);\r
-               }\r
-               \r
-               return <<<HTML\r
-<div class="formGroup">\r
-       <div class="formGroupLabel">\r
-               <label>{$this->getLabel()}</label>\r
-       </div>\r
-       <div class="formGroupField">\r
-               <fieldset>\r
-                       <legend>{$this->getLabel()}</legend>\r
-                       \r
-                       <div class="formField">\r
-                               {$content}\r
-                       </div>\r
-               </fieldset>\r
-       </div>\r
-       <div class="formGroupFieldDesc">\r
-               <p>{$this->getDescription()}</p>\r
-       </div>\r
-</div>\r
-HTML;\r
-       }\r
+<?php
+namespace wcf\system\form\container;
+
+/**
+ * Provides a single selection form element container.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class SingleSelectionFormElementContainer extends SelectionFormElementContainer {
+       /**
+        * container value
+        *
+        * @var string
+        */
+       protected $value = '';
+       
+       /**
+        * Sets container value.
+        *
+        * @param       string          $value
+        */
+       public function setValue($value) {
+               $this->value = StringUtil::trim($value);
+       }
+       
+       /**
+        * Returns container value.
+        *
+        * @return      string
+        */
+       public function getValue() {
+               return $this->value;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElementContainer::getHTML()
+        */
+       public function getHTML($formName) {
+               $content = '';
+               foreach ($this->getChildren() as $element) {
+                       $content .= $element->getHTML($formName);
+               }
+               
+               return <<<HTML
+<div class="formGroup">
+       <div class="formGroupLabel">
+               <label>{$this->getLabel()}</label>
+       </div>
+       <div class="formGroupField">
+               <fieldset>
+                       <legend>{$this->getLabel()}</legend>
+                       
+                       <div class="formField">
+                               {$content}
+                       </div>
+               </fieldset>
+       </div>
+       <div class="formGroupFieldDesc">
+               <p>{$this->getDescription()}</p>
+       </div>
+</div>
+HTML;
+       }
 }
index 14fad413fd8e44b65855fc98d29026be6e77a846..3035f58961e26e460c25a5893b5da2f12098e475 100644 (file)
@@ -1,80 +1,80 @@
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\system\form\IFormElement;\r
-use wcf\system\form\IFormElementContainer;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Basic implementation for form elements.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-abstract class AbstractFormElement implements IFormElement {\r
-       /**\r
-        * element description or help text\r
-        *\r
-        * @var string\r
-        */\r
-       protected $description = '';\r
-       \r
-       /**\r
-        * element label\r
-        *\r
-        * @var string\r
-        */\r
-       protected $label = '';\r
-       \r
-       /**\r
-        * FormElementContainer object\r
-        *\r
-        * @var wcf\system\form\IFormElementContainer\r
-        */\r
-       protected $parent = null;\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElement::__construct()\r
-        */\r
-       public function __construct(IFormElementContainer $parent) {\r
-               $this->parent = $parent;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElement::setDescription()\r
-        */\r
-       public function setDescription($description) {\r
-               $this->description = StringUtil::trim($description);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElement::getDescription()\r
-        */\r
-       public function getDescription() {\r
-               return $this->description;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElement::setLabel()\r
-        */\r
-       public function setLabel($label) {\r
-               $this->label = StringUtil::trim($label);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElement::getLabel()\r
-        */\r
-       public function getLabel() {\r
-               return $this->label;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElement::getParent()\r
-        */\r
-       public function getParent() {\r
-               return $this->parent;\r
-       }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\system\form\IFormElement;
+use wcf\system\form\IFormElementContainer;
+use wcf\util\StringUtil;
+
+/**
+ * Basic implementation for form elements.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+abstract class AbstractFormElement implements IFormElement {
+       /**
+        * element description or help text
+        *
+        * @var string
+        */
+       protected $description = '';
+       
+       /**
+        * element label
+        *
+        * @var string
+        */
+       protected $label = '';
+       
+       /**
+        * FormElementContainer object
+        *
+        * @var wcf\system\form\IFormElementContainer
+        */
+       protected $parent = null;
+       
+       /**
+        * @see wcf\system\form\IFormElement::__construct()
+        */
+       public function __construct(IFormElementContainer $parent) {
+               $this->parent = $parent;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElement::setDescription()
+        */
+       public function setDescription($description) {
+               $this->description = StringUtil::trim($description);
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElement::getDescription()
+        */
+       public function getDescription() {
+               return $this->description;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElement::setLabel()
+        */
+       public function setLabel($label) {
+               $this->label = StringUtil::trim($label);
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElement::getLabel()
+        */
+       public function getLabel() {
+               return $this->label;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElement::getParent()
+        */
+       public function getParent() {
+               return $this->parent;
+       }
 }
index f2c55b7e648df43e716175d0df517ee6394dddd5..db80e015ad94fd3c499e3384d4a696bac2b0fdaf 100644 (file)
@@ -1,65 +1,65 @@
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Basic implementation for named form elements.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-abstract class AbstractNamedFormElement extends AbstractFormElement {\r
-       /**\r
-        * element name\r
-        *\r
-        * @var string\r
-        */\r
-       protected $name = '';\r
-       \r
-       /**\r
-        * element value\r
-        *\r
-        * @var string\r
-        */\r
-       protected $value = '';\r
-       \r
-       /**\r
-        * Sets element name.\r
-        *\r
-        * @param       string          $name\r
-        */\r
-       public function setName($name) {\r
-               $this->name = StringUtil::trim($name);\r
-       }\r
-       \r
-       /**\r
-        * Returns element name\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getName() {\r
-               return $this->name;\r
-       }\r
-       \r
-       /**\r
-        * Sets element value.\r
-        *\r
-        * @param       string          $value\r
-        */\r
-       public function setValue($value) {\r
-               $this->value = StringUtil::trim($value);\r
-       }\r
-       \r
-       /**\r
-        * Returns element value.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getValue() {\r
-               return $this->value;\r
-       }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\util\StringUtil;
+
+/**
+ * Basic implementation for named form elements.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+abstract class AbstractNamedFormElement extends AbstractFormElement {
+       /**
+        * element name
+        *
+        * @var string
+        */
+       protected $name = '';
+       
+       /**
+        * element value
+        *
+        * @var string
+        */
+       protected $value = '';
+       
+       /**
+        * Sets element name.
+        *
+        * @param       string          $name
+        */
+       public function setName($name) {
+               $this->name = StringUtil::trim($name);
+       }
+       
+       /**
+        * Returns element name
+        *
+        * @return      string
+        */
+       public function getName() {
+               return $this->name;
+       }
+       
+       /**
+        * Sets element value.
+        *
+        * @param       string          $value
+        */
+       public function setValue($value) {
+               $this->value = StringUtil::trim($value);
+       }
+       
+       /**
+        * Returns element value.
+        *
+        * @return      string
+        */
+       public function getValue() {
+               return $this->value;
+       }
 }
index d920e05fe19c49f59b9f3ec2aff067b9077862f2..30a16c2dc1d532e03e05368973f23fce36d5374a 100644 (file)
@@ -1,59 +1,59 @@
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\system\util\StringUtil;\r
-\r
-/**\r
- * Provides a label form element.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class LabelFormElement extends AbstractFormElement {\r
-       /**\r
-        * element text\r
-        *\r
-        * @var string\r
-        */\r
-       protected $text = '';\r
-       \r
-       /**\r
-        * Sets element text.\r
-        *\r
-        * @param       string          $text\r
-        */\r
-       public function setText($text) {\r
-               $text->text = StringUtil::trim($text);\r
-       }\r
-       \r
-       /**\r
-        * Returns element text.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getText() {\r
-               return $this->text;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\form\IFormElement::getHTML()\r
-        */\r
-       public function getHTML($formName) {\r
-               return <<<HTML\r
-<div class="formElement">\r
-       <div class="formFieldLabel">\r
-               <label>{$this->getLabel()}</label>\r
-       </div>\r
-       <div class="formField">\r
-               {$this->getText()}\r
-       </div>\r
-       <div class="formFieldDesc">\r
-               <p>{$this->getDescription()}</p>\r
-       </div>\r
-</div>\r
-HTML;\r
-       }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\system\util\StringUtil;
+
+/**
+ * Provides a label form element.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class LabelFormElement extends AbstractFormElement {
+       /**
+        * element text
+        *
+        * @var string
+        */
+       protected $text = '';
+       
+       /**
+        * Sets element text.
+        *
+        * @param       string          $text
+        */
+       public function setText($text) {
+               $text->text = StringUtil::trim($text);
+       }
+       
+       /**
+        * Returns element text.
+        *
+        * @return      string
+        */
+       public function getText() {
+               return $this->text;
+       }
+       
+       /**
+        * @see wcf\system\form\IFormElement::getHTML()
+        */
+       public function getHTML($formName) {
+               return <<<HTML
+<div class="formElement">
+       <div class="formFieldLabel">
+               <label>{$this->getLabel()}</label>
+       </div>
+       <div class="formField">
+               {$this->getText()}
+       </div>
+       <div class="formFieldDesc">
+               <p>{$this->getDescription()}</p>
+       </div>
+</div>
+HTML;
+       }
 }
index 077ed6a73dcabdd214b3824603ffc78ad08c5ce1..3dfbc6d5407656e34bfeca5274254500cd9c3cc1 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\form\element;\r
-\r
-/**\r
- * Provides a radio form element.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class MultipleSelectionFormElement extends AbstractNamedFormElement {\r
-       /**\r
-        * @see wcf\system\form\IFormElement::getHTML()\r
-        */\r
-       public function getHTML($formName) {\r
-               return <<<HTML\r
-<label><input type="checkbox" name="{$formName}{$this->getParent()->getName()}[]" value="{$this->getValue()}" /> {$this->getLabel()}</label>\r
-HTML;\r
-       }\r
+<?php
+namespace wcf\system\form\element;
+
+/**
+ * Provides a radio form element.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class MultipleSelectionFormElement extends AbstractNamedFormElement {
+       /**
+        * @see wcf\system\form\IFormElement::getHTML()
+        */
+       public function getHTML($formName) {
+               return <<<HTML
+<label><input type="checkbox" name="{$formName}{$this->getParent()->getName()}[]" value="{$this->getValue()}" /> {$this->getLabel()}</label>
+HTML;
+       }
 }
index 5f8b815f4c5c313a9e32c3d9960e73ca15027328..8b8589d700afa9afedf2ff95f9dfc330fd8198d8 100644 (file)
@@ -1,34 +1,34 @@
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Provides a password input form element.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class PasswordInputFormElement extends AbstractNamedFormElement {\r
-       /**\r
-        * @see wcf\system\form\IFormElement::getHTML()\r
-        */\r
-       public function getHTML($formName) {\r
-               return <<<HTML\r
-<div class="formElement">\r
-       <div class="formFieldLabel">\r
-               <label for="{$this->getName()}">{$this->getLabel()}</label>\r
-       </div>\r
-       <div class="formField">\r
-               <input type="password" name="{$formName}{$this->getName()}" id="{$this->getName()}" value="{$this->getValue()}" />\r
-       </div>\r
-       <div class="formFieldDesc">\r
-               <p>{$this->getDescription()}</p>\r
-       </div>\r
-</div>\r
-HTML;\r
-       }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\util\StringUtil;
+
+/**
+ * Provides a password input form element.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class PasswordInputFormElement extends AbstractNamedFormElement {
+       /**
+        * @see wcf\system\form\IFormElement::getHTML()
+        */
+       public function getHTML($formName) {
+               return <<<HTML
+<div class="formElement">
+       <div class="formFieldLabel">
+               <label for="{$this->getName()}">{$this->getLabel()}</label>
+       </div>
+       <div class="formField">
+               <input type="password" name="{$formName}{$this->getName()}" id="{$this->getName()}" value="{$this->getValue()}" />
+       </div>
+       <div class="formFieldDesc">
+               <p>{$this->getDescription()}</p>
+       </div>
+</div>
+HTML;
+       }
 }
index f3a6bda7c60bc8134d9837396b0a546806f33a6a..e3a6c811607146119bb12489ee10c7d426a9131d 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\form\element;\r
-\r
-/**\r
- * Provides a checkbox form element.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class SingleSelectionFormElement extends AbstractNamedFormElement {\r
-       /**\r
-        * @see wcf\system\form\IFormElement::getHTML()\r
-        */\r
-       public function getHTML($formName) {\r
-               return <<<HTML\r
-<label><input type="radio" name="{$formName}{$this->getParent()->getName()}" value="{$this->getValue()}" /> {$this->getLabel()}</label>\r
-HTML;\r
-       }\r
+<?php
+namespace wcf\system\form\element;
+
+/**
+ * Provides a checkbox form element.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class SingleSelectionFormElement extends AbstractNamedFormElement {
+       /**
+        * @see wcf\system\form\IFormElement::getHTML()
+        */
+       public function getHTML($formName) {
+               return <<<HTML
+<label><input type="radio" name="{$formName}{$this->getParent()->getName()}" value="{$this->getValue()}" /> {$this->getLabel()}</label>
+HTML;
+       }
 }
index 62aa1e834a6de33f6e7e044e5d475472b1b06825..7a41b9b8b2baed98540392f3710fda525f05c4b5 100644 (file)
@@ -1,34 +1,34 @@
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Provides a text input form element.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category   Community Framework\r
- */\r
-class TextInputFormElement extends AbstractNamedFormElement {\r
-       /**\r
-        * @see wcf\system\form\IFormElement::getHTML()\r
-        */\r
-       public function getHTML($formName) {\r
-               return <<<HTML\r
-<div class="formElement">\r
-       <div class="formFieldLabel">\r
-               <label for="{$this->getName()}">{$this->getLabel()}</label>\r
-       </div>\r
-       <div class="formField">\r
-               <input type="text" name="{$formName}{$this->getName()}" id="{$this->getName()}" value="{$this->getValue()}" />\r
-       </div>\r
-       <div class="formFieldDesc">\r
-               <p>{$this->getDescription()}</p>\r
-       </div>\r
-</div>\r
-HTML;\r
-       }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\util\StringUtil;
+
+/**
+ * Provides a text input form element.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.form
+ * @category   Community Framework
+ */
+class TextInputFormElement extends AbstractNamedFormElement {
+       /**
+        * @see wcf\system\form\IFormElement::getHTML()
+        */
+       public function getHTML($formName) {
+               return <<<HTML
+<div class="formElement">
+       <div class="formFieldLabel">
+               <label for="{$this->getName()}">{$this->getLabel()}</label>
+       </div>
+       <div class="formField">
+               <input type="text" name="{$formName}{$this->getName()}" id="{$this->getName()}" value="{$this->getValue()}" />
+       </div>
+       <div class="formFieldDesc">
+               <p>{$this->getDescription()}</p>
+       </div>
+</div>
+HTML;
+       }
 }
index f41d105272b88440ceb2b759767fb6953ab61f76..ab94a82e4b89bfe941d884afdb704267107df8ab 100644 (file)
-<?php\r
-namespace wcf\system\image;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Generates a thumbnail of given source file image.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.image\r
- * @category   Community Framework\r
- */\r
-class Thumbnail {\r
-       /**\r
-        * path to source file\r
-        *\r
-        * @var string\r
-        */\r
-       protected $sourceFile = '';\r
-       \r
-       /**\r
-        * maximum image width\r
-        *\r
-        * @var integer\r
-        */\r
-       protected $maxWidth = 0;\r
-       \r
-       /**\r
-        * maximum image height\r
-        *\r
-        * @var integer\r
-        */\r
-       protected $maxHeight = 0;\r
-       \r
-       /**\r
-        * true, to show source information in thumbnail\r
-        *\r
-        * @var boolean\r
-        */\r
-       protected $appendSourceInfo = false;\r
-       \r
-       /**\r
-        * true, to prefer embedded thumbnails\r
-        *\r
-        * @var boolean\r
-        */\r
-       protected $useEmbedded = true;\r
-       \r
-       /**\r
-        * true, to generate quadratic thumbnails\r
-        * \r
-        * @var boolean\r
-        */\r
-       protected $quadratic = false;\r
-               \r
-       /**\r
-        * mime type of the thumbnail\r
-        *\r
-        * @var string\r
-        */\r
-       protected $mimeType = '';\r
-       \r
-       /**\r
-        * name of the source image\r
-        *\r
-        * @var string\r
-        */\r
-       protected $sourceName = '';\r
-       \r
-       /**\r
-        * width of the source image\r
-        * \r
-        * @var integer\r
-        */\r
-       protected $sourceWidth = 0;\r
-       \r
-       /**\r
-        * height of the source image\r
-        * \r
-        * @var integer\r
-        */\r
-       protected $sourceHeight = 0;\r
-       \r
-       /**\r
-        * file size of the source image\r
-        * \r
-        * @var integer\r
-        */\r
-       protected $sourceSize = 0;\r
-       \r
-       /**\r
-        * height of the source information\r
-        * \r
-        * @var integer\r
-        */\r
-       protected static $sourceInfoLineHeight = 16;\r
-       \r
-       /**\r
-        * image type of the source image\r
-        * \r
-        * @var integer\r
-        */\r
-       protected $imageType = 0;\r
-       \r
-       /**\r
-        * Creates a new Thumbnail object.\r
-        * \r
-        * @param       string          $sourceFile\r
-        * @param       integer         $maxWidth\r
-        * @param       integer         $maxHeight\r
-        * @param       boolean         $appendSourceInfo\r
-        */\r
-       public function __construct($sourceFile, $maxWidth = 100, $maxHeight = 100, $appendSourceInfo = false, $sourceName = null, $useEmbedded = true, $quadratic = false) {\r
-               $this->sourceFile = $sourceFile;\r
-               $this->maxWidth = $maxWidth;\r
-               $this->maxHeight = $maxHeight;\r
-               $this->appendSourceInfo = $appendSourceInfo;\r
-               $this->useEmbedded = $useEmbedded;\r
-               $this->quadratic = $quadratic;\r
-               if ($this->appendSourceInfo) {\r
-                       // get source info\r
-                       if ($sourceName != null) $this->sourceName = $sourceName;\r
-                       else $this->sourceName = basename($this->sourceFile);\r
-                       list($this->sourceWidth, $this->sourceHeight, $type) = @getImageSize($this->sourceFile);\r
-                       $this->sourceSize = @filesize($sourceFile);\r
-               }\r
-       }\r
-       \r
-       /** \r
-        * Creates a thumbnail picture (jpg/png) of a big image\r
-        * \r
-        * @param       boolean         $rescale\r
-        * @return      string          thumbnail \r
-        */\r
-       public function makeThumbnail($rescale = false) {\r
-               list($width, $height, $this->imageType) = @getImageSize($this->sourceFile);\r
-       \r
-               // check image size\r
-               if ($this->checkSize($width, $height, $rescale)) {\r
-                       return false;   \r
-               }\r
-\r
-               // try to extract the embedded thumbnail first (faster)\r
-               $thumbnail = false;\r
-               if (!$rescale && $this->useEmbedded) {\r
-                       $thumbnail = $this->extractEmbeddedThumbnail();\r
-               }\r
-               if (!$thumbnail) {\r
-                       // calculate uncompressed filesize\r
-                       // and cancel to avoid a memory_limit error\r
-                       $memoryLimit = ini_get('memory_limit');\r
-                       if ($memoryLimit != '') {\r
-                               $memoryLimit = substr($memoryLimit, 0, -1) * 1024 * 1024;\r
-                               $fileSize = $width * $height * ($this->imageType == 3 ? 4 : 3);\r
-               \r
-                               if (($fileSize * 2.1) + memory_get_usage() > ($memoryLimit)) {\r
-                                       return false;\r
-                               }\r
-                       }\r
-                       \r
-                       // calculate new picture size\r
-                       $x = $y = 0;\r
-                       if ($this->quadratic) {\r
-                               $newWidth = $newHeight = $this->maxWidth;\r
-                               if ($this->appendSourceInfo) $newHeight -= self::$sourceInfoLineHeight * 2;\r
-                               \r
-                               if ($width > $height) {\r
-                                       $x = ceil(($width - $height) / 2);\r
-                                       $width = $height;\r
-                               }\r
-                               else {\r
-                                       $y = ceil(($height - $width) / 2);\r
-                                       $height = $width;\r
-                               }\r
-                       }\r
-                       else {\r
-                               $maxHeight = $this->maxHeight;\r
-                               if ($this->appendSourceInfo) $maxHeight -= self::$sourceInfoLineHeight * 2;\r
-                               if ($this->maxWidth / $width < $maxHeight / $height) {\r
-                                       $newWidth = $this->maxWidth;\r
-                                       $newHeight = round($height * ($newWidth / $width));\r
-                               }\r
-                               else {\r
-                                       $newHeight = $maxHeight;        \r
-                                       $newWidth = round($width * ($newHeight / $height));\r
-                               }\r
-                       }\r
-                       \r
-                       // resize image\r
-                       $imageResource = false;\r
-                       \r
-                       // jpeg image\r
-                       if ($this->imageType == 2 && function_exists('imagecreatefromjpeg')) {\r
-                               $imageResource = @imageCreateFromJPEG($this->sourceFile);\r
-                       }\r
-                       // gif image\r
-                       if ($this->imageType == 1 && function_exists('imagecreatefromgif')) {\r
-                               $imageResource = @imageCreateFromGIF($this->sourceFile);\r
-                       }\r
-                       // png image\r
-                       if ($this->imageType == 3 && function_exists('imagecreatefrompng')) {\r
-                               $imageResource = @imageCreateFromPNG($this->sourceFile);\r
-                       }\r
-                       \r
-                       // could not create image\r
-                       if (!$imageResource) {\r
-                               return false;\r
-                       }\r
-                       \r
-                       // resize image\r
-                       if (function_exists('imageCreateTrueColor') && function_exists('imageCopyResampled')) {\r
-                               $imageNew = @imageCreateTrueColor($newWidth, $newHeight);\r
-                               imageAlphaBlending($imageNew, false);\r
-                               @imageCopyResampled($imageNew, $imageResource, 0, 0, $x, $y, $newWidth, $newHeight, $width, $height);\r
-                               imageSaveAlpha($imageNew, true);\r
-                       }\r
-                       else if (function_exists('imageCreate') && function_exists('imageCopyResized')) {\r
-                               $imageNew = @imageCreate($newWidth, $newHeight);\r
-                               imageAlphaBlending($imageNew, false);\r
-                               @imageCopyResized($imageNew, $imageResource, 0, 0, $x, $y, $newWidth, $newHeight, $width, $height);\r
-                               imageSaveAlpha($imageNew, true);\r
-                       }\r
-                       else return false;\r
-                       \r
-                       // create thumbnail\r
-                       ob_start();\r
-                       \r
-                       if ($this->imageType == 1 && function_exists('imageGIF')) {\r
-                               @imageGIF($imageNew);\r
-                               $this->mimeType = 'image/gif';\r
-                       }\r
-                       else if (($this->imageType == 1 || $this->imageType == 3) && function_exists('imagePNG')) {\r
-                               @imagePNG($imageNew);\r
-                               $this->mimeType = 'image/png';\r
-                       }\r
-                       else if (function_exists('imageJPEG')) {\r
-                               @imageJPEG($imageNew, '', 90);\r
-                               $this->mimeType = 'image/jpeg';\r
-                       }\r
-                       else {\r
-                               return false;\r
-                       }\r
-                       \r
-                       @imageDestroy($imageNew);\r
-                       $thumbnail = ob_get_contents();\r
-                       ob_end_clean();\r
-               }\r
-               \r
-               if ($thumbnail && $this->appendSourceInfo && !$rescale) {\r
-                       $thumbnail = $this->appendSourceInfo($thumbnail);\r
-               }\r
-               \r
-               return $thumbnail;\r
-       }\r
-       \r
-       /**\r
-        * Appends information about the source image to the thumbnail.\r
-        * \r
-        * @param       string          $thumbnail\r
-        * @return      string\r
-        */\r
-       protected function appendSourceInfo($thumbnail) {\r
-               if (!function_exists('imageCreateFromString') || !function_exists('imageCreateTrueColor')) {\r
-                       return $thumbnail;\r
-               }\r
-               \r
-               $imageSrc = imageCreateFromString($thumbnail);\r
-               \r
-               // get image size\r
-               $width = imageSX($imageSrc);\r
-               $height = imageSY($imageSrc);\r
-               \r
-               // increase height\r
-               $heightDst = $height + self::$sourceInfoLineHeight * 2;\r
-               \r
-               // create new image\r
-               $imageDst = imageCreateTrueColor($width, $heightDst);\r
-               imageAlphaBlending($imageDst, false);\r
-               \r
-               // set background color\r
-               $background = imageColorAllocate($imageDst, 102, 102, 102);\r
-               imageFill($imageDst, 0, 0, $background);\r
-\r
-               // copy image\r
-               imageCopy($imageDst, $imageSrc, 0, 0, 0, 0, $width, $height);\r
-               imageSaveAlpha($imageDst, true);\r
-               \r
-               // get font size\r
-               $font = 2;\r
-               $fontWidth = imageFontWidth($font);\r
-               $fontHeight = imageFontHeight($font);\r
-               $fontColor = imageColorAllocate($imageDst, 255, 255, 255);\r
-               \r
-               // write source info\r
-               $line1 = $this->sourceName;\r
-               \r
-               // imageString supports only ISO-8859-1 encoded strings\r
-               $line1 = StringUtil::convertEncoding('UTF-8', 'ISO-8859-1', $line1);\r
-               \r
-               // truncate text if necessary\r
-               $maxChars = floor($width / $fontWidth);\r
-               if (strlen($line1) > $maxChars) {\r
-                       $line1 = $this->truncateSourceName($line1, $maxChars);\r
-               }\r
-               \r
-               $line2 = $this->sourceWidth.'x'.$this->sourceHeight.' '.FileUtil::formatFilesize($this->sourceSize);\r
-               \r
-               // write line 1\r
-               // calculate text position\r
-               $textX = 0;\r
-               $textY = 0;\r
-               \r
-               if ($fontHeight < self::$sourceInfoLineHeight) {\r
-                       $textY = intval(round((self::$sourceInfoLineHeight - $fontHeight) / 2));\r
-               }\r
-               if (strlen($line1) * $fontWidth < $width) {\r
-                       $textX = intval(round(($width - strlen($line1) * $fontWidth) / 2));\r
-               }\r
-               \r
-               imageString($imageDst, $font, $textX, $height + $textY, $line1, $fontColor);\r
-               \r
-               // write line 2\r
-               // calculate text position\r
-               $textX = 0;\r
-               $textY = 0;\r
-               \r
-               if ($fontHeight < self::$sourceInfoLineHeight) {\r
-                       $textY = self::$sourceInfoLineHeight + intval(round((self::$sourceInfoLineHeight - $fontHeight) / 2));\r
-               }\r
-               if (strlen($line2) * $fontWidth < $width) {\r
-                       $textX = intval(round(($width - strlen($line2) * $fontWidth) / 2));\r
-               }\r
-               \r
-               imageString($imageDst, $font, $textX, $height + $textY, $line2, $fontColor);\r
-               \r
-               \r
-               // output image\r
-               ob_start();\r
-               \r
-               if ($this->imageType == 1 && function_exists('imageGIF')) {\r
-                       @imageGIF($imageDst);\r
-                       $this->mimeType = 'image/gif';\r
-               }\r
-               else if (($this->imageType == 1 || $this->imageType == 3) && function_exists('imagePNG')) {\r
-                       @imagePNG($imageDst);\r
-                       $this->mimeType = 'image/png';\r
-               }\r
-               else if (function_exists('imageJPEG')) {\r
-                       @imageJPEG($imageDst, '', 90);\r
-                       $this->mimeType = 'image/jpeg';\r
-               }\r
-               else {\r
-                       return false;\r
-               }\r
-               \r
-               @imageDestroy($imageDst);\r
-               $thumbnail = ob_get_contents();\r
-               ob_end_clean();\r
-               \r
-               return $thumbnail;\r
-       }\r
-       \r
-       \r
-       /** \r
-        * Extracts the embedded thumbnail picture of a jpeg or tiff image\r
-        * \r
-        * @return      string          thumbnail \r
-        */\r
-       protected function extractEmbeddedThumbnail() {\r
-               if (!function_exists('exif_thumbnail')) {\r
-                       return false;\r
-               }\r
-\r
-               $width = $height = $type = 0;\r
-               $thumbnail = @exif_thumbnail($this->sourceFile, $width, $height, $type);\r
-               if ($thumbnail && $type && $width && $height) {\r
-                       // resize the extracted thumbnail again if necessary\r
-                       // (normally the thumbnail size is set to 160px\r
-                       // which is recommended in EXIF >2.1 and DCF)\r
-                       $this->mimeType = image_type_to_mime_type($type);\r
-                       if (!$this->checkSize($width, $height)) {\r
-                               // get temporary file name\r
-                               $this->sourceFile = FileUtil::getTemporaryFilename('thumbnail_');\r
-                               \r
-                               // create tmp file\r
-                               $tmpFile = new File($this->sourceFile);\r
-                               $tmpFile->write($thumbnail);\r
-                               $tmpFile->close();\r
-                               unset($thumbnail, $tmpFile);\r
-                               \r
-                               // resize tmp file again\r
-                               return $this->makeThumbnail(true);\r
-                       }\r
-                       \r
-                       return $thumbnail;\r
-               }\r
-               \r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * Checks the size of an image.\r
-        */\r
-       protected function checkSize($width, $height, $rescale = true) {\r
-               $maxHeight = $this->maxHeight;\r
-               if ($this->appendSourceInfo && $rescale) {\r
-                       $maxHeight -= self::$sourceInfoLineHeight * 2;\r
-               }\r
-               \r
-               if ($width > $this->maxWidth || $height > $maxHeight) {\r
-                       return false;\r
-               }\r
-               \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Returns the mime type of the generated thumbnail.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getMimeType() {\r
-               return $this->mimeType;\r
-       }\r
-       \r
-       /**\r
-        * Truncates the given file name to needed length.\r
-        * \r
-        * @param       string          $name\r
-        * @param       string          $maxChars\r
-        * @return      string\r
-        */\r
-       protected static function truncateSourceName($name, $maxChars) {\r
-               $extension = '';\r
-               $lastPosition = strrpos($name, '.');\r
-               if ($lastPosition !== null) {\r
-                       $extension = substr($name, $lastPosition);\r
-                       $name = substr($name, 0, $lastPosition);\r
-                       $maxChars -= strlen($extension);\r
-               }\r
-               \r
-               return substr($name, 0, $maxChars - 3) . '...' . $extension;\r
-       }\r
+<?php
+namespace wcf\system\image;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Generates a thumbnail of given source file image.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.image
+ * @category   Community Framework
+ */
+class Thumbnail {
+       /**
+        * path to source file
+        *
+        * @var string
+        */
+       protected $sourceFile = '';
+       
+       /**
+        * maximum image width
+        *
+        * @var integer
+        */
+       protected $maxWidth = 0;
+       
+       /**
+        * maximum image height
+        *
+        * @var integer
+        */
+       protected $maxHeight = 0;
+       
+       /**
+        * true, to show source information in thumbnail
+        *
+        * @var boolean
+        */
+       protected $appendSourceInfo = false;
+       
+       /**
+        * true, to prefer embedded thumbnails
+        *
+        * @var boolean
+        */
+       protected $useEmbedded = true;
+       
+       /**
+        * true, to generate quadratic thumbnails
+        * 
+        * @var boolean
+        */
+       protected $quadratic = false;
+               
+       /**
+        * mime type of the thumbnail
+        *
+        * @var string
+        */
+       protected $mimeType = '';
+       
+       /**
+        * name of the source image
+        *
+        * @var string
+        */
+       protected $sourceName = '';
+       
+       /**
+        * width of the source image
+        * 
+        * @var integer
+        */
+       protected $sourceWidth = 0;
+       
+       /**
+        * height of the source image
+        * 
+        * @var integer
+        */
+       protected $sourceHeight = 0;
+       
+       /**
+        * file size of the source image
+        * 
+        * @var integer
+        */
+       protected $sourceSize = 0;
+       
+       /**
+        * height of the source information
+        * 
+        * @var integer
+        */
+       protected static $sourceInfoLineHeight = 16;
+       
+       /**
+        * image type of the source image
+        * 
+        * @var integer
+        */
+       protected $imageType = 0;
+       
+       /**
+        * Creates a new Thumbnail object.
+        * 
+        * @param       string          $sourceFile
+        * @param       integer         $maxWidth
+        * @param       integer         $maxHeight
+        * @param       boolean         $appendSourceInfo
+        */
+       public function __construct($sourceFile, $maxWidth = 100, $maxHeight = 100, $appendSourceInfo = false, $sourceName = null, $useEmbedded = true, $quadratic = false) {
+               $this->sourceFile = $sourceFile;
+               $this->maxWidth = $maxWidth;
+               $this->maxHeight = $maxHeight;
+               $this->appendSourceInfo = $appendSourceInfo;
+               $this->useEmbedded = $useEmbedded;
+               $this->quadratic = $quadratic;
+               if ($this->appendSourceInfo) {
+                       // get source info
+                       if ($sourceName != null) $this->sourceName = $sourceName;
+                       else $this->sourceName = basename($this->sourceFile);
+                       list($this->sourceWidth, $this->sourceHeight, $type) = @getImageSize($this->sourceFile);
+                       $this->sourceSize = @filesize($sourceFile);
+               }
+       }
+       
+       /** 
+        * Creates a thumbnail picture (jpg/png) of a big image
+        * 
+        * @param       boolean         $rescale
+        * @return      string          thumbnail 
+        */
+       public function makeThumbnail($rescale = false) {
+               list($width, $height, $this->imageType) = @getImageSize($this->sourceFile);
+       
+               // check image size
+               if ($this->checkSize($width, $height, $rescale)) {
+                       return false;   
+               }
+
+               // try to extract the embedded thumbnail first (faster)
+               $thumbnail = false;
+               if (!$rescale && $this->useEmbedded) {
+                       $thumbnail = $this->extractEmbeddedThumbnail();
+               }
+               if (!$thumbnail) {
+                       // calculate uncompressed filesize
+                       // and cancel to avoid a memory_limit error
+                       $memoryLimit = ini_get('memory_limit');
+                       if ($memoryLimit != '') {
+                               $memoryLimit = substr($memoryLimit, 0, -1) * 1024 * 1024;
+                               $fileSize = $width * $height * ($this->imageType == 3 ? 4 : 3);
+               
+                               if (($fileSize * 2.1) + memory_get_usage() > ($memoryLimit)) {
+                                       return false;
+                               }
+                       }
+                       
+                       // calculate new picture size
+                       $x = $y = 0;
+                       if ($this->quadratic) {
+                               $newWidth = $newHeight = $this->maxWidth;
+                               if ($this->appendSourceInfo) $newHeight -= self::$sourceInfoLineHeight * 2;
+                               
+                               if ($width > $height) {
+                                       $x = ceil(($width - $height) / 2);
+                                       $width = $height;
+                               }
+                               else {
+                                       $y = ceil(($height - $width) / 2);
+                                       $height = $width;
+                               }
+                       }
+                       else {
+                               $maxHeight = $this->maxHeight;
+                               if ($this->appendSourceInfo) $maxHeight -= self::$sourceInfoLineHeight * 2;
+                               if ($this->maxWidth / $width < $maxHeight / $height) {
+                                       $newWidth = $this->maxWidth;
+                                       $newHeight = round($height * ($newWidth / $width));
+                               }
+                               else {
+                                       $newHeight = $maxHeight;        
+                                       $newWidth = round($width * ($newHeight / $height));
+                               }
+                       }
+                       
+                       // resize image
+                       $imageResource = false;
+                       
+                       // jpeg image
+                       if ($this->imageType == 2 && function_exists('imagecreatefromjpeg')) {
+                               $imageResource = @imageCreateFromJPEG($this->sourceFile);
+                       }
+                       // gif image
+                       if ($this->imageType == 1 && function_exists('imagecreatefromgif')) {
+                               $imageResource = @imageCreateFromGIF($this->sourceFile);
+                       }
+                       // png image
+                       if ($this->imageType == 3 && function_exists('imagecreatefrompng')) {
+                               $imageResource = @imageCreateFromPNG($this->sourceFile);
+                       }
+                       
+                       // could not create image
+                       if (!$imageResource) {
+                               return false;
+                       }
+                       
+                       // resize image
+                       if (function_exists('imageCreateTrueColor') && function_exists('imageCopyResampled')) {
+                               $imageNew = @imageCreateTrueColor($newWidth, $newHeight);
+                               imageAlphaBlending($imageNew, false);
+                               @imageCopyResampled($imageNew, $imageResource, 0, 0, $x, $y, $newWidth, $newHeight, $width, $height);
+                               imageSaveAlpha($imageNew, true);
+                       }
+                       else if (function_exists('imageCreate') && function_exists('imageCopyResized')) {
+                               $imageNew = @imageCreate($newWidth, $newHeight);
+                               imageAlphaBlending($imageNew, false);
+                               @imageCopyResized($imageNew, $imageResource, 0, 0, $x, $y, $newWidth, $newHeight, $width, $height);
+                               imageSaveAlpha($imageNew, true);
+                       }
+                       else return false;
+                       
+                       // create thumbnail
+                       ob_start();
+                       
+                       if ($this->imageType == 1 && function_exists('imageGIF')) {
+                               @imageGIF($imageNew);
+                               $this->mimeType = 'image/gif';
+                       }
+                       else if (($this->imageType == 1 || $this->imageType == 3) && function_exists('imagePNG')) {
+                               @imagePNG($imageNew);
+                               $this->mimeType = 'image/png';
+                       }
+                       else if (function_exists('imageJPEG')) {
+                               @imageJPEG($imageNew, '', 90);
+                               $this->mimeType = 'image/jpeg';
+                       }
+                       else {
+                               return false;
+                       }
+                       
+                       @imageDestroy($imageNew);
+                       $thumbnail = ob_get_contents();
+                       ob_end_clean();
+               }
+               
+               if ($thumbnail && $this->appendSourceInfo && !$rescale) {
+                       $thumbnail = $this->appendSourceInfo($thumbnail);
+               }
+               
+               return $thumbnail;
+       }
+       
+       /**
+        * Appends information about the source image to the thumbnail.
+        * 
+        * @param       string          $thumbnail
+        * @return      string
+        */
+       protected function appendSourceInfo($thumbnail) {
+               if (!function_exists('imageCreateFromString') || !function_exists('imageCreateTrueColor')) {
+                       return $thumbnail;
+               }
+               
+               $imageSrc = imageCreateFromString($thumbnail);
+               
+               // get image size
+               $width = imageSX($imageSrc);
+               $height = imageSY($imageSrc);
+               
+               // increase height
+               $heightDst = $height + self::$sourceInfoLineHeight * 2;
+               
+               // create new image
+               $imageDst = imageCreateTrueColor($width, $heightDst);
+               imageAlphaBlending($imageDst, false);
+               
+               // set background color
+               $background = imageColorAllocate($imageDst, 102, 102, 102);
+               imageFill($imageDst, 0, 0, $background);
+
+               // copy image
+               imageCopy($imageDst, $imageSrc, 0, 0, 0, 0, $width, $height);
+               imageSaveAlpha($imageDst, true);
+               
+               // get font size
+               $font = 2;
+               $fontWidth = imageFontWidth($font);
+               $fontHeight = imageFontHeight($font);
+               $fontColor = imageColorAllocate($imageDst, 255, 255, 255);
+               
+               // write source info
+               $line1 = $this->sourceName;
+               
+               // imageString supports only ISO-8859-1 encoded strings
+               $line1 = StringUtil::convertEncoding('UTF-8', 'ISO-8859-1', $line1);
+               
+               // truncate text if necessary
+               $maxChars = floor($width / $fontWidth);
+               if (strlen($line1) > $maxChars) {
+                       $line1 = $this->truncateSourceName($line1, $maxChars);
+               }
+               
+               $line2 = $this->sourceWidth.'x'.$this->sourceHeight.' '.FileUtil::formatFilesize($this->sourceSize);
+               
+               // write line 1
+               // calculate text position
+               $textX = 0;
+               $textY = 0;
+               
+               if ($fontHeight < self::$sourceInfoLineHeight) {
+                       $textY = intval(round((self::$sourceInfoLineHeight - $fontHeight) / 2));
+               }
+               if (strlen($line1) * $fontWidth < $width) {
+                       $textX = intval(round(($width - strlen($line1) * $fontWidth) / 2));
+               }
+               
+               imageString($imageDst, $font, $textX, $height + $textY, $line1, $fontColor);
+               
+               // write line 2
+               // calculate text position
+               $textX = 0;
+               $textY = 0;
+               
+               if ($fontHeight < self::$sourceInfoLineHeight) {
+                       $textY = self::$sourceInfoLineHeight + intval(round((self::$sourceInfoLineHeight - $fontHeight) / 2));
+               }
+               if (strlen($line2) * $fontWidth < $width) {
+                       $textX = intval(round(($width - strlen($line2) * $fontWidth) / 2));
+               }
+               
+               imageString($imageDst, $font, $textX, $height + $textY, $line2, $fontColor);
+               
+               
+               // output image
+               ob_start();
+               
+               if ($this->imageType == 1 && function_exists('imageGIF')) {
+                       @imageGIF($imageDst);
+                       $this->mimeType = 'image/gif';
+               }
+               else if (($this->imageType == 1 || $this->imageType == 3) && function_exists('imagePNG')) {
+                       @imagePNG($imageDst);
+                       $this->mimeType = 'image/png';
+               }
+               else if (function_exists('imageJPEG')) {
+                       @imageJPEG($imageDst, '', 90);
+                       $this->mimeType = 'image/jpeg';
+               }
+               else {
+                       return false;
+               }
+               
+               @imageDestroy($imageDst);
+               $thumbnail = ob_get_contents();
+               ob_end_clean();
+               
+               return $thumbnail;
+       }
+       
+       
+       /** 
+        * Extracts the embedded thumbnail picture of a jpeg or tiff image
+        * 
+        * @return      string          thumbnail 
+        */
+       protected function extractEmbeddedThumbnail() {
+               if (!function_exists('exif_thumbnail')) {
+                       return false;
+               }
+
+               $width = $height = $type = 0;
+               $thumbnail = @exif_thumbnail($this->sourceFile, $width, $height, $type);
+               if ($thumbnail && $type && $width && $height) {
+                       // resize the extracted thumbnail again if necessary
+                       // (normally the thumbnail size is set to 160px
+                       // which is recommended in EXIF >2.1 and DCF)
+                       $this->mimeType = image_type_to_mime_type($type);
+                       if (!$this->checkSize($width, $height)) {
+                               // get temporary file name
+                               $this->sourceFile = FileUtil::getTemporaryFilename('thumbnail_');
+                               
+                               // create tmp file
+                               $tmpFile = new File($this->sourceFile);
+                               $tmpFile->write($thumbnail);
+                               $tmpFile->close();
+                               unset($thumbnail, $tmpFile);
+                               
+                               // resize tmp file again
+                               return $this->makeThumbnail(true);
+                       }
+                       
+                       return $thumbnail;
+               }
+               
+               return false;
+       }
+       
+       /**
+        * Checks the size of an image.
+        */
+       protected function checkSize($width, $height, $rescale = true) {
+               $maxHeight = $this->maxHeight;
+               if ($this->appendSourceInfo && $rescale) {
+                       $maxHeight -= self::$sourceInfoLineHeight * 2;
+               }
+               
+               if ($width > $this->maxWidth || $height > $maxHeight) {
+                       return false;
+               }
+               
+               return true;
+       }
+       
+       /**
+        * Returns the mime type of the generated thumbnail.
+        * 
+        * @return      string
+        */
+       public function getMimeType() {
+               return $this->mimeType;
+       }
+       
+       /**
+        * Truncates the given file name to needed length.
+        * 
+        * @param       string          $name
+        * @param       string          $maxChars
+        * @return      string
+        */
+       protected static function truncateSourceName($name, $maxChars) {
+               $extension = '';
+               $lastPosition = strrpos($name, '.');
+               if ($lastPosition !== null) {
+                       $extension = substr($name, $lastPosition);
+                       $name = substr($name, 0, $lastPosition);
+                       $maxChars -= strlen($extension);
+               }
+               
+               return substr($name, 0, $maxChars - 3) . '...' . $extension;
+       }
 }
index aa6e11fda6bf7a2273b4ef207f2784c9f7957ece..d78c4107ed88af8b46a88b1353954fbc67ef8245 100644 (file)
@@ -1,50 +1,50 @@
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The FTP class handles all ftp operations.\r
- *  \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category   Community Framework\r
- */\r
-class FTP {\r
-       /**\r
-        * file pointer resource\r
-        * @var resource\r
-        */\r
-       protected $resource = null;\r
-\r
-       /**\r
-        * Opens a new ftp connection to given host.\r
-        * \r
-        * @param       string          $host\r
-        * @param       string          $port\r
-        * @param       integer         $timeout\r
-        */\r
-       public function __construct($host = 'localhost', $port = 21, $timeout = 30) {\r
-               $this->resource = ftp_connect($host, $port, $timeout);\r
-               if ($this->resource === false) {\r
-                       throw new SystemException('Can not connect to ' . $host, 11008);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Calls the specified function on the open ftp connection.\r
-        * \r
-        * @param       string          $function\r
-        * @param       array           $arguments\r
-        */\r
-       public function __call($function, $arguments) {\r
-               array_unshift($arguments, $this->resource);\r
-               if (!function_exists('ftp_'.$function)) {\r
-                       throw new SystemException('Can not call method ' . $function, 11003);\r
-               }\r
-               \r
-               return call_user_func_array('ftp_' . $function, $arguments);\r
-       }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+
+/**
+ * The FTP class handles all ftp operations.
+ *  
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.io
+ * @category   Community Framework
+ */
+class FTP {
+       /**
+        * file pointer resource
+        * @var resource
+        */
+       protected $resource = null;
+
+       /**
+        * Opens a new ftp connection to given host.
+        * 
+        * @param       string          $host
+        * @param       string          $port
+        * @param       integer         $timeout
+        */
+       public function __construct($host = 'localhost', $port = 21, $timeout = 30) {
+               $this->resource = ftp_connect($host, $port, $timeout);
+               if ($this->resource === false) {
+                       throw new SystemException('Can not connect to ' . $host, 11008);
+               }
+       }
+
+       /**
+        * Calls the specified function on the open ftp connection.
+        * 
+        * @param       string          $function
+        * @param       array           $arguments
+        */
+       public function __call($function, $arguments) {
+               array_unshift($arguments, $this->resource);
+               if (!function_exists('ftp_'.$function)) {
+                       throw new SystemException('Can not call method ' . $function, 11003);
+               }
+               
+               return call_user_func_array('ftp_' . $function, $arguments);
+       }
 }
index a5a4130e7fc7b4fef94db2473a1592cffcfa9fee..988dc3880721881d3c8b6152e705a9ccbafb5db8 100644 (file)
@@ -1,80 +1,80 @@
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The File class handles all file operations.\r
- * \r
- * Example:\r
- * using php functions:\r
- * $fp = fopen('filename', 'wb');\r
- * fwrite($fp, '...');\r
- * fclose($fp);\r
- * \r
- * using this class:\r
- * $file = new File('filename');\r
- * $file->write('...');\r
- * $file->close();\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category   Community Framework\r
- */\r
-class File {\r
-       /**\r
-        * file pointer resource\r
-        * @var resource\r
-        */\r
-       protected $resource = null;\r
-       \r
-       /**\r
-        * filename\r
-        * @var string\r
-        */\r
-       protected $filename = '';\r
-       \r
-       /**\r
-        * Opens a new file.\r
-        * \r
-        * @param       string          $filename\r
-        * @param       string          $mode\r
-        * @param       array           $options\r
-        */\r
-       public function __construct($filename, $mode = 'wb', $options = array()) {\r
-               $this->filename = $filename;\r
-               if (count($options)) {\r
-                       $context = stream_context_create($options);\r
-                       $this->resource = fopen($filename, $mode, false, $context);\r
-               }\r
-               else {\r
-                       $this->resource = fopen($filename, $mode);\r
-               }\r
-               if ($this->resource === false) {\r
-                       throw new SystemException('Can not open file ' . $filename, 11012);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Calls the specified function on the open file.\r
-        * Do not call this function directly. Use $file->write('') instead.\r
-        * \r
-        * @param       string          $function\r
-        * @param       array           $arguments\r
-        */\r
-       public function __call($function, $arguments) {\r
-               if (function_exists('f' . $function)) {\r
-                       array_unshift($arguments, $this->resource);\r
-                       return call_user_func_array('f' . $function, $arguments);\r
-               }\r
-               else if (function_exists($function)) {\r
-                       array_unshift($arguments, $this->filename);\r
-                       return call_user_func_array($function, $arguments);\r
-               }\r
-               else {\r
-                       throw new SystemException('Can not call file method ' . $function, 11003);\r
-               }\r
-       }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+
+/**
+ * The File class handles all file operations.
+ * 
+ * Example:
+ * using php functions:
+ * $fp = fopen('filename', 'wb');
+ * fwrite($fp, '...');
+ * fclose($fp);
+ * 
+ * using this class:
+ * $file = new File('filename');
+ * $file->write('...');
+ * $file->close();
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.io
+ * @category   Community Framework
+ */
+class File {
+       /**
+        * file pointer resource
+        * @var resource
+        */
+       protected $resource = null;
+       
+       /**
+        * filename
+        * @var string
+        */
+       protected $filename = '';
+       
+       /**
+        * Opens a new file.
+        * 
+        * @param       string          $filename
+        * @param       string          $mode
+        * @param       array           $options
+        */
+       public function __construct($filename, $mode = 'wb', $options = array()) {
+               $this->filename = $filename;
+               if (count($options)) {
+                       $context = stream_context_create($options);
+                       $this->resource = fopen($filename, $mode, false, $context);
+               }
+               else {
+                       $this->resource = fopen($filename, $mode);
+               }
+               if ($this->resource === false) {
+                       throw new SystemException('Can not open file ' . $filename, 11012);
+               }
+       }
+       
+       /**
+        * Calls the specified function on the open file.
+        * Do not call this function directly. Use $file->write('') instead.
+        * 
+        * @param       string          $function
+        * @param       array           $arguments
+        */
+       public function __call($function, $arguments) {
+               if (function_exists('f' . $function)) {
+                       array_unshift($arguments, $this->resource);
+                       return call_user_func_array('f' . $function, $arguments);
+               }
+               else if (function_exists($function)) {
+                       array_unshift($arguments, $this->filename);
+                       return call_user_func_array($function, $arguments);
+               }
+               else {
+                       throw new SystemException('Can not call file method ' . $function, 11003);
+               }
+       }
 }
index 03598052f7770b80b0c35d9b35a0b89105f1d491..3856c285c10ac2a85d0b0fe06d177bbec0b3673f 100644 (file)
@@ -1,77 +1,77 @@
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The File class handles all file operations on a gzip file.\r
- *  \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category   Community Framework\r
- */\r
-class GZipFile extends File {\r
-       /**\r
-        * Opens a gzip file.\r
-        * \r
-        * @param       string          $filename\r
-        * @param       string          $mode\r
-        */\r
-       public function __construct($filename, $mode = 'wb') {\r
-               $this->filename = $filename;\r
-               $this->resource = gzopen($filename, $mode);\r
-               if ($this->resource === false) {\r
-                       throw new SystemException('Can not open file ' . $filename, 11012);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Calls the specified function on the open file.\r
-        * \r
-        * @param       string          $function\r
-        * @param       array           $arguments\r
-        */\r
-       public function __call($function, $arguments) {\r
-               if (function_exists('gz' . $function)) {\r
-                       array_unshift($arguments, $this->resource);\r
-                       return call_user_func_array('gz' . $function, $arguments);\r
-               }\r
-               else if (function_exists($function)) {\r
-                       array_unshift($arguments, $this->filename);\r
-                       return call_user_func_array($function, $arguments);\r
-               }\r
-               else {\r
-                       throw new SystemException('Can not call method ' . $function, 11003);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the filesize of the unzipped file.\r
-        * \r
-        * @return      integer\r
-        */\r
-       public function getFileSize() {\r
-               $byteBlock = 1<<14;\r
-               $eof = $byteBlock;\r
-               \r
-               // the correction is for zip files that are too small \r
-               // to get in the first while loop \r
-               $correction = 1;\r
-               while ($this->seek($eof) == 0) {\r
-                       $eof += $byteBlock;\r
-                       $correction = 0;\r
-               }\r
-               \r
-               while ($byteBlock > 1) {\r
-                       $byteBlock >>= 1;\r
-                       $eof += $byteBlock * ($this->seek($eof) ? -1 : 1);\r
-               }\r
-               \r
-               if ($this->seek($eof) == -1) $eof -= 1;\r
-                               \r
-               $this->rewind();\r
-               return $eof - $correction;\r
-       }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+
+/**
+ * The File class handles all file operations on a gzip file.
+ *  
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.io
+ * @category   Community Framework
+ */
+class GZipFile extends File {
+       /**
+        * Opens a gzip file.
+        * 
+        * @param       string          $filename
+        * @param       string          $mode
+        */
+       public function __construct($filename, $mode = 'wb') {
+               $this->filename = $filename;
+               $this->resource = gzopen($filename, $mode);
+               if ($this->resource === false) {
+                       throw new SystemException('Can not open file ' . $filename, 11012);
+               }
+       }
+       
+       /**
+        * Calls the specified function on the open file.
+        * 
+        * @param       string          $function
+        * @param       array           $arguments
+        */
+       public function __call($function, $arguments) {
+               if (function_exists('gz' . $function)) {
+                       array_unshift($arguments, $this->resource);
+                       return call_user_func_array('gz' . $function, $arguments);
+               }
+               else if (function_exists($function)) {
+                       array_unshift($arguments, $this->filename);
+                       return call_user_func_array($function, $arguments);
+               }
+               else {
+                       throw new SystemException('Can not call method ' . $function, 11003);
+               }
+       }
+       
+       /**
+        * Returns the filesize of the unzipped file.
+        * 
+        * @return      integer
+        */
+       public function getFileSize() {
+               $byteBlock = 1<<14;
+               $eof = $byteBlock;
+               
+               // the correction is for zip files that are too small 
+               // to get in the first while loop 
+               $correction = 1;
+               while ($this->seek($eof) == 0) {
+                       $eof += $byteBlock;
+                       $correction = 0;
+               }
+               
+               while ($byteBlock > 1) {
+                       $byteBlock >>= 1;
+                       $eof += $byteBlock * ($this->seek($eof) ? -1 : 1);
+               }
+               
+               if ($this->seek($eof) == -1) $eof -= 1;
+                               
+               $this->rewind();
+               return $eof - $correction;
+       }
 }
index 584df03126377cf9913c37e7007781990c50f73e..56ec39f280955d55df2f7e5b936f2ebb2f394ad2 100644 (file)
@@ -1,80 +1,80 @@
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The RemoteFile class opens a connection to a remote host as a file.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category   Community Framework\r
- */\r
-class RemoteFile extends File {\r
-       /**\r
-        * host address\r
-        * @var string\r
-        */\r
-       protected $host = '';\r
-       \r
-       /**\r
-        * port\r
-        * @var integer\r
-        */\r
-       protected $port = 0;\r
-       \r
-       /**\r
-        * error number\r
-        * @var integer\r
-        */\r
-       protected $errorNumber = 0;\r
-       \r
-       /**\r
-        * error description\r
-        * @var string\r
-        */\r
-       protected $errorDesc = '';\r
-       \r
-       /**\r
-        * Opens a new connection to a remote host.\r
-        * \r
-        * @param       string          $host\r
-        * @param       integer         $port\r
-        * @param       integer         $timeout\r
-        * @param       array           $options\r
-        */\r
-       public function __construct($host, $port, $timeout = 30, $options = array()) {\r
-               $this->host = $host;\r
-               $this->port = $port;\r
-               if (count($options)) {\r
-                       $context = stream_context_create($options);\r
-                       $this->resource = fsockopen($host, $port, $this->errorNumber, $this->errorDesc, $timeout, $context);\r
-               }\r
-               else {\r
-                       $this->resource = fsockopen($host, $port, $this->errorNumber, $this->errorDesc, $timeout);\r
-               }\r
-               if ($this->resource === false) {\r
-                       throw new SystemException('Can not connect to ' . $host, 14000);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the error number of the last error.\r
-        * \r
-        * @return      integer\r
-        */\r
-       public function getErrorNumber() {\r
-               return $this->errorNumber;\r
-       }\r
-       \r
-       /**\r
-        * Returns the error description of the last error.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getErrorDesc() {\r
-               return $this->errorDesc;\r
-       }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+
+/**
+ * The RemoteFile class opens a connection to a remote host as a file.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.io
+ * @category   Community Framework
+ */
+class RemoteFile extends File {
+       /**
+        * host address
+        * @var string
+        */
+       protected $host = '';
+       
+       /**
+        * port
+        * @var integer
+        */
+       protected $port = 0;
+       
+       /**
+        * error number
+        * @var integer
+        */
+       protected $errorNumber = 0;
+       
+       /**
+        * error description
+        * @var string
+        */
+       protected $errorDesc = '';
+       
+       /**
+        * Opens a new connection to a remote host.
+        * 
+        * @param       string          $host
+        * @param       integer         $port
+        * @param       integer         $timeout
+        * @param       array           $options
+        */
+       public function __construct($host, $port, $timeout = 30, $options = array()) {
+               $this->host = $host;
+               $this->port = $port;
+               if (count($options)) {
+                       $context = stream_context_create($options);
+                       $this->resource = fsockopen($host, $port, $this->errorNumber, $this->errorDesc, $timeout, $context);
+               }
+               else {
+                       $this->resource = fsockopen($host, $port, $this->errorNumber, $this->errorDesc, $timeout);
+               }
+               if ($this->resource === false) {
+                       throw new SystemException('Can not connect to ' . $host, 14000);
+               }
+       }
+       
+       /**
+        * Returns the error number of the last error.
+        * 
+        * @return      integer
+        */
+       public function getErrorNumber() {
+               return $this->errorNumber;
+       }
+       
+       /**
+        * Returns the error description of the last error.
+        * 
+        * @return      string
+        */
+       public function getErrorDesc() {
+               return $this->errorDesc;
+       }
 }
index 9bfa6bbb31ab725726e0180f03aad57d551fcd79..42f48059c9a7bd7c14dad3794b0fb2e8b1a002fa 100644 (file)
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\FileUtil;\r
-\r
-/**\r
- * Opens tar or tar.gz archives.\r
- * \r
- * Usage:\r
- * ------\r
- * $tar = new Tar('archive.tar');\r
- * $contentList = $tar->getContentList();\r
- * foreach ($contentList as $key => $val) {\r
- *     $tar->extract($key, DESTINATION);\r
- * }\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category   Community Framework\r
- */\r
-class Tar {\r
-       protected $archiveName = '';\r
-       protected $contentList = array();\r
-       protected $opened = false;\r
-       protected $read = false;\r
-       protected $file = null;\r
-       protected $isZipped = false;\r
-       protected $mode = 'rb';\r
-       \r
-       /**\r
-        * Creates a new Tar object.\r
-        * archiveName must be tarball or gzipped tarball\r
-        * \r
-        * @param       string          $archiveName\r
-        */\r
-       public function __construct($archiveName) {\r
-               $match = array();\r
-               if (!is_file($archiveName)) {\r
-                       throw new SystemException("unable to find tar archive '".$archiveName."'", 11002);\r
-               }\r
-               \r
-               $this->archiveName = $archiveName;\r
-               $this->open();\r
-               $this->readContent();\r
-       }\r
-       \r
-       /**\r
-        * Destructor of this class, closes tar archive.\r
-        */\r
-       public function __destruct() {\r
-               $this->close();\r
-       }\r
-       \r
-       /**\r
-        * Opens the tar archive and stores filehandle.\r
-        */\r
-       public function open() {\r
-               if (!$this->opened) {\r
-                       if ($this->isZipped) $this->file = new GZipFile($this->archiveName, $this->mode);\r
-                       else {\r
-                               // test compression\r
-                               $this->file = new File($this->archiveName, $this->mode);\r
-                               if ($this->file->read(2) == "\37\213") {\r
-                                       $this->file->close();\r
-                                       $this->isZipped = true;\r
-                                       $this->file = new GZipFile($this->archiveName, $this->mode);\r
-                               }\r
-                               else {\r
-                                       $this->file->seek(0);\r
-                               }\r
-                       }\r
-                       $this->opened = true;\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Closes the opened file.\r
-        */\r
-       public function close() {\r
-               if ($this->opened) {\r
-                       $this->file->close();\r
-                       $this->opened = false;\r
-               }\r
-       }\r
-       \r
-       /** \r
-        * Returns the table of contents (TOC) list for this tar archive.\r
-        * \r
-        * @return      array           list of content\r
-        */\r
-       public function getContentList() {\r
-               if (!$this->read) {\r
-                       $this->open();\r
-                       $this->readContent();\r
-               }\r
-               return $this->contentList;\r
-       }\r
-       \r
-       /**\r
-        * Returns an associative array with information\r
-        * about a specific file in the archive.\r
-        *\r
-        * @param       mixed   $fileindex      index or name of the requested file\r
-        * @return      array   $fileInfo\r
-        */\r
-       public function getFileInfo($fileIndex) {\r
-               if (!is_int($fileIndex)) {\r
-                       $fileIndex = $this->getIndexByFilename($fileIndex);\r
-               }\r
-               \r
-               if (!isset($this->contentList[$fileIndex])) {\r
-                       throw new SystemException("Tar: could find file '".$fileIndex."' in archive", 11013);\r
-               }\r
-               return $this->contentList[$fileIndex];\r
-       }\r
-       \r
-       /**\r
-        * Searchs a file in the tar archive\r
-        * and returns the numeric fileindex.\r
-        * Returns false if not found.\r
-        *\r
-        * @param       string          $filename\r
-        * @return      integer                         index of the requested file\r
-        */\r
-       public function getIndexByFilename($filename) {\r
-               foreach ($this->contentList as $index => $file) {\r
-                       if ($file['filename'] == $filename) {\r
-                               return $index;\r
-                       }\r
-               }\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * Extracts a specific file and returns the content as string.\r
-        * Returns false if extraction failed.\r
-        * \r
-        * @param       mixed           $index          index or name of the requested file\r
-        * @return      string                          content of the requested file\r
-        */\r
-       public function extractToString($index) {\r
-               if (!$this->read) {\r
-                       $this->open();\r
-                       $this->readContent();\r
-               }\r
-               $header = $this->getFileInfo($index);\r
-               \r
-               // can not extract a folder\r
-               if ($header['type'] != 'file') {\r
-                       return false;\r
-               }\r
-               \r
-               // seek to offset\r
-               $this->file->seek($header['offset']);\r
-               \r
-               // read data\r
-               $content = '';\r
-               $n = floor($header['size'] / 512);\r
-               for ($i = 0; $i < $n; $i++) {\r
-                       $content .= $this->file->read(512);\r
-               }\r
-               if (($header['size'] % 512) != 0) {\r
-                       $buffer = $this->file->read(512);\r
-                       $content .= substr($buffer, 0, ($header['size'] % 512));\r
-               }\r
-               \r
-               return $content;\r
-       }\r
-       \r
-       /**\r
-        * Extracts a specific file and writes it's content\r
-        * to the file specified with $destination.\r
-        * \r
-        * @param       mixed           $index          index or name of the requested file\r
-        * @param       string          $destination\r
-        * @return      boolean         $success\r
-        */\r
-       public function extract($index, $destination) {\r
-               if (!$this->read) {\r
-                       $this->open();\r
-                       $this->readContent();\r
-               }\r
-               $header = $this->getFileInfo($index);\r
-               \r
-               // can not extract a folder\r
-               if ($header['type'] != 'file') {\r
-                       return false;\r
-               }\r
-               \r
-               // seek to offset\r
-               $this->file->seek($header['offset']);\r
-               \r
-               $targetFile = new File($destination);\r
-               \r
-               // read data\r
-               $n = floor($header['size'] / 512);\r
-               for ($i = 0; $i < $n; $i++) {\r
-                       $content = $this->file->read(512);\r
-                       $targetFile->write($content, 512);\r
-               }\r
-               if (($header['size'] % 512) != 0) {\r
-                       $content = $this->file->read(512);\r
-                       $targetFile->write($content, ($header['size'] % 512));\r
-               }\r
-               \r
-               $targetFile->close();\r
-               if (FileUtil::isApacheModule() || !@$targetFile->is_writable()) {\r
-                       @$targetFile->chmod(0777);\r
-               }\r
-               else {\r
-                       @$targetFile->chmod(0755);\r
-               }\r
-               \r
-               if ($header['mtime']) {\r
-                       @$targetFile->touch($header['mtime']);\r
-               }\r
-               \r
-               // check filesize\r
-               if (filesize($destination) != $header['size']) {\r
-                       throw new SystemException("Could not untar file '".$header['filename']."' to '".$destination."'. Maybe disk quota exceeded in folder '".dirname($destination)."'.", 11015);\r
-               }\r
-               \r
-               return true;\r
-       }       \r
-       \r
-       /**\r
-        * Reads table of contents (TOC) from tar archive.\r
-        * This does not get the entire to memory but only parts of it.\r
-        */\r
-       protected function readContent() {\r
-               $this->contentList = array();\r
-               $this->read = true;\r
-               $i = 0;\r
-               \r
-               // Read the 512 bytes header\r
-               while (strlen($binaryData = $this->file->read(512)) != 0) {\r
-                       // read header\r
-                       $header = $this->readHeader($binaryData);\r
-                       if ($header === false) {\r
-                               continue;       \r
-                       }\r
-                       $this->contentList[$i] = $header;\r
-                       $this->contentList[$i]['index'] = $i;\r
-                       $i++;\r
-                       \r
-                       $this->file->seek($this->file->tell() + (512 * ceil(($header['size'] / 512))));\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Unpacks file header for one file entry.\r
-        *\r
-        * @param       string          $binaryData\r
-        * @return      array           $fileheader\r
-        */\r
-       protected function readHeader($binaryData) {\r
-               if (strlen($binaryData) != 512) {\r
-                       return false;   \r
-               }\r
-\r
-               $header = array();\r
-               $checksum = 0;\r
-               // First part of the header\r
-               for ($i = 0; $i < 148; $i++) {\r
-                       $checksum += ord(substr($binaryData, $i, 1));\r
-               }\r
-               // Calculate the checksum\r
-               // Ignore the checksum value and replace it by ' ' (space)\r
-               for ($i = 148; $i < 156; $i++) {\r
-                       $checksum += ord(' ');\r
-               }\r
-               // Last part of the header\r
-               for ($i = 156; $i < 512; $i++) {\r
-                       $checksum += ord(substr($binaryData, $i, 1));\r
-               }\r
-\r
-               // Extract the values\r
-               //$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $binaryData);\r
-               $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $binaryData);\r
-               \r
-               // Extract the properties\r
-               $header['checksum'] = octDec(trim($data['checksum']));\r
-               if ($header['checksum'] == $checksum) {\r
-                       $header['filename'] = trim($data['filename']);\r
-                       $header['mode'] = octDec(trim($data['mode']));\r
-                       $header['uid'] = octDec(trim($data['uid']));\r
-                       $header['gid'] = octDec(trim($data['gid']));\r
-                       $header['size'] = octDec(trim($data['size']));\r
-                       $header['mtime'] = octDec(trim($data['mtime']));\r
-                       $header['prefix'] = trim($data['prefix']);\r
-                       if ($header['prefix']) {\r
-                               $header['filename'] = $header['prefix'].'/'.$header['filename'];\r
-                       }\r
-                       if (($header['typeflag'] = $data['typeflag']) == '5') {\r
-                               $header['size'] = 0;\r
-                               $header['type'] = 'folder';\r
-                       }\r
-                       else {\r
-                               $header['type'] = 'file';\r
-                       }\r
-                       $header['offset'] = $this->file->tell();\r
-                       \r
-                       return $header;\r
-               }\r
-               else {\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns true, if this tar is (g)zipped.\r
-        * \r
-        * @return      boolean\r
-        */\r
-       public function isZipped() {\r
-               return $this->isZipped;\r
-       }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+use wcf\util\FileUtil;
+
+/**
+ * Opens tar or tar.gz archives.
+ * 
+ * Usage:
+ * ------
+ * $tar = new Tar('archive.tar');
+ * $contentList = $tar->getContentList();
+ * foreach ($contentList as $key => $val) {
+ *     $tar->extract($key, DESTINATION);
+ * }
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.io
+ * @category   Community Framework
+ */
+class Tar {
+       protected $archiveName = '';
+       protected $contentList = array();
+       protected $opened = false;
+       protected $read = false;
+       protected $file = null;
+       protected $isZipped = false;
+       protected $mode = 'rb';
+       
+       /**
+        * Creates a new Tar object.
+        * archiveName must be tarball or gzipped tarball
+        * 
+        * @param       string          $archiveName
+        */
+       public function __construct($archiveName) {
+               $match = array();
+               if (!is_file($archiveName)) {
+                       throw new SystemException("unable to find tar archive '".$archiveName."'", 11002);
+               }
+               
+               $this->archiveName = $archiveName;
+               $this->open();
+               $this->readContent();
+       }
+       
+       /**
+        * Destructor of this class, closes tar archive.
+        */
+       public function __destruct() {
+               $this->close();
+       }
+       
+       /**
+        * Opens the tar archive and stores filehandle.
+        */
+       public function open() {
+               if (!$this->opened) {
+                       if ($this->isZipped) $this->file = new GZipFile($this->archiveName, $this->mode);
+                       else {
+                               // test compression
+                               $this->file = new File($this->archiveName, $this->mode);
+                               if ($this->file->read(2) == "\37\213") {
+                                       $this->file->close();
+                                       $this->isZipped = true;
+                                       $this->file = new GZipFile($this->archiveName, $this->mode);
+                               }
+                               else {
+                                       $this->file->seek(0);
+                               }
+                       }
+                       $this->opened = true;
+               }
+       }
+
+       /**
+        * Closes the opened file.
+        */
+       public function close() {
+               if ($this->opened) {
+                       $this->file->close();
+                       $this->opened = false;
+               }
+       }
+       
+       /** 
+        * Returns the table of contents (TOC) list for this tar archive.
+        * 
+        * @return      array           list of content
+        */
+       public function getContentList() {
+               if (!$this->read) {
+                       $this->open();
+                       $this->readContent();
+               }
+               return $this->contentList;
+       }
+       
+       /**
+        * Returns an associative array with information
+        * about a specific file in the archive.
+        *
+        * @param       mixed   $fileindex      index or name of the requested file
+        * @return      array   $fileInfo
+        */
+       public function getFileInfo($fileIndex) {
+               if (!is_int($fileIndex)) {
+                       $fileIndex = $this->getIndexByFilename($fileIndex);
+               }
+               
+               if (!isset($this->contentList[$fileIndex])) {
+                       throw new SystemException("Tar: could find file '".$fileIndex."' in archive", 11013);
+               }
+               return $this->contentList[$fileIndex];
+       }
+       
+       /**
+        * Searchs a file in the tar archive
+        * and returns the numeric fileindex.
+        * Returns false if not found.
+        *
+        * @param       string          $filename
+        * @return      integer                         index of the requested file
+        */
+       public function getIndexByFilename($filename) {
+               foreach ($this->contentList as $index => $file) {
+                       if ($file['filename'] == $filename) {
+                               return $index;
+                       }
+               }
+               return false;
+       }
+       
+       /**
+        * Extracts a specific file and returns the content as string.
+        * Returns false if extraction failed.
+        * 
+        * @param       mixed           $index          index or name of the requested file
+        * @return      string                          content of the requested file
+        */
+       public function extractToString($index) {
+               if (!$this->read) {
+                       $this->open();
+                       $this->readContent();
+               }
+               $header = $this->getFileInfo($index);
+               
+               // can not extract a folder
+               if ($header['type'] != 'file') {
+                       return false;
+               }
+               
+               // seek to offset
+               $this->file->seek($header['offset']);
+               
+               // read data
+               $content = '';
+               $n = floor($header['size'] / 512);
+               for ($i = 0; $i < $n; $i++) {
+                       $content .= $this->file->read(512);
+               }
+               if (($header['size'] % 512) != 0) {
+                       $buffer = $this->file->read(512);
+                       $content .= substr($buffer, 0, ($header['size'] % 512));
+               }
+               
+               return $content;
+       }
+       
+       /**
+        * Extracts a specific file and writes it's content
+        * to the file specified with $destination.
+        * 
+        * @param       mixed           $index          index or name of the requested file
+        * @param       string          $destination
+        * @return      boolean         $success
+        */
+       public function extract($index, $destination) {
+               if (!$this->read) {
+                       $this->open();
+                       $this->readContent();
+               }
+               $header = $this->getFileInfo($index);
+               
+               // can not extract a folder
+               if ($header['type'] != 'file') {
+                       return false;
+               }
+               
+               // seek to offset
+               $this->file->seek($header['offset']);
+               
+               $targetFile = new File($destination);
+               
+               // read data
+               $n = floor($header['size'] / 512);
+               for ($i = 0; $i < $n; $i++) {
+                       $content = $this->file->read(512);
+                       $targetFile->write($content, 512);
+               }
+               if (($header['size'] % 512) != 0) {
+                       $content = $this->file->read(512);
+                       $targetFile->write($content, ($header['size'] % 512));
+               }
+               
+               $targetFile->close();
+               if (FileUtil::isApacheModule() || !@$targetFile->is_writable()) {
+                       @$targetFile->chmod(0777);
+               }
+               else {
+                       @$targetFile->chmod(0755);
+               }
+               
+               if ($header['mtime']) {
+                       @$targetFile->touch($header['mtime']);
+               }
+               
+               // check filesize
+               if (filesize($destination) != $header['size']) {
+                       throw new SystemException("Could not untar file '".$header['filename']."' to '".$destination."'. Maybe disk quota exceeded in folder '".dirname($destination)."'.", 11015);
+               }
+               
+               return true;
+       }       
+       
+       /**
+        * Reads table of contents (TOC) from tar archive.
+        * This does not get the entire to memory but only parts of it.
+        */
+       protected function readContent() {
+               $this->contentList = array();
+               $this->read = true;
+               $i = 0;
+               
+               // Read the 512 bytes header
+               while (strlen($binaryData = $this->file->read(512)) != 0) {
+                       // read header
+                       $header = $this->readHeader($binaryData);
+                       if ($header === false) {
+                               continue;       
+                       }
+                       $this->contentList[$i] = $header;
+                       $this->contentList[$i]['index'] = $i;
+                       $i++;
+                       
+                       $this->file->seek($this->file->tell() + (512 * ceil(($header['size'] / 512))));
+               }
+       }
+       
+       /**
+        * Unpacks file header for one file entry.
+        *
+        * @param       string          $binaryData
+        * @return      array           $fileheader
+        */
+       protected function readHeader($binaryData) {
+               if (strlen($binaryData) != 512) {
+                       return false;   
+               }
+
+               $header = array();
+               $checksum = 0;
+               // First part of the header
+               for ($i = 0; $i < 148; $i++) {
+                       $checksum += ord(substr($binaryData, $i, 1));
+               }
+               // Calculate the checksum
+               // Ignore the checksum value and replace it by ' ' (space)
+               for ($i = 148; $i < 156; $i++) {
+                       $checksum += ord(' ');
+               }
+               // Last part of the header
+               for ($i = 156; $i < 512; $i++) {
+                       $checksum += ord(substr($binaryData, $i, 1));
+               }
+
+               // Extract the values
+               //$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $binaryData);
+               $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $binaryData);
+               
+               // Extract the properties
+               $header['checksum'] = octDec(trim($data['checksum']));
+               if ($header['checksum'] == $checksum) {
+                       $header['filename'] = trim($data['filename']);
+                       $header['mode'] = octDec(trim($data['mode']));
+                       $header['uid'] = octDec(trim($data['uid']));
+                       $header['gid'] = octDec(trim($data['gid']));
+                       $header['size'] = octDec(trim($data['size']));
+                       $header['mtime'] = octDec(trim($data['mtime']));
+                       $header['prefix'] = trim($data['prefix']);
+                       if ($header['prefix']) {
+                               $header['filename'] = $header['prefix'].'/'.$header['filename'];
+                       }
+                       if (($header['typeflag'] = $data['typeflag']) == '5') {
+                               $header['size'] = 0;
+                               $header['type'] = 'folder';
+                       }
+                       else {
+                               $header['type'] = 'file';
+                       }
+                       $header['offset'] = $this->file->tell();
+                       
+                       return $header;
+               }
+               else {
+                       return false;
+               }
+       }
+       
+       /**
+        * Returns true, if this tar is (g)zipped.
+        * 
+        * @return      boolean
+        */
+       public function isZipped() {
+               return $this->isZipped;
+       }
 }
index 5aaf57b59cdc39c6a43f5b2b44e66581989188f6..df6ac2e4c16fb85f35cd81493d75b4de11a5cc91 100644 (file)
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\FileUtil;\r
-\r
-/**\r
- * Creates a tar file archive.\r
- * \r
- * Usage:\r
- * ------\r
- * $tar = new TarWriter('archive.tar', true);\r
- * $tar->add(array('file1', 'file2'));\r
- * $tar->create();\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category   Community Framework\r
- */\r
-class TarWriter extends Tar {\r
-       protected $mode = 'wb+';\r
-       \r
-       /**\r
-        * Creates a new TarWriter object.\r
-        * \r
-        * @param       string          $archiveName\r
-        * @param       boolean         $compress       enables gzip compression\r
-        */\r
-       public function __construct($archiveName, $compress = false) {\r
-               $this->archiveName = $archiveName;\r
-               $this->isZipped = $compress;\r
-               if ($compress) $this->mode = 'wb9'; // set compression level\r
-               $this->open();\r
-       }\r
-       \r
-       /**\r
-        * Writes the last 0 filled block for end of archive.\r
-        */\r
-       protected function writeFooter() {\r
-               $this->file->write(pack('a512', ''));\r
-       }\r
-       \r
-       /**\r
-        * Creates the tar archive.\r
-        */\r
-       public function create() {\r
-               $this->writeFooter();\r
-               $this->close();\r
-       }\r
-       \r
-       /**\r
-        * Adds a string to the tar archive.\r
-        * \r
-        * @param       string          $filename\r
-        * @param       string          $string         file content\r
-        * @return      boolean         result\r
-        */\r
-       public function addString($filename, $string) {\r
-               if (empty($filename)) return false;\r
-               \r
-               $filename = FileUtil::unifyDirSeperator($filename);\r
-\r
-               if (!$this->writeHeaderBlock($filename, strlen($string), TIME_NOW, 33279)) {\r
-                       return false;\r
-               }\r
-\r
-               $i = 0;\r
-               while (($buffer = substr($string, (($i++) * 512), 512)) != '') {\r
-                       $this->file->write(pack("a512", $buffer));\r
-               }\r
-\r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Adds a list of files or directories to the tar archive.\r
-        * \r
-        * @param       mixed           $files\r
-        * @param       string          $addDir\r
-        * @param       string          $removeDir\r
-        * @return      boolean         result\r
-        */\r
-       public function add($files, $addDir = '', $removeDir = '') {\r
-               if (!is_array($files)) $files = array($files);\r
-               if (!count($files)) return false;\r
-               \r
-               $result = true;\r
-               \r
-               // unify dir seperator\r
-               $addDir = FileUtil::unifyDirSeperator($addDir);\r
-               $removeDir = FileUtil::unifyDirSeperator($removeDir);\r
-\r
-               foreach ($files as $filename) {\r
-                       if (!$result) {\r
-                               break;\r
-                       }\r
-\r
-                       if (!$filename || $filename == $this->archiveName) {\r
-                               continue;\r
-                       }\r
-\r
-                       if (!file_exists($filename)) {\r
-                               throw new SystemException("Unable to find file '".$filename."'", 11002);\r
-                       }\r
-\r
-                       // add file\r
-                       if (!$this->addFile($filename, $addDir, $removeDir)) {\r
-                               return false;\r
-                       }\r
-\r
-                       // handle directories\r
-                       if (@is_dir($filename)) {\r
-                               $handle = opendir($filename);\r
-\r
-                               while (($dirFile = readdir($handle)) !== false) {\r
-                                       if (($dirFile != '.') && ($dirFile != '..')) {\r
-                                               if ($filename != ".") $dirFile = $filename.'/'.$dirFile;\r
-                                               $result = $this->add($dirFile, $addDir, $removeDir);\r
-                                       }\r
-                               }\r
-                               \r
-                               closedir($handle);\r
-                       }\r
-               }\r
-\r
-               return $result;\r
-       }\r
-\r
-       /**\r
-        * Adds a file to the tar archive.\r
-        * \r
-        * @param       string          $filename\r
-        * @param       string          $addDir\r
-        * @param       string          $removeDir\r
-        * @return      boolean         result\r
-        */\r
-       protected function addFile($filename, $addDir, $removeDir) {\r
-               $filename = FileUtil::unifyDirSeperator($filename);\r
-               $storedFilename = $filename;\r
-               if (!empty($removeDir)) $storedFilename = StringUtil::replaceIgnoreCase($removeDir, '', $filename);\r
-               if (!empty($addDir)) $storedFilename = $addDir . $storedFilename;\r
-               if (is_file($filename)) {\r
-                       // open file\r
-                       $file = new File($filename, 'rb');\r
-                       \r
-                       // write header\r
-                       if (!$this->writeFileHeader($filename, $storedFilename)) {\r
-                               return false;\r
-                       }\r
-                       \r
-                       // write file content\r
-                       while (($buffer = $file->read(512)) != '') {\r
-                               $this->file->write(pack('a512', $buffer));\r
-                       }\r
-                       \r
-                       // close file\r
-                       $file->close();\r
-               }\r
-               else {\r
-                       // only directory header\r
-                       if (!$this->writeFileHeader($filename, $storedFilename)) {\r
-                               return false;\r
-                       }\r
-               }\r
-               \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Writes the file header.\r
-        * \r
-        * @param       string          $filename\r
-        * @param       string          $storedFilename\r
-        * @return      boolean         result\r
-        */\r
-       protected function writeFileHeader($filename, $storedFilename) {\r
-               $fileInfo = stat($filename);\r
-               $permissions = fileperms($filename);\r
-               $mtime = filemtime($filename);\r
-               if (@is_dir($filename)) {\r
-                       $typeFlag = '5';\r
-                       $size = 0;\r
-               }\r
-               else {\r
-                       $typeFlag = '';\r
-                       clearstatcache();\r
-                       $size = filesize($filename);\r
-               }\r
-               \r
-               return $this->writeHeaderBlock($storedFilename, $size, $mtime, $permissions, $typeFlag, $fileInfo[4], $fileInfo[5]);\r
-       }\r
-       \r
-       /**\r
-        * Writes header block.\r
-        * \r
-        * @param       string          $filename\r
-        * @param       integer         $size\r
-        * @param       integer         $mtime\r
-        * @param       integer         $permissions\r
-        * @param       string          $typeFlag\r
-        * @param       integer         $uid\r
-        * @param       integer         $gid\r
-        * @return      boolean         result\r
-        */\r
-       public function writeHeaderBlock($filename, $size, $mtime = 0, $permissions = 0, $typeFlag = '', $uid = 0, $gid = 0) {\r
-               if (strlen($filename) > 99) {\r
-                       if (!$this->writeLongHeaderBlock($filename)) {\r
-                               return false;\r
-                       }\r
-               }\r
-\r
-               if ($typeFlag == "5") {\r
-                       $size = sprintf("%11s ", decOct(0));\r
-               }\r
-               else {\r
-                       $size = sprintf("%11s ", decOct($size));\r
-               }\r
-\r
-               $uid = sprintf("%6s ", decOct($uid));\r
-               $gid = sprintf("%6s ", decOct($gid));\r
-               $permissions = sprintf("%6s ", decOct($permissions));\r
-               $mtime = sprintf("%11s", decOct($mtime));\r
-\r
-               $binaryDataFirst = pack('a100a8a8a8a12A12', $filename, $permissions, $uid, $gid, $size, $mtime);\r
-               $binaryDataLast = pack('a1a100a6a2a32a32a8a8a155a12', $typeFlag, '', '', '', '', '', '', '', '', '');\r
-\r
-               // calculate the checksum\r
-               $checksum = 0;\r
-               for ($i = 0; $i < 148; $i++) $checksum += ord(substr($binaryDataFirst, $i, 1));\r
-               for ($i = 148; $i < 156; $i++) $checksum += ord(' ');\r
-               for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($binaryDataLast, $j, 1));\r
-               \r
-               $this->file->write($binaryDataFirst, 148);\r
-               $this->file->write(pack("a8", sprintf("%6s ", decOct($checksum))), 8); // write the checksum\r
-               $this->file->write($binaryDataLast, 356);\r
-       \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Writes a long header block.\r
-        * \r
-        * @param       string          $filename\r
-        * @return      boolean\r
-        */\r
-       protected function writeLongHeaderBlock($filename) {\r
-               $size = sprintf("%11s ", decOct(strlen($filename)));\r
-               $typeFlag = 'L';\r
-               $binaryDataFirst = pack("a100a8a8a8a12A12", '././@LongLink', 0, 0, 0, $size, 0);\r
-               $binaryDataLast = pack("a1a100a6a2a32a32a8a8a155a12", $typeFlag, '', '', '', '', '', '', '', '', '');\r
-\r
-               // calculate the checksum\r
-               $checksum = 0;\r
-               for ($i = 0; $i < 148; $i++) $checksum += ord(substr($binaryDataFirst, $i, 1));\r
-               for ($i = 148; $i < 156; $i++) $checksum += ord(' ');\r
-               for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($binaryDataLast, $j, 1));\r
-\r
-               $this->file->write($binaryDataFirst, 148);\r
-               $this->file->write(pack("a8", sprintf("%6s ", decOct($checksum))), 8); // write the checksum\r
-               $this->file->write($binaryDataLast, 356);\r
-\r
-               $i = 0;\r
-               while (($buffer = substr($filename, (($i++) * 512), 512)) != '') {\r
-                       $this->file->write(pack("a512", $buffer));\r
-               }\r
-\r
-               return true;\r
-       }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+use wcf\util\FileUtil;
+
+/**
+ * Creates a tar file archive.
+ * 
+ * Usage:
+ * ------
+ * $tar = new TarWriter('archive.tar', true);
+ * $tar->add(array('file1', 'file2'));
+ * $tar->create();
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.io
+ * @category   Community Framework
+ */
+class TarWriter extends Tar {
+       protected $mode = 'wb+';
+       
+       /**
+        * Creates a new TarWriter object.
+        * 
+        * @param       string          $archiveName
+        * @param       boolean         $compress       enables gzip compression
+        */
+       public function __construct($archiveName, $compress = false) {
+               $this->archiveName = $archiveName;
+               $this->isZipped = $compress;
+               if ($compress) $this->mode = 'wb9'; // set compression level
+               $this->open();
+       }
+       
+       /**
+        * Writes the last 0 filled block for end of archive.
+        */
+       protected function writeFooter() {
+               $this->file->write(pack('a512', ''));
+       }
+       
+       /**
+        * Creates the tar archive.
+        */
+       public function create() {
+               $this->writeFooter();
+               $this->close();
+       }
+       
+       /**
+        * Adds a string to the tar archive.
+        * 
+        * @param       string          $filename
+        * @param       string          $string         file content
+        * @return      boolean         result
+        */
+       public function addString($filename, $string) {
+               if (empty($filename)) return false;
+               
+               $filename = FileUtil::unifyDirSeperator($filename);
+
+               if (!$this->writeHeaderBlock($filename, strlen($string), TIME_NOW, 33279)) {
+                       return false;
+               }
+
+               $i = 0;
+               while (($buffer = substr($string, (($i++) * 512), 512)) != '') {
+                       $this->file->write(pack("a512", $buffer));
+               }
+
+               return true;
+       }
+       
+       /**
+        * Adds a list of files or directories to the tar archive.
+        * 
+        * @param       mixed           $files
+        * @param       string          $addDir
+        * @param       string          $removeDir
+        * @return      boolean         result
+        */
+       public function add($files, $addDir = '', $removeDir = '') {
+               if (!is_array($files)) $files = array($files);
+               if (!count($files)) return false;
+               
+               $result = true;
+               
+               // unify dir seperator
+               $addDir = FileUtil::unifyDirSeperator($addDir);
+               $removeDir = FileUtil::unifyDirSeperator($removeDir);
+
+               foreach ($files as $filename) {
+                       if (!$result) {
+                               break;
+                       }
+
+                       if (!$filename || $filename == $this->archiveName) {
+                               continue;
+                       }
+
+                       if (!file_exists($filename)) {
+                               throw new SystemException("Unable to find file '".$filename."'", 11002);
+                       }
+
+                       // add file
+                       if (!$this->addFile($filename, $addDir, $removeDir)) {
+                               return false;
+                       }
+
+                       // handle directories
+                       if (@is_dir($filename)) {
+                               $handle = opendir($filename);
+
+                               while (($dirFile = readdir($handle)) !== false) {
+                                       if (($dirFile != '.') && ($dirFile != '..')) {
+                                               if ($filename != ".") $dirFile = $filename.'/'.$dirFile;
+                                               $result = $this->add($dirFile, $addDir, $removeDir);
+                                       }
+                               }
+                               
+                               closedir($handle);
+                       }
+               }
+
+               return $result;
+       }
+
+       /**
+        * Adds a file to the tar archive.
+        * 
+        * @param       string          $filename
+        * @param       string          $addDir
+        * @param       string          $removeDir
+        * @return      boolean         result
+        */
+       protected function addFile($filename, $addDir, $removeDir) {
+               $filename = FileUtil::unifyDirSeperator($filename);
+               $storedFilename = $filename;
+               if (!empty($removeDir)) $storedFilename = StringUtil::replaceIgnoreCase($removeDir, '', $filename);
+               if (!empty($addDir)) $storedFilename = $addDir . $storedFilename;
+               if (is_file($filename)) {
+                       // open file
+                       $file = new File($filename, 'rb');
+                       
+                       // write header
+                       if (!$this->writeFileHeader($filename, $storedFilename)) {
+                               return false;
+                       }
+                       
+                       // write file content
+                       while (($buffer = $file->read(512)) != '') {
+                               $this->file->write(pack('a512', $buffer));
+                       }
+                       
+                       // close file
+                       $file->close();
+               }
+               else {
+                       // only directory header
+                       if (!$this->writeFileHeader($filename, $storedFilename)) {
+                               return false;
+                       }
+               }
+               
+               return true;
+       }
+       
+       /**
+        * Writes the file header.
+        * 
+        * @param       string          $filename
+        * @param       string          $storedFilename
+        * @return      boolean         result
+        */
+       protected function writeFileHeader($filename, $storedFilename) {
+               $fileInfo = stat($filename);
+               $permissions = fileperms($filename);
+               $mtime = filemtime($filename);
+               if (@is_dir($filename)) {
+                       $typeFlag = '5';
+                       $size = 0;
+               }
+               else {
+                       $typeFlag = '';
+                       clearstatcache();
+                       $size = filesize($filename);
+               }
+               
+               return $this->writeHeaderBlock($storedFilename, $size, $mtime, $permissions, $typeFlag, $fileInfo[4], $fileInfo[5]);
+       }
+       
+       /**
+        * Writes header block.
+        * 
+        * @param       string          $filename
+        * @param       integer         $size
+        * @param       integer         $mtime
+        * @param       integer         $permissions
+        * @param       string          $typeFlag
+        * @param       integer         $uid
+        * @param       integer         $gid
+        * @return      boolean         result
+        */
+       public function writeHeaderBlock($filename, $size, $mtime = 0, $permissions = 0, $typeFlag = '', $uid = 0, $gid = 0) {
+               if (strlen($filename) > 99) {
+                       if (!$this->writeLongHeaderBlock($filename)) {
+                               return false;
+                       }
+               }
+
+               if ($typeFlag == "5") {
+                       $size = sprintf("%11s ", decOct(0));
+               }
+               else {
+                       $size = sprintf("%11s ", decOct($size));
+               }
+
+               $uid = sprintf("%6s ", decOct($uid));
+               $gid = sprintf("%6s ", decOct($gid));
+               $permissions = sprintf("%6s ", decOct($permissions));
+               $mtime = sprintf("%11s", decOct($mtime));
+
+               $binaryDataFirst = pack('a100a8a8a8a12A12', $filename, $permissions, $uid, $gid, $size, $mtime);
+               $binaryDataLast = pack('a1a100a6a2a32a32a8a8a155a12', $typeFlag, '', '', '', '', '', '', '', '', '');
+
+               // calculate the checksum
+               $checksum = 0;
+               for ($i = 0; $i < 148; $i++) $checksum += ord(substr($binaryDataFirst, $i, 1));
+               for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
+               for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($binaryDataLast, $j, 1));
+               
+               $this->file->write($binaryDataFirst, 148);
+               $this->file->write(pack("a8", sprintf("%6s ", decOct($checksum))), 8); // write the checksum
+               $this->file->write($binaryDataLast, 356);
+       
+               return true;
+       }
+       
+       /**
+        * Writes a long header block.
+        * 
+        * @param       string          $filename
+        * @return      boolean
+        */
+       protected function writeLongHeaderBlock($filename) {
+               $size = sprintf("%11s ", decOct(strlen($filename)));
+               $typeFlag = 'L';
+               $binaryDataFirst = pack("a100a8a8a8a12A12", '././@LongLink', 0, 0, 0, $size, 0);
+               $binaryDataLast = pack("a1a100a6a2a32a32a8a8a155a12", $typeFlag, '', '', '', '', '', '', '', '', '');
+
+               // calculate the checksum
+               $checksum = 0;
+               for ($i = 0; $i < 148; $i++) $checksum += ord(substr($binaryDataFirst, $i, 1));
+               for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
+               for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($binaryDataLast, $j, 1));
+
+               $this->file->write($binaryDataFirst, 148);
+               $this->file->write(pack("a8", sprintf("%6s ", decOct($checksum))), 8); // write the checksum
+               $this->file->write($binaryDataLast, 356);
+
+               $i = 0;
+               while (($buffer = substr($filename, (($i++) * 512), 512)) != '') {
+                       $this->file->write(pack("a512", $buffer));
+               }
+
+               return true;
+       }
 }
index fc8dfc827144287b42b027f4995bcc73b97b18b3..79a06865b7f24147b2cb345c2abb7fc30b052219 100644 (file)
-<?php\r
-namespace wcf\system\io;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Creates a Zip file archive.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category   Community Framework\r
- */\r
-class ZipWriter {\r
-       protected $headers = array();\r
-       protected $data = array();\r
-       protected $endOfData = "\x50\x4b\x05\x06\x00\x00\x00\x00";\r
-       protected $lastOffset = 0;\r
-\r
-       /**\r
-        * Adds a folder to the Zip archive.\r
-        * \r
-        * @param       string          $name           dirname\r
-        */\r
-       public function addDir($name) {\r
-               // replace backward slashes with forward slashes in the dirname\r
-               $name = StringUtil::replace("\\", "/", $name);\r
-\r
-               // construct the general header information for the directory\r
-               $header = "\x50\x4b\x03\x04";\r
-               $header .= "\x0a\x00\x00\x00";\r
-               $header .= "\x00\x00\x00\x00";\r
-               $header .= "\x00\x00";\r
-\r
-               // construct the directory header specific information\r
-               $header .= pack("V", 0);\r
-               $header .= pack("V", 0);\r
-               $header .= pack("V", 0);\r
-               $header .= pack("v", strlen($name));\r
-               $header .= pack("v", 0);\r
-               $header .= $name;\r
-               $header .= pack("V", 0);\r
-               $header .= pack("V", 0);\r
-               $header .= pack("V", 0);\r
-\r
-               // store the complete header information into the $headers array\r
-               $this->headers[] = $header;\r
-\r
-               // calculate the new offset that will be used the next time a segment is added\r
-               $newOffset = strlen(implode('', $this->headers));\r
-\r
-               // construct the general header for the central index record\r
-               $record = "\x50\x4b\x01\x02";\r
-               $record .= "\x00\x00\x0a\x00";\r
-               $record .= "\x00\x00\x00\x00";\r
-               $record .= "\x00\x00\x00\x00";\r
-               $record .= pack("V", 0);\r
-               $record .= pack("V", 0);\r
-               $record .= pack("V", 0);\r
-               $record .= pack("v", strlen($name));\r
-               $record .= pack("v", 0);\r
-               $record .= pack("v", 0);\r
-               $record .= pack("v", 0);\r
-               $record .= pack("v", 0);\r
-               //$ext = "\x00\x00\x10\x00";\r
-               //$ext = "\xff\xff\xff\xff";\r
-               $record .= pack("V", 16 );\r
-               $record .= pack("V", $this->lastOffset);\r
-               $record .= $name;\r
-\r
-               // save the central index record in the array $data\r
-               $this->data[] = $record;\r
-               $this->lastOffset = $newOffset;\r
-       }\r
-\r
-       /**\r
-        * Adds a file to the Zip archive.\r
-        * \r
-        * @param       string          $data           content of the file\r
-        * @param       string          $name           filename\r
-        * @param       integer         $date           file creation time as unix timestamp\r
-        */\r
-       public function addFile($data, $name, $date = 0) {\r
-               // replace backward slashes with forward slashes in the filename\r
-               $name = StringUtil::replace("\\", "/", $name);\r
-               \r
-               // calculate the size of the file being uncompressed\r
-               $sizeUncompressed = strlen($data);\r
-               \r
-               // get data checksum\r
-               $crc = crc32($data);\r
-               \r
-               // compress the file data\r
-               $compressedData = gzcompress($data);\r
-               \r
-               // calculate the size of the file being compressed\r
-               $compressedData = substr($compressedData, 2, - 4);\r
-               $sizeCompressed = strlen($compressedData);\r
-\r
-               // construct the general header for the file record complete with checksum information, etc.\r
-               $header = "\x50\x4b\x03\x04";\r
-               $header .= "\x14\x00\x00\x00";\r
-               $header .= "\x08\x00\x00\x00";\r
-               $header .= "\x00\x00";\r
-               $header .= pack("V", $crc);\r
-               $header .= pack("V", $sizeCompressed);\r
-               $header .= pack("V", $sizeUncompressed);\r
-               $header .= pack("v", strlen($name));\r
-               $header .= pack("v", 0);\r
-               $header .= $name;\r
-               \r
-               // store the compressed data immediately following the file header\r
-               $header .= $compressedData;\r
-               \r
-               // complete the file record by adding an additional footer directly following the file data\r
-               //$header .= pack("V", $crc);\r
-               //$header .= pack("V", $sizeCompressed);\r
-               //$header .= pack("V", $sizeUncompressed);\r
-\r
-               // store the completed file record in the $headers array\r
-               $this->headers[] = $header;\r
-\r
-               // calculate the new offset for the central index record\r
-               $newOffset = strlen(implode('', $this->headers));\r
-               \r
-               // construct the record\r
-               $record = "\x50\x4b\x01\x02";\r
-               $record .= "\x00\x00\x14\x00";\r
-               $record .= "\x00\x00\x08\x00";\r
-               $record .= $this->getDosDatetime($date);\r
-               $record .= pack("V", $crc);\r
-               $record .= pack("V", $sizeCompressed);\r
-               $record .= pack("V", $sizeUncompressed);\r
-               $record .= pack("v", strlen($name));\r
-               $record .= pack("v", 0);\r
-               $record .= pack("v", 0);\r
-               $record .= pack("v", 0);\r
-               $record .= pack("v", 0);\r
-               $record .= pack("V", 32);\r
-               $record .= pack("V", $this->lastOffset);\r
-\r
-               // update the offset for the next record to be stored\r
-               $this->lastOffset = $newOffset;\r
-\r
-               $record .= $name;\r
-\r
-               // store the record in the $data array\r
-               $this->data[] = $record;\r
-       }\r
-\r
-       /**\r
-        * Constructs the final Zip file structure and return it.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getFile() {\r
-               // implode the $headers array into a single string\r
-               $headers = implode('', $this->headers);\r
-               \r
-               // implode the $data array into a single string\r
-               $data = implode('', $this->data);\r
-\r
-               // construct the final Zip file structure and return it\r
-               return\r
-                       $headers.\r
-                       $data.\r
-                       $this->endOfData.\r
-                       pack("v", sizeof($this->data)).\r
-                       pack("v", sizeof($this->data)).\r
-                       pack("V", strlen($data)).\r
-                       pack("V", strlen($headers)).\r
-                       "\x00\x00";\r
-       }\r
-       \r
-       /**\r
-        * Converts an unix timestamp to Zip file time.\r
-        * \r
-        * @param       integer         $date           unix timestamp\r
-        * @return      string\r
-        */\r
-       protected static function getDosDatetime($date = 0) {\r
-               $day = gmdate('d', $date);\r
-               $month = gmdate('m', $date);\r
-               $year = gmdate('Y', $date);\r
-               $year -= 1980;\r
-               $hour = gmdate('H', $date);\r
-               $minute = gmdate('i', $date);\r
-               $second = gmdate('s', $date);\r
-               \r
-               // calculate time\r
-               $time = $hour;\r
-               $time = ($time << 6) + $minute;\r
-               $time = ($time << 5) + number_format($second / 2, 0);\r
-               $timeRight = $time >> 8;\r
-               $timeLeft = $time - ($timeRight << 8);\r
-               \r
-               // calculate date\r
-               $date = $year;\r
-               $date = ($date << 4) + $month;\r
-               $date = ($date << 5) + $day;\r
-               $dateRight = $date >> 8;\r
-               $dateLeft = $date - ($dateRight << 8);\r
-               \r
-               $timeLeft = sprintf("%02x", $timeLeft);\r
-               $timeRight = sprintf("%02x", $timeRight);\r
-               $dateLeft = sprintf("%02x", $dateLeft);\r
-               $dateRight = sprintf("%02x", $dateRight);\r
-               \r
-               return pack("H*H*H*H*", $timeLeft, $timeRight, $dateLeft, $dateRight);\r
-       }\r
+<?php
+namespace wcf\system\io;
+use wcf\util\StringUtil;
+
+/**
+ * Creates a Zip file archive.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.io
+ * @category   Community Framework
+ */
+class ZipWriter {
+       protected $headers = array();
+       protected $data = array();
+       protected $endOfData = "\x50\x4b\x05\x06\x00\x00\x00\x00";
+       protected $lastOffset = 0;
+
+       /**
+        * Adds a folder to the Zip archive.
+        * 
+        * @param       string          $name           dirname
+        */
+       public function addDir($name) {
+               // replace backward slashes with forward slashes in the dirname
+               $name = StringUtil::replace("\\", "/", $name);
+
+               // construct the general header information for the directory
+               $header = "\x50\x4b\x03\x04";
+               $header .= "\x0a\x00\x00\x00";
+               $header .= "\x00\x00\x00\x00";
+               $header .= "\x00\x00";
+
+               // construct the directory header specific information
+               $header .= pack("V", 0);
+               $header .= pack("V", 0);
+               $header .= pack("V", 0);
+               $header .= pack("v", strlen($name));
+               $header .= pack("v", 0);
+               $header .= $name;
+               $header .= pack("V", 0);
+               $header .= pack("V", 0);
+               $header .= pack("V", 0);
+
+               // store the complete header information into the $headers array
+               $this->headers[] = $header;
+
+               // calculate the new offset that will be used the next time a segment is added
+               $newOffset = strlen(implode('', $this->headers));
+
+               // construct the general header for the central index record
+               $record = "\x50\x4b\x01\x02";
+               $record .= "\x00\x00\x0a\x00";
+               $record .= "\x00\x00\x00\x00";
+               $record .= "\x00\x00\x00\x00";
+               $record .= pack("V", 0);
+               $record .= pack("V", 0);
+               $record .= pack("V", 0);
+               $record .= pack("v", strlen($name));
+               $record .= pack("v", 0);
+               $record .= pack("v", 0);
+               $record .= pack("v", 0);
+               $record .= pack("v", 0);
+               //$ext = "\x00\x00\x10\x00";
+               //$ext = "\xff\xff\xff\xff";
+               $record .= pack("V", 16 );
+               $record .= pack("V", $this->lastOffset);
+               $record .= $name;
+
+               // save the central index record in the array $data
+               $this->data[] = $record;
+               $this->lastOffset = $newOffset;
+       }
+
+       /**
+        * Adds a file to the Zip archive.
+        * 
+        * @param       string          $data           content of the file
+        * @param       string          $name           filename
+        * @param       integer         $date           file creation time as unix timestamp
+        */
+       public function addFile($data, $name, $date = 0) {
+               // replace backward slashes with forward slashes in the filename
+               $name = StringUtil::replace("\\", "/", $name);
+               
+               // calculate the size of the file being uncompressed
+               $sizeUncompressed = strlen($data);
+               
+               // get data checksum
+               $crc = crc32($data);
+               
+               // compress the file data
+               $compressedData = gzcompress($data);
+               
+               // calculate the size of the file being compressed
+               $compressedData = substr($compressedData, 2, - 4);
+               $sizeCompressed = strlen($compressedData);
+
+               // construct the general header for the file record complete with checksum information, etc.
+               $header = "\x50\x4b\x03\x04";
+               $header .= "\x14\x00\x00\x00";
+               $header .= "\x08\x00\x00\x00";
+               $header .= "\x00\x00";
+               $header .= pack("V", $crc);
+               $header .= pack("V", $sizeCompressed);
+               $header .= pack("V", $sizeUncompressed);
+               $header .= pack("v", strlen($name));
+               $header .= pack("v", 0);
+               $header .= $name;
+               
+               // store the compressed data immediately following the file header
+               $header .= $compressedData;
+               
+               // complete the file record by adding an additional footer directly following the file data
+               //$header .= pack("V", $crc);
+               //$header .= pack("V", $sizeCompressed);
+               //$header .= pack("V", $sizeUncompressed);
+
+               // store the completed file record in the $headers array
+               $this->headers[] = $header;
+
+               // calculate the new offset for the central index record
+               $newOffset = strlen(implode('', $this->headers));
+               
+               // construct the record
+               $record = "\x50\x4b\x01\x02";
+               $record .= "\x00\x00\x14\x00";
+               $record .= "\x00\x00\x08\x00";
+               $record .= $this->getDosDatetime($date);
+               $record .= pack("V", $crc);
+               $record .= pack("V", $sizeCompressed);
+               $record .= pack("V", $sizeUncompressed);
+               $record .= pack("v", strlen($name));
+               $record .= pack("v", 0);
+               $record .= pack("v", 0);
+               $record .= pack("v", 0);
+               $record .= pack("v", 0);
+               $record .= pack("V", 32);
+               $record .= pack("V", $this->lastOffset);
+
+               // update the offset for the next record to be stored
+               $this->lastOffset = $newOffset;
+
+               $record .= $name;
+
+               // store the record in the $data array
+               $this->data[] = $record;
+       }
+
+       /**
+        * Constructs the final Zip file structure and return it.
+        * 
+        * @return      string
+        */
+       public function getFile() {
+               // implode the $headers array into a single string
+               $headers = implode('', $this->headers);
+               
+               // implode the $data array into a single string
+               $data = implode('', $this->data);
+
+               // construct the final Zip file structure and return it
+               return
+                       $headers.
+                       $data.
+                       $this->endOfData.
+                       pack("v", sizeof($this->data)).
+                       pack("v", sizeof($this->data)).
+                       pack("V", strlen($data)).
+                       pack("V", strlen($headers)).
+                       "\x00\x00";
+       }
+       
+       /**
+        * Converts an unix timestamp to Zip file time.
+        * 
+        * @param       integer         $date           unix timestamp
+        * @return      string
+        */
+       protected static function getDosDatetime($date = 0) {
+               $day = gmdate('d', $date);
+               $month = gmdate('m', $date);
+               $year = gmdate('Y', $date);
+               $year -= 1980;
+               $hour = gmdate('H', $date);
+               $minute = gmdate('i', $date);
+               $second = gmdate('s', $date);
+               
+               // calculate time
+               $time = $hour;
+               $time = ($time << 6) + $minute;
+               $time = ($time << 5) + number_format($second / 2, 0);
+               $timeRight = $time >> 8;
+               $timeLeft = $time - ($timeRight << 8);
+               
+               // calculate date
+               $date = $year;
+               $date = ($date << 4) + $month;
+               $date = ($date << 5) + $day;
+               $dateRight = $date >> 8;
+               $dateLeft = $date - ($dateRight << 8);
+               
+               $timeLeft = sprintf("%02x", $timeLeft);
+               $timeRight = sprintf("%02x", $timeRight);
+               $dateLeft = sprintf("%02x", $dateLeft);
+               $dateRight = sprintf("%02x", $dateRight);
+               
+               return pack("H*H*H*H*", $timeLeft, $timeRight, $dateLeft, $dateRight);
+       }
 }
index e31cbf7b236e1ef4301993fc2f81d785221603b4..617e7065fa7335e47d244f715f2fb17408391a94 100644 (file)
@@ -1,46 +1,46 @@
-<?php\r
-namespace wcf\system\mail;\r
-use wcf\sytem\io\File;\r
-\r
-/**\r
- * DebugMailSender is a debug implementation of mailsender.\r
- * It writes e-mails in a log file.\r
- * \r
- * @author     Michael Schaefer\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category   Community Framework\r
- */\r
-class DebugMailSender extends MailSender {\r
-       protected $log = null;\r
-       \r
-       /**\r
-        * Writes the given e-mail in a log file.\r
-        * \r
-        * @param       Mail    $mail\r
-        */\r
-       public function sendMail(Mail $mail) {\r
-               if ($this->log === null) {\r
-                       $this->log = new File(MAIL_DEBUG_LOGFILE_PATH.'mail.log', 'ab');\r
-               }\r
-               \r
-               $this->log->write($this->printMail($mail));\r
-       }\r
-       \r
-       /**\r
-        * Prints the given mail.\r
-        * \r
-        * @param       Mail    $mail\r
-        * @return      string\r
-        */\r
-       protected static function printMail(Mail $mail) {\r
-               return  "Date: ".gmdate('r')."\n".\r
-                       "To: ".$mail->getToString()."\n".\r
-                       "Subject: ".$mail->getSubject()."\n".\r
-                       $mail->getHeader()."\n".\r
-                       "Attachments: ".print_r($mail->getAttachments(), true)."\n\n".\r
-                       $mail->getMessage()."\n\n";\r
-       }\r
+<?php
+namespace wcf\system\mail;
+use wcf\sytem\io\File;
+
+/**
+ * DebugMailSender is a debug implementation of mailsender.
+ * It writes e-mails in a log file.
+ * 
+ * @author     Michael Schaefer
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.mail
+ * @category   Community Framework
+ */
+class DebugMailSender extends MailSender {
+       protected $log = null;
+       
+       /**
+        * Writes the given e-mail in a log file.
+        * 
+        * @param       Mail    $mail
+        */
+       public function sendMail(Mail $mail) {
+               if ($this->log === null) {
+                       $this->log = new File(MAIL_DEBUG_LOGFILE_PATH.'mail.log', 'ab');
+               }
+               
+               $this->log->write($this->printMail($mail));
+       }
+       
+       /**
+        * Prints the given mail.
+        * 
+        * @param       Mail    $mail
+        * @return      string
+        */
+       protected static function printMail(Mail $mail) {
+               return  "Date: ".gmdate('r')."\n".
+                       "To: ".$mail->getToString()."\n".
+                       "Subject: ".$mail->getSubject()."\n".
+                       $mail->getHeader()."\n".
+                       "Attachments: ".print_r($mail->getAttachments(), true)."\n\n".
+                       $mail->getMessage()."\n\n";
+       }
 }
index 236af0bd56d41a67fa713c83ada4116b003b2703..27eeb18a74eb63104a645b011e958bf4e0a55d14 100644 (file)
-<?php\r
-namespace wcf\system\mail;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * This class represents an e-mail.\r
- * \r
- * @author     Michael Schaefer\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category   Community Framework\r
- */\r
-class Mail {\r
-       protected $header = '';\r
-       protected $boundary;\r
-       protected $contentType = "text/plain";\r
-       protected $to;\r
-       protected $subject;\r
-       protected $message;\r
-       protected $from;\r
-       protected $cc;\r
-       protected $bcc;\r
-       protected $attachments = array();\r
-       protected $priority;\r
-       protected $body;\r
-       \r
-       public static $crlf = "\n";\r
-\r
-       /**\r
-        * Creates a new Mail object.\r
-        * \r
-        * @param       string          $to\r
-        * @param       string          $subject\r
-        * @param       string          $message\r
-        * @param       string          $from\r
-        * @param       string          $cc\r
-        * @param       string          $bcc\r
-        * @param       array           $attachments\r
-        * @param       integer         $priority\r
-        * @param       string          $header\r
-        */\r
-       public function __construct($to = '', $subject = '', $message = '', $from = '', $cc = '', $bcc = '', $attachments = array(), $priority = '', $header = '') {\r
-               $this->setBoundary();\r
-               \r
-               if (empty($from))       $from           = array(MAIL_FROM_NAME => MAIL_FROM_ADDRESS);\r
-               if (empty($priority))   $priority       = 3;\r
-                       \r
-               $this->setFrom($from);\r
-               $this->setSubject($subject);\r
-               $this->setMessage($message);\r
-               $this->setPriority($priority);\r
-               $this->setHeader($header);\r
-               \r
-               if (!empty($to))        $this->addTo($to);\r
-               if (!empty($cc))        $this->addCC($cc);\r
-               if (!empty($bcc))       $this->addBCC($bcc);\r
-               \r
-               if (count($attachments) > 0) $this->setAttachments($attachments);\r
-       }\r
-       \r
-       /**\r
-        * Creates a Basic Header for the Mail\r
-        * Returns this Header to the function which invoke this class\r
-        * \r
-        * @return      string          mail header\r
-        */\r
-       public function getHeader() {\r
-               if (!empty($this->header)) {\r
-                       $this->header = preg_replace('%(\r\n|\r|\n)%', self::$crlf, $this->header);\r
-               }\r
-               \r
-               $this->header .=\r
-                       'X-Priority: 3'.self::$crlf\r
-                       .'X-Mailer: WoltLab Community Framework Mail Package'.self::$crlf                                                                       \r
-                       .'MIME-Version: 1.0'.self::$crlf\r
-                       .'From: '.$this->getFrom().self::$crlf\r
-                       .($this->getCCString() != '' ? 'CC:'.$this->getCCString().self::$crlf : '')\r
-                       .($this->getBCCString() != '' ? 'BCC:'.$this->getBCCString().self::$crlf : '');                                 \r
-                       \r
-               if (count($this->getAttachments())) {\r
-                       $this->header .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;\r
-                       $this->header .= 'Content-Type: multipart/mixed;'.self::$crlf;\r
-                       $this->header .= "\tboundary=".'"'.$this->getBoundary().'";'.self::$crlf;\r
-               }\r
-               else {\r
-                       $this->header .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;\r
-                       $this->header .= 'Content-Type: '.$this->getContentType().'; charset=UTF-8'.self::$crlf;\r
-               }\r
-               \r
-               return $this->header;\r
-       }\r
-       \r
-       /**\r
-        * Creates the Recipients List (To, CC, BCC) \r
-        * Returns this List to the function which invoke this class\r
-        * \r
-        * @param       boolean         $withTo\r
-        * @return      string\r
-        */\r
-       public function getRecipients($withTo = false) {\r
-               $recipients = '';\r
-               if ($withTo && $this->getToString() != '') $recipients .= 'TO:'.$this->getToString().self::$crlf;\r
-               if ($this->getCCString() != '') $recipients .= 'CC:'.$this->getCCString().self::$crlf;\r
-               if ($this->getBCCString() != '') $recipients .= 'BCC:'.$this->getBCCString().self::$crlf;\r
-               return $recipients;     \r
-       }\r
-       \r
-       /**\r
-        * Creates the Body (Message, Attachments) for the Mail\r
-        * Returns the created Body to the function which invoke this class\r
-        * \r
-        * @return      string          mail body\r
-        */\r
-       public function getBody() {\r
-               $counter = 1;\r
-               $this->body = '';\r
-\r
-               if (count($this->getAttachments())) {\r
-                       // add message\r
-                       $this->body     .= '--'.$this->getBoundary().self::$crlf;\r
-                       $this->body     .= 'Content-Type: '.$this->getContentType().'; charset="UTF-8"'.self::$crlf;\r
-                       $this->body     .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;\r
-                       //$this->body   .= self::$crlf.self::$crlf;\r
-                       $this->body     .= self::$crlf;\r
-                       \r
-                       // wrap lines after 70 characters\r
-                       $this->body     .= wordwrap($this->getMessage(), 70); \r
-                       $this->body     .= self::$crlf.self::$crlf;\r
-                       $this->body     .= '--'.$this->getBoundary().self::$crlf;\r
-                       \r
-                       // add attachments\r
-                       foreach ($this->getAttachments() as $attachment) {\r
-                               $fileName       = $attachment['name'];\r
-                               $path           = $attachment['path'];\r
-                               \r
-                               // download file\r
-                               if (FileUtil::isURL($path)) {\r
-                                       $tmpPath = FileUtil::getTemporaryFilename('mailAttachment_');\r
-                                       if (!@copy($path, $tmpPath)) continue;\r
-                                       $path = $tmpPath;\r
-                               }\r
-                               \r
-                               // get file contents\r
-                               $data = @file_get_contents($path);\r
-                               $data = chunk_split(base64_encode($data), 70, self::$crlf);     \r
-                               \r
-                               $this->body .= 'Content-Type: application/octetstream; name="'.$fileName.'"'.self::$crlf;\r
-                               $this->body .= 'Content-Transfer-Encoding: base64'.self::$crlf;\r
-                               $this->body .= 'Content-Disposition: attachment; filename="'.$fileName.'"'.self::$crlf.self::$crlf;\r
-                               $this->body .= $data.self::$crlf.self::$crlf;\r
-                               \r
-                               if ($counter < count($this->getAttachments())) $this->body .= '--'.$this->getBoundary().self::$crlf;\r
-                               $counter++;\r
-                       }\r
-                       \r
-                       $this->body .= self::$crlf.'--'.$this->getBoundary().'--';\r
-               }\r
-               else {\r
-                       //$this->body   .= self::$crlf;\r
-                       $this->body     .= $this->getMessage();\r
-               }\r
-               return $this->body;\r
-       }\r
-       \r
-       /**\r
-        * Builds a formatted address: "$name" <$email>\r
-        * \r
-        * @param       string          $name\r
-        * @param       string          $email\r
-        * @param       boolean         $encodeName\r
-        * @return      string\r
-        */\r
-       public static function buildAddress($name, $email, $encodeName = true) {\r
-               if (!empty($name) && MAIL_USE_FORMATTED_ADDRESS) {\r
-                       if ($encodeName) $name = Mail::encodeMIMEHeader($name);\r
-                       if (!preg_match('/^[a-z0-9 ]*$/i', $name)) return '"'.str_replace('"', '\"', $name).'" <'.$email.'>';\r
-                       else return $name . ' <'.$email.'>';\r
-               }\r
-               return $email;\r
-       }\r
-\r
-       /**\r
-        * Sends this mail.\r
-        */\r
-       public function send() {\r
-               MailSender::getInstance()->sendMail($this);\r
-       }\r
-       \r
-       /**\r
-        * Sets the recpients of this mail.\r
-        * \r
-        * @param       mixed           $to\r
-        */\r
-       public function addTo($to) {\r
-               if (is_array($to)) {\r
-                       foreach ($to as $name => $recipient) {\r
-                               $this->to[] = self::buildAddress($name, $recipient);\r
-                       }\r
-               }\r
-               else {\r
-                       $this->to[] = $to;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the recipients of this mail.\r
-        * \r
-        * @return      mixed\r
-        */\r
-       public function getTo() {\r
-               return $this->to;\r
-       }\r
-       \r
-       /**\r
-        * Returns the list of recipients.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getToString() {\r
-               if (!empty($this->to)) return implode(', ', $this->to);\r
-               else return '';\r
-       }\r
-       \r
-       /**\r
-        * Sets the subject of this mail.\r
-        * \r
-        * @param       string          $subject\r
-        */\r
-       public function setSubject($subject) {\r
-               $this->subject = $subject;\r
-       }\r
-       \r
-       /**\r
-        * Returns the subject of this mail.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getSubject() {\r
-               return $this->subject;\r
-       }\r
-       \r
-       /**\r
-        * Sets the message of this mail.\r
-        * \r
-        * @param       string          $message\r
-        */\r
-       public function setMessage($message) {\r
-               $this->message = $message;\r
-       }\r
-       \r
-       /**\r
-        * Returns the message of this mail.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getMessage() {\r
-               return preg_replace('%(\r\n|\r|\n)%', self::$crlf, $this->message . (MAIL_SIGNATURE ? self::$crlf . self::$crlf . MAIL_SIGNATURE : ''));\r
-       }\r
-       \r
-       /**\r
-        * Sets the sender of this mail.\r
-        * \r
-        * @param       mixed           $from\r
-        */\r
-       public function setFrom($from) {\r
-               if (is_array($from)) {\r
-                       $this->from = self::buildAddress(key($from), current($from), false);\r
-               }\r
-               else {\r
-                       $this->from = $from;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Gets the sender of this mail.\r
-        * \r
-        * @return      mixed\r
-        */\r
-       public function getFrom() {\r
-               return $this->from;\r
-       }\r
-       \r
-       /**\r
-        * Sets the carbon copy recipients of this mail.\r
-        * \r
-        * @param       mixed           $cc\r
-        */\r
-       public function addCC($cc) {\r
-               if (is_array($cc)) {\r
-                       foreach ($cc as $name => $recipient) {\r
-                               $this->cc[] = self::buildAddress($name, $recipient);\r
-                       }\r
-               }\r
-               else {\r
-                       $this->cc[] = $cc;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the carbon copy recipients of this mail.\r
-        * \r
-        * @return      mixed\r
-        */\r
-       public function getCC() {\r
-               return $this->cc;\r
-       }\r
-       \r
-       /**\r
-        * Returns the carbon copy recipients of this mail as String.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getCCString() {\r
-               if (!empty($this->cc)) return implode(', ', $this->cc);\r
-               else return '';\r
-       }\r
-       \r
-       /**\r
-        * Sets the blind carbon copy recipients of this mail.\r
-        * \r
-        * @param       mixed           $bcc\r
-        */\r
-       public function addBCC($bcc) {\r
-               if (is_array($bcc)) {\r
-                       foreach ($bcc as $name => $recipient) {\r
-                               $this->bcc[] = self::buildAddress($name, $recipient);\r
-                       }\r
-               }\r
-               else {\r
-                       $this->bcc[] = $bcc;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the blind carbon copy recipients of this mail.\r
-        * \r
-        * @return      mixed\r
-        */\r
-       public function getBCC() {\r
-               return $this->bcc;\r
-       }\r
-       \r
-       /**\r
-        * Returns the blind carbon copy recipients of this mail as String.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getBCCString() {\r
-               if (!empty($this->bcc)) return implode(', ', $this->bcc);\r
-               else return '';\r
-       }\r
-       \r
-       /**\r
-        * Sets the attachments of this mail.\r
-        * \r
-        * @param       array           $attachments\r
-        */\r
-       public function setAttachments($attachments) {\r
-               $this->attachments = $attachments;\r
-       }\r
-       \r
-       /**\r
-        * Returns the attachments of this mail.\r
-        * \r
-        * @return      array\r
-        */\r
-       public function getAttachments() {\r
-               return $this->attachments;\r
-       }\r
-       \r
-       /**\r
-        * Adds an attachment to this mail.\r
-        * \r
-        * @param       string          $path\r
-        */\r
-       public function addAttachment($path) {\r
-               $this->attachments[] = array('path' => $path, 'name' => basename($path));\r
-       }\r
-       \r
-       /**\r
-        * Sets the Priority of the Mail; Default = 3\r
-        * \r
-        * @param       integer         $priority\r
-        */\r
-       public function setPriority($priority) {\r
-               $this->priority = $priority;\r
-       }\r
-       \r
-       /**\r
-        * Returns the Priority of the Mail\r
-        * \r
-        * @return      integer\r
-        */\r
-       public function getPriority() {\r
-               return $this->priority;\r
-       }\r
-       \r
-       /**\r
-        * Creates a boundary for mutlipart/mixed Mail \r
-        */\r
-       protected function setBoundary() {\r
-               $this->boundary = "==Multipart_Boundary_x".StringUtil::getRandomID()."x";\r
-       }\r
-       \r
-       /**\r
-        * Returns the created Boundary\r
-        * \r
-        * @return      string\r
-        */\r
-       protected function getBoundary() {\r
-               return $this->boundary;\r
-       }\r
-       \r
-       /**\r
-        * Returns the Content Type\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getContentType() {\r
-               return $this->contentType;\r
-       }\r
-       \r
-       /**\r
-        * Sets the content type.\r
-        * \r
-        * @param       string          $contentType\r
-        */\r
-       public function setContentType($contentType) {\r
-               $this->contentType = $contentType;\r
-       }\r
-       \r
-       /**\r
-        * Sets additional headers\r
-        * \r
-        * @param       string          $header\r
-        */\r
-       public function setHeader($header) {\r
-               if (!empty($header)) {\r
-                       $this->header .= $header.self::$crlf;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Encodes string for MIME header.\r
-        */\r
-       public static function encodeMIMEHeader($string) {\r
-               if (function_exists('mb_encode_mimeheader')) {\r
-                       $string = mb_encode_mimeheader($string, 'UTF-8', 'Q', Mail::$crlf);\r
-               }\r
-               else {\r
-                       $string = '=?UTF-8?Q?'.preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%", "=", str_replace("%0D%0A", "\r\n", str_replace("%20", " ", rawurlencode($string))))).'?=';\r
-               }\r
-               \r
-               return $string;\r
-       }\r
+<?php
+namespace wcf\system\mail;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+
+/**
+ * This class represents an e-mail.
+ * 
+ * @author     Michael Schaefer
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.mail
+ * @category   Community Framework
+ */
+class Mail {
+       protected $header = '';
+       protected $boundary;
+       protected $contentType = "text/plain";
+       protected $to;
+       protected $subject;
+       protected $message;
+       protected $from;
+       protected $cc;
+       protected $bcc;
+       protected $attachments = array();
+       protected $priority;
+       protected $body;
+       
+       public static $crlf = "\n";
+
+       /**
+        * Creates a new Mail object.
+        * 
+        * @param       string          $to
+        * @param       string          $subject
+        * @param       string          $message
+        * @param       string          $from
+        * @param       string          $cc
+        * @param       string          $bcc
+        * @param       array           $attachments
+        * @param       integer         $priority
+        * @param       string          $header
+        */
+       public function __construct($to = '', $subject = '', $message = '', $from = '', $cc = '', $bcc = '', $attachments = array(), $priority = '', $header = '') {
+               $this->setBoundary();
+               
+               if (empty($from))       $from           = array(MAIL_FROM_NAME => MAIL_FROM_ADDRESS);
+               if (empty($priority))   $priority       = 3;
+                       
+               $this->setFrom($from);
+               $this->setSubject($subject);
+               $this->setMessage($message);
+               $this->setPriority($priority);
+               $this->setHeader($header);
+               
+               if (!empty($to))        $this->addTo($to);
+               if (!empty($cc))        $this->addCC($cc);
+               if (!empty($bcc))       $this->addBCC($bcc);
+               
+               if (count($attachments) > 0) $this->setAttachments($attachments);
+       }
+       
+       /**
+        * Creates a Basic Header for the Mail
+        * Returns this Header to the function which invoke this class
+        * 
+        * @return      string          mail header
+        */
+       public function getHeader() {
+               if (!empty($this->header)) {
+                       $this->header = preg_replace('%(\r\n|\r|\n)%', self::$crlf, $this->header);
+               }
+               
+               $this->header .=
+                       'X-Priority: 3'.self::$crlf
+                       .'X-Mailer: WoltLab Community Framework Mail Package'.self::$crlf                                                                       
+                       .'MIME-Version: 1.0'.self::$crlf
+                       .'From: '.$this->getFrom().self::$crlf
+                       .($this->getCCString() != '' ? 'CC:'.$this->getCCString().self::$crlf : '')
+                       .($this->getBCCString() != '' ? 'BCC:'.$this->getBCCString().self::$crlf : '');                                 
+                       
+               if (count($this->getAttachments())) {
+                       $this->header .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;
+                       $this->header .= 'Content-Type: multipart/mixed;'.self::$crlf;
+                       $this->header .= "\tboundary=".'"'.$this->getBoundary().'";'.self::$crlf;
+               }
+               else {
+                       $this->header .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;
+                       $this->header .= 'Content-Type: '.$this->getContentType().'; charset=UTF-8'.self::$crlf;
+               }
+               
+               return $this->header;
+       }
+       
+       /**
+        * Creates the Recipients List (To, CC, BCC) 
+        * Returns this List to the function which invoke this class
+        * 
+        * @param       boolean         $withTo
+        * @return      string
+        */
+       public function getRecipients($withTo = false) {
+               $recipients = '';
+               if ($withTo && $this->getToString() != '') $recipients .= 'TO:'.$this->getToString().self::$crlf;
+               if ($this->getCCString() != '') $recipients .= 'CC:'.$this->getCCString().self::$crlf;
+               if ($this->getBCCString() != '') $recipients .= 'BCC:'.$this->getBCCString().self::$crlf;
+               return $recipients;     
+       }
+       
+       /**
+        * Creates the Body (Message, Attachments) for the Mail
+        * Returns the created Body to the function which invoke this class
+        * 
+        * @return      string          mail body
+        */
+       public function getBody() {
+               $counter = 1;
+               $this->body = '';
+
+               if (count($this->getAttachments())) {
+                       // add message
+                       $this->body     .= '--'.$this->getBoundary().self::$crlf;
+                       $this->body     .= 'Content-Type: '.$this->getContentType().'; charset="UTF-8"'.self::$crlf;
+                       $this->body     .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;
+                       //$this->body   .= self::$crlf.self::$crlf;
+                       $this->body     .= self::$crlf;
+                       
+                       // wrap lines after 70 characters
+                       $this->body     .= wordwrap($this->getMessage(), 70); 
+                       $this->body     .= self::$crlf.self::$crlf;
+                       $this->body     .= '--'.$this->getBoundary().self::$crlf;
+                       
+                       // add attachments
+                       foreach ($this->getAttachments() as $attachment) {
+                               $fileName       = $attachment['name'];
+                               $path           = $attachment['path'];
+                               
+                               // download file
+                               if (FileUtil::isURL($path)) {
+                                       $tmpPath = FileUtil::getTemporaryFilename('mailAttachment_');
+                                       if (!@copy($path, $tmpPath)) continue;
+                                       $path = $tmpPath;
+                               }
+                               
+                               // get file contents
+                               $data = @file_get_contents($path);
+                               $data = chunk_split(base64_encode($data), 70, self::$crlf);     
+                               
+                               $this->body .= 'Content-Type: application/octetstream; name="'.$fileName.'"'.self::$crlf;
+                               $this->body .= 'Content-Transfer-Encoding: base64'.self::$crlf;
+                               $this->body .= 'Content-Disposition: attachment; filename="'.$fileName.'"'.self::$crlf.self::$crlf;
+                               $this->body .= $data.self::$crlf.self::$crlf;
+                               
+                               if ($counter < count($this->getAttachments())) $this->body .= '--'.$this->getBoundary().self::$crlf;
+                               $counter++;
+                       }
+                       
+                       $this->body .= self::$crlf.'--'.$this->getBoundary().'--';
+               }
+               else {
+                       //$this->body   .= self::$crlf;
+                       $this->body     .= $this->getMessage();
+               }
+               return $this->body;
+       }
+       
+       /**
+        * Builds a formatted address: "$name" <$email>
+        * 
+        * @param       string          $name
+        * @param       string          $email
+        * @param       boolean         $encodeName
+        * @return      string
+        */
+       public static function buildAddress($name, $email, $encodeName = true) {
+               if (!empty($name) && MAIL_USE_FORMATTED_ADDRESS) {
+                       if ($encodeName) $name = Mail::encodeMIMEHeader($name);
+                       if (!preg_match('/^[a-z0-9 ]*$/i', $name)) return '"'.str_replace('"', '\"', $name).'" <'.$email.'>';
+                       else return $name . ' <'.$email.'>';
+               }
+               return $email;
+       }
+
+       /**
+        * Sends this mail.
+        */
+       public function send() {
+               MailSender::getInstance()->sendMail($this);
+       }
+       
+       /**
+        * Sets the recpients of this mail.
+        * 
+        * @param       mixed           $to
+        */
+       public function addTo($to) {
+               if (is_array($to)) {
+                       foreach ($to as $name => $recipient) {
+                               $this->to[] = self::buildAddress($name, $recipient);
+                       }
+               }
+               else {
+                       $this->to[] = $to;
+               }
+       }
+       
+       /**
+        * Returns the recipients of this mail.
+        * 
+        * @return      mixed
+        */
+       public function getTo() {
+               return $this->to;
+       }
+       
+       /**
+        * Returns the list of recipients.
+        * 
+        * @return      string
+        */
+       public function getToString() {
+               if (!empty($this->to)) return implode(', ', $this->to);
+               else return '';
+       }
+       
+       /**
+        * Sets the subject of this mail.
+        * 
+        * @param       string          $subject
+        */
+       public function setSubject($subject) {
+               $this->subject = $subject;
+       }
+       
+       /**
+        * Returns the subject of this mail.
+        * 
+        * @return      string
+        */
+       public function getSubject() {
+               return $this->subject;
+       }
+       
+       /**
+        * Sets the message of this mail.
+        * 
+        * @param       string          $message
+        */
+       public function setMessage($message) {
+               $this->message = $message;
+       }
+       
+       /**
+        * Returns the message of this mail.
+        * 
+        * @return      string
+        */
+       public function getMessage() {
+               return preg_replace('%(\r\n|\r|\n)%', self::$crlf, $this->message . (MAIL_SIGNATURE ? self::$crlf . self::$crlf . MAIL_SIGNATURE : ''));
+       }
+       
+       /**
+        * Sets the sender of this mail.
+        * 
+        * @param       mixed           $from
+        */
+       public function setFrom($from) {
+               if (is_array($from)) {
+                       $this->from = self::buildAddress(key($from), current($from), false);
+               }
+               else {
+                       $this->from = $from;
+               }
+       }
+       
+       /**
+        * Gets the sender of this mail.
+        * 
+        * @return      mixed
+        */
+       public function getFrom() {
+               return $this->from;
+       }
+       
+       /**
+        * Sets the carbon copy recipients of this mail.
+        * 
+        * @param       mixed           $cc
+        */
+       public function addCC($cc) {
+               if (is_array($cc)) {
+                       foreach ($cc as $name => $recipient) {
+                               $this->cc[] = self::buildAddress($name, $recipient);
+                       }
+               }
+               else {
+                       $this->cc[] = $cc;
+               }
+       }
+       
+       /**
+        * Returns the carbon copy recipients of this mail.
+        * 
+        * @return      mixed
+        */
+       public function getCC() {
+               return $this->cc;
+       }
+       
+       /**
+        * Returns the carbon copy recipients of this mail as String.
+        * 
+        * @return      string
+        */
+       public function getCCString() {
+               if (!empty($this->cc)) return implode(', ', $this->cc);
+               else return '';
+       }
+       
+       /**
+        * Sets the blind carbon copy recipients of this mail.
+        * 
+        * @param       mixed           $bcc
+        */
+       public function addBCC($bcc) {
+               if (is_array($bcc)) {
+                       foreach ($bcc as $name => $recipient) {
+                               $this->bcc[] = self::buildAddress($name, $recipient);
+                       }
+               }
+               else {
+                       $this->bcc[] = $bcc;
+               }
+       }
+       
+       /**
+        * Returns the blind carbon copy recipients of this mail.
+        * 
+        * @return      mixed
+        */
+       public function getBCC() {
+               return $this->bcc;
+       }
+       
+       /**
+        * Returns the blind carbon copy recipients of this mail as String.
+        * 
+        * @return      string
+        */
+       public function getBCCString() {
+               if (!empty($this->bcc)) return implode(', ', $this->bcc);
+               else return '';
+       }
+       
+       /**
+        * Sets the attachments of this mail.
+        * 
+        * @param       array           $attachments
+        */
+       public function setAttachments($attachments) {
+               $this->attachments = $attachments;
+       }
+       
+       /**
+        * Returns the attachments of this mail.
+        * 
+        * @return      array
+        */
+       public function getAttachments() {
+               return $this->attachments;
+       }
+       
+       /**
+        * Adds an attachment to this mail.
+        * 
+        * @param       string          $path
+        */
+       public function addAttachment($path) {
+               $this->attachments[] = array('path' => $path, 'name' => basename($path));
+       }
+       
+       /**
+        * Sets the Priority of the Mail; Default = 3
+        * 
+        * @param       integer         $priority
+        */
+       public function setPriority($priority) {
+               $this->priority = $priority;
+       }
+       
+       /**
+        * Returns the Priority of the Mail
+        * 
+        * @return      integer
+        */
+       public function getPriority() {
+               return $this->priority;
+       }
+       
+       /**
+        * Creates a boundary for mutlipart/mixed Mail 
+        */
+       protected function setBoundary() {
+               $this->boundary = "==Multipart_Boundary_x".StringUtil::getRandomID()."x";
+       }
+       
+       /**
+        * Returns the created Boundary
+        * 
+        * @return      string
+        */
+       protected function getBoundary() {
+               return $this->boundary;
+       }
+       
+       /**
+        * Returns the Content Type
+        * 
+        * @return      string
+        */
+       public function getContentType() {
+               return $this->contentType;
+       }
+       
+       /**
+        * Sets the content type.
+        * 
+        * @param       string          $contentType
+        */
+       public function setContentType($contentType) {
+               $this->contentType = $contentType;
+       }
+       
+       /**
+        * Sets additional headers
+        * 
+        * @param       string          $header
+        */
+       public function setHeader($header) {
+               if (!empty($header)) {
+                       $this->header .= $header.self::$crlf;
+               }
+       }
+       
+       /**
+        * Encodes string for MIME header.
+        */
+       public static function encodeMIMEHeader($string) {
+               if (function_exists('mb_encode_mimeheader')) {
+                       $string = mb_encode_mimeheader($string, 'UTF-8', 'Q', Mail::$crlf);
+               }
+               else {
+                       $string = '=?UTF-8?Q?'.preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%", "=", str_replace("%0D%0A", "\r\n", str_replace("%20", " ", rawurlencode($string))))).'?=';
+               }
+               
+               return $string;
+       }
 }
index 7da3e41d9dbe3f85a6c0f46d230c65e3c746925d..447972dbf249790ee86c881be82c12f7ccc5cd55 100644 (file)
@@ -1,52 +1,52 @@
-<?php\r
-namespace wcf\system\mail;\r
-\r
-/**\r
- * Mailsender sends e-mails.\r
- * \r
- * @author     Michael Schaefer\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category   Community Framework\r
- */\r
-abstract class MailSender {\r
-       /**\r
-        * unique mail server instance\r
-        * @var MailSender\r
-        */\r
-       protected static $instance = null;\r
-       \r
-       /**\r
-        * Returns the default mail sender.\r
-        * \r
-        * @return      MailSender\r
-        */\r
-       public static function getInstance() {\r
-               if (self::$instance == null) {\r
-                       switch (MAIL_SEND_METHOD) {\r
-                               case 'php':\r
-                                       self::$defaultMailSender = new PHPMailSender();\r
-                                       break;\r
-                               \r
-                               case 'smtp':\r
-                                       self::$defaultMailSender = new SMTPMailSender();\r
-                                       break;\r
-                               \r
-                               case 'debug':\r
-                                       self::$defaultMailSender = new DebugMailSender();\r
-                                       break;\r
-                       }\r
-               }\r
-               \r
-               return self::$instance;\r
-       }\r
-       \r
-       /**\r
-        * Sends an e-mail.\r
-        * \r
-        * @param       Mail    $mail\r
-        */\r
-       public abstract function sendMail(Mail $mail); \r
+<?php
+namespace wcf\system\mail;
+
+/**
+ * Mailsender sends e-mails.
+ * 
+ * @author     Michael Schaefer
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.mail
+ * @category   Community Framework
+ */
+abstract class MailSender {
+       /**
+        * unique mail server instance
+        * @var MailSender
+        */
+       protected static $instance = null;
+       
+       /**
+        * Returns the default mail sender.
+        * 
+        * @return      MailSender
+        */
+       public static function getInstance() {
+               if (self::$instance == null) {
+                       switch (MAIL_SEND_METHOD) {
+                               case 'php':
+                                       self::$defaultMailSender = new PHPMailSender();
+                                       break;
+                               
+                               case 'smtp':
+                                       self::$defaultMailSender = new SMTPMailSender();
+                                       break;
+                               
+                               case 'debug':
+                                       self::$defaultMailSender = new DebugMailSender();
+                                       break;
+                       }
+               }
+               
+               return self::$instance;
+       }
+       
+       /**
+        * Sends an e-mail.
+        * 
+        * @param       Mail    $mail
+        */
+       public abstract function sendMail(Mail $mail); 
 }
index 7fc116eccbfc5c5d5a4597768975ce8f69d5d90e..f4abaa35c32754110b6bc8c2dbb4b5ae233012e5 100644 (file)
@@ -1,22 +1,22 @@
-<?php\r
-namespace wcf\system\mail;\r
-\r
-/**\r
- * Sends a Mail with the php mail function.\r
- * \r
- * @author     Michael Schaefer\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category   Community Framework\r
- */\r
-class PHPMailSender extends MailSender {\r
-       /**\r
-        * @see MailSender::sendMail()\r
-        */\r
-       public function sendMail(Mail $mail) {\r
-               if (MAIL_USE_F_PARAM) return @mb_send_mail($mail->getToString(), $mail->getSubject(), $mail->getBody(), $mail->getHeader(), '-f'.MAIL_FROM_ADDRESS);\r
-               else return @mb_send_mail($mail->getToString(), $mail->getSubject(), $mail->getBody(), $mail->getHeader());\r
-       }\r
+<?php
+namespace wcf\system\mail;
+
+/**
+ * Sends a Mail with the php mail function.
+ * 
+ * @author     Michael Schaefer
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.mail
+ * @category   Community Framework
+ */
+class PHPMailSender extends MailSender {
+       /**
+        * @see MailSender::sendMail()
+        */
+       public function sendMail(Mail $mail) {
+               if (MAIL_USE_F_PARAM) return @mb_send_mail($mail->getToString(), $mail->getSubject(), $mail->getBody(), $mail->getHeader(), '-f'.MAIL_FROM_ADDRESS);
+               else return @mb_send_mail($mail->getToString(), $mail->getSubject(), $mail->getBody(), $mail->getHeader());
+       }
 }
index 90ad48057cbc1f398f1dd8d21c0c9f76be8fd70d..f96469e66ebbe171976d65105cee5940cb0d7834 100644 (file)
-<?php\r
-namespace wcf\system\mail;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\io\RemoteFile;\r
-\r
-/**\r
- * Sends a Mail with a connection to a smtp server.\r
- * \r
- * @author     Michael Schaefer\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category   Community Framework\r
- */\r
-class SMTPMailSender extends MailSender {\r
-       protected $connection = null;\r
-       protected $statusCode = '';\r
-       protected $statusMsg = '';\r
-       protected $recipients;\r
-       \r
-       /**\r
-        * Creates a new SMTPMailSender object.\r
-        */\r
-       public function __construct() {\r
-               Mail::$crlf = "\r\n";\r
-       }\r
-       \r
-       /**\r
-        * Destroys the SMTPMailSender object.\r
-        */\r
-       public function __destruct() {\r
-               $this->disconnect();\r
-       }\r
-\r
-       /**\r
-        * Connects to the smtp-server\r
-        */\r
-       protected function connect() {\r
-               // connect\r
-               $this->connection = new RemoteFile(MAIL_SMTP_HOST, MAIL_SMTP_PORT);\r
-               $this->getSMTPStatus();\r
-               if ($this->statusCode != 220) {\r
-                       throw new SystemException($this->formatError("can not connect to '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."'"), 17000);\r
-               }\r
-               \r
-               // send ehlo\r
-               $this->write('EHLO '.$_SERVER['HTTP_HOST']);\r
-               $this->getSMTPStatus();\r
-               if ($this->statusCode == 250) {\r
-                       // do authentication\r
-                       if (MAIL_SMTP_USER != '' || MAIL_SMTP_PASSWORD != '') {\r
-                               $this->auth();\r
-                       }\r
-               }\r
-               else {\r
-                       // send helo\r
-                       $this->write('HELO '.$_SERVER['HTTP_HOST']);\r
-                       $this->getSMTPStatus();\r
-                       if ($this->statusCode != 250) {\r
-                               throw new SystemException($this->formatError("can not connect to '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."'"), 17000);\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Formats a smtp error message.\r
-        * \r
-        * @param       string          $message\r
-        * @return      string\r
-        */\r
-       protected function formatError($message) {\r
-               return $message.': '.$this->statusMsg.' ('.$this->statusCode.')';\r
-       }\r
-       \r
-       /**\r
-        * Does the Authentification of the Client at the Server\r
-        */\r
-       protected function auth() {\r
-               // Init Authentication\r
-               $this->write('AUTH LOGIN');\r
-               $this->getSMTPStatus();\r
-               \r
-               // checks if auth is supported\r
-               if ($this->statusCode != 334) {\r
-                       throw new SystemException($this->formatError("smtp mail server '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."' does not support user authentication"), 17001);\r
-               }\r
-               \r
-               // sending user information to smtp-server\r
-               $this->write(base64_encode(MAIL_SMTP_USER));\r
-               $this->getSMTPStatus();\r
-               if ($this->statusCode != 334) {\r
-                       throw new SystemException($this->formatError("unknown smtp user '".MAIL_SMTP_USER."'"), 17002);\r
-               }\r
-                       \r
-               $this->write(base64_encode(MAIL_SMTP_PASSWORD));\r
-               $this->getSMTPStatus();\r
-               if ($this->statusCode != 235) {\r
-                       throw new SystemException($this->formatError("invalid password for smtp user '".MAIL_SMTP_USER."'"), 17003);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see MailSender::sendMail()\r
-        */\r
-       public function sendMail(Mail $mail) {\r
-               $this->recipients = array();\r
-               if (count($mail->getTo()) > 0)  $this->recipients = $mail->getTo();\r
-               if (count($mail->getCC()) > 0)  $this->recipients = array_merge($this->recipients, $mail->getCC());\r
-               if (count($mail->getBCC())> 0)  $this->recipients = array_merge($this->recipients, $mail->getBCC());\r
-               \r
-               // apply connection\r
-               if ($this->connection === null) {\r
-                       $this->connect();\r
-               }\r
-               \r
-               // send mail\r
-               $this->write('MAIL FROM:<'.$mail->getFrom().'>');\r
-               $this->getSMTPStatus();\r
-               if ($this->statusCode != 250) {\r
-                       throw new SystemException($this->formatError("wrong from format '".$mail->getFrom()."'"), 17004);\r
-               }\r
-               \r
-               // recipients\r
-               $recipientCounter = 0;\r
-               foreach ($this->recipients as $recipient) {\r
-                       $this->write('RCPT TO:<'.$recipient.'>');\r
-                       $this->getSMTPStatus();\r
-                       if ($this->statusCode != 250 && $this->statusCode != 251) {\r
-                               if ($this->statusCode < 550) {\r
-                                       throw new SystemException($this->formatError("wrong recipient format '".$recipient."'"), 17004);\r
-                               }\r
-                               continue;\r
-                       }\r
-                       $recipientCounter++;\r
-               }\r
-               if (!$recipientCounter) {\r
-                       $this->write("RSET");\r
-                       return;\r
-               }\r
-               \r
-               // data\r
-               $this->write("DATA");\r
-               $this->getSMTPStatus();\r
-               if ($this->statusCode != 354 && $this->statusCode != 250) {\r
-                       throw new SystemException($this->formatError("smtp error"), 17005);\r
-               }\r
-                                               \r
-               $header =\r
-                       "Date: ".gmdate('r').Mail::$crlf\r
-                       ."To: ".$mail->getToString().Mail::$crlf\r
-                       ."Message-ID: <".md5(uniqid())."@".$_SERVER['SERVER_NAME'].">".Mail::$crlf\r
-                       ."Subject: ".Mail::encodeMIMEHeader($mail->getSubject()).Mail::$crlf\r
-                       .$mail->getHeader();\r
-\r
-               $this->write($header);\r
-               $this->write("");\r
-               $this->write($mail->getBody());\r
-               $this->write(".");\r
-                       \r
-               $this->getSMTPStatus();\r
-               if ($this->statusCode != 250) {\r
-                       throw new SystemException($this->formatError("message sending failed"), 17005);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Disconnects the Client-Server connection\r
-        */\r
-       function disconnect() {\r
-               if ($this->connection === null) {\r
-                       return;\r
-               }\r
-\r
-               $this->write("QUIT");\r
-               $this->read();\r
-               $this->connection->close();\r
-               $this->connection = null;\r
-       }\r
-       \r
-       /**\r
-        * Reads the Information wich the Server sends back.\r
-        * \r
-        * @return      string\r
-        */\r
-       protected function read() {\r
-               $result = '';\r
-               while ($read = $this->connection->gets()) {\r
-                       $result .= $read;\r
-                       if (substr($read, 3, 1) == " ") break;\r
-               }\r
-               return $result; \r
-       }\r
-       \r
-       /**\r
-        * Gets error code and message from a server message.\r
-        * \r
-        * @param       string          $data\r
-        */\r
-       protected function getSMTPStatus($data = null) {\r
-               if ($data === null) $data = $this->read();\r
-               $this->statusCode = intval(substr($data, 0, 3));\r
-               $this->statusMsg  = substr($data, 4);\r
-       }\r
-       \r
-       /**\r
-        * Sends Information to the smtp-Server\r
-        * \r
-        * @param       string          $data\r
-        */\r
-       protected function write($data) {\r
-               $this->connection->puts($data.Mail::$crlf);\r
-       }\r
+<?php
+namespace wcf\system\mail;
+use wcf\system\exception\SystemException;
+use wcf\system\io\RemoteFile;
+
+/**
+ * Sends a Mail with a connection to a smtp server.
+ * 
+ * @author     Michael Schaefer
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage data.mail
+ * @category   Community Framework
+ */
+class SMTPMailSender extends MailSender {
+       protected $connection = null;
+       protected $statusCode = '';
+       protected $statusMsg = '';
+       protected $recipients;
+       
+       /**
+        * Creates a new SMTPMailSender object.
+        */
+       public function __construct() {
+               Mail::$crlf = "\r\n";
+       }
+       
+       /**
+        * Destroys the SMTPMailSender object.
+        */
+       public function __destruct() {
+               $this->disconnect();
+       }
+
+       /**
+        * Connects to the smtp-server
+        */
+       protected function connect() {
+               // connect
+               $this->connection = new RemoteFile(MAIL_SMTP_HOST, MAIL_SMTP_PORT);
+               $this->getSMTPStatus();
+               if ($this->statusCode != 220) {
+                       throw new SystemException($this->formatError("can not connect to '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."'"), 17000);
+               }
+               
+               // send ehlo
+               $this->write('EHLO '.$_SERVER['HTTP_HOST']);
+               $this->getSMTPStatus();
+               if ($this->statusCode == 250) {
+                       // do authentication
+                       if (MAIL_SMTP_USER != '' || MAIL_SMTP_PASSWORD != '') {
+                               $this->auth();
+                       }
+               }
+               else {
+                       // send helo
+                       $this->write('HELO '.$_SERVER['HTTP_HOST']);
+                       $this->getSMTPStatus();
+                       if ($this->statusCode != 250) {
+                               throw new SystemException($this->formatError("can not connect to '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."'"), 17000);
+                       }
+               }
+       }
+       
+       /**
+        * Formats a smtp error message.
+        * 
+        * @param       string          $message
+        * @return      string
+        */
+       protected function formatError($message) {
+               return $message.': '.$this->statusMsg.' ('.$this->statusCode.')';
+       }
+       
+       /**
+        * Does the Authentification of the Client at the Server
+        */
+       protected function auth() {
+               // Init Authentication
+               $this->write('AUTH LOGIN');
+               $this->getSMTPStatus();
+               
+               // checks if auth is supported
+               if ($this->statusCode != 334) {
+                       throw new SystemException($this->formatError("smtp mail server '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."' does not support user authentication"), 17001);
+               }
+               
+               // sending user information to smtp-server
+               $this->write(base64_encode(MAIL_SMTP_USER));
+               $this->getSMTPStatus();
+               if ($this->statusCode != 334) {
+                       throw new SystemException($this->formatError("unknown smtp user '".MAIL_SMTP_USER."'"), 17002);
+               }
+                       
+               $this->write(base64_encode(MAIL_SMTP_PASSWORD));
+               $this->getSMTPStatus();
+               if ($this->statusCode != 235) {
+                       throw new SystemException($this->formatError("invalid password for smtp user '".MAIL_SMTP_USER."'"), 17003);
+               }
+       }
+       
+       /**
+        * @see MailSender::sendMail()
+        */
+       public function sendMail(Mail $mail) {
+               $this->recipients = array();
+               if (count($mail->getTo()) > 0)  $this->recipients = $mail->getTo();
+               if (count($mail->getCC()) > 0)  $this->recipients = array_merge($this->recipients, $mail->getCC());
+               if (count($mail->getBCC())> 0)  $this->recipients = array_merge($this->recipients, $mail->getBCC());
+               
+               // apply connection
+               if ($this->connection === null) {
+                       $this->connect();
+               }
+               
+               // send mail
+               $this->write('MAIL FROM:<'.$mail->getFrom().'>');
+               $this->getSMTPStatus();
+               if ($this->statusCode != 250) {
+                       throw new SystemException($this->formatError("wrong from format '".$mail->getFrom()."'"), 17004);
+               }
+               
+               // recipients
+               $recipientCounter = 0;
+               foreach ($this->recipients as $recipient) {
+                       $this->write('RCPT TO:<'.$recipient.'>');
+                       $this->getSMTPStatus();
+                       if ($this->statusCode != 250 && $this->statusCode != 251) {
+                               if ($this->statusCode < 550) {
+                                       throw new SystemException($this->formatError("wrong recipient format '".$recipient."'"), 17004);
+                               }
+                               continue;
+                       }
+                       $recipientCounter++;
+               }
+               if (!$recipientCounter) {
+                       $this->write("RSET");
+                       return;
+               }
+               
+               // data
+               $this->write("DATA");
+               $this->getSMTPStatus();
+               if ($this->statusCode != 354 && $this->statusCode != 250) {
+                       throw new SystemException($this->formatError("smtp error"), 17005);
+               }
+                                               
+               $header =
+                       "Date: ".gmdate('r').Mail::$crlf
+                       ."To: ".$mail->getToString().Mail::$crlf
+                       ."Message-ID: <".md5(uniqid())."@".$_SERVER['SERVER_NAME'].">".Mail::$crlf
+                       ."Subject: ".Mail::encodeMIMEHeader($mail->getSubject()).Mail::$crlf
+                       .$mail->getHeader();
+
+               $this->write($header);
+               $this->write("");
+               $this->write($mail->getBody());
+               $this->write(".");
+                       
+               $this->getSMTPStatus();
+               if ($this->statusCode != 250) {
+                       throw new SystemException($this->formatError("message sending failed"), 17005);
+               }
+       }
+       
+       /**
+        * Disconnects the Client-Server connection
+        */
+       function disconnect() {
+               if ($this->connection === null) {
+                       return;
+               }
+
+               $this->write("QUIT");
+               $this->read();
+               $this->connection->close();
+               $this->connection = null;
+       }
+       
+       /**
+        * Reads the Information wich the Server sends back.
+        * 
+        * @return      string
+        */
+       protected function read() {
+               $result = '';
+               while ($read = $this->connection->gets()) {
+                       $result .= $read;
+                       if (substr($read, 3, 1) == " ") break;
+               }
+               return $result; 
+       }
+       
+       /**
+        * Gets error code and message from a server message.
+        * 
+        * @param       string          $data
+        */
+       protected function getSMTPStatus($data = null) {
+               if ($data === null) $data = $this->read();
+               $this->statusCode = intval(substr($data, 0, 3));
+               $this->statusMsg  = substr($data, 4);
+       }
+       
+       /**
+        * Sends Information to the smtp-Server
+        * 
+        * @param       string          $data
+        */
+       protected function write($data) {
+               $this->connection->puts($data.Mail::$crlf);
+       }
 }
index 53a6d5ee1466066cd9c4b23e7f7d90b7881b63a0..db79779e05eafffd69a78de53b95440b5512bbc7 100644 (file)
@@ -1,21 +1,21 @@
-<?php\r
-namespace wcf\system\menu;\r
-\r
-/**\r
- * Any tree menu item should implement this interface.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.menu\r
- * @category   Community Framework\r
- */\r
-interface ITreeMenuItem {\r
-       /**\r
-        * Returns the link of this item.\r
-        * \r
-        * @return string\r
-        */\r
-       public function getLink();\r
+<?php
+namespace wcf\system\menu;
+
+/**
+ * Any tree menu item should implement this interface.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.menu
+ * @category   Community Framework
+ */
+interface ITreeMenuItem {
+       /**
+        * Returns the link of this item.
+        * 
+        * @return string
+        */
+       public function getLink();
 }
index 39e12f67ff9936352d5e76d89553d9a6bb9ffa98..29b046d4ba26e1a8362ccd8b60e37a4b030c9c81 100644 (file)
-<?php\r
-namespace wcf\system\menu;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\SingletonFactory;\r
-use wcf\system\WCF;\r
-use wcf\util\FileUtil;\r
-\r
-/**\r
- * Basis class for a tree menu.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.menu\r
- * @category   Community Framework\r
- */\r
-abstract class TreeMenu extends SingletonFactory {\r
-       /**\r
-        * List of visible menu items.\r
-        * \r
-        * @var array\r
-        */\r
-       public $menuItemList = array();\r
-       \r
-       /**\r
-        * List of active menu items.\r
-        * \r
-        * @var array\r
-        */\r
-       public $activeMenuItems = array();\r
-       \r
-       /**\r
-        * List of all menu items.\r
-        * \r
-        * @var array\r
-        */\r
-       public $menuItems = null;\r
-\r
-       /**\r
-        * @see SingletonFactory::init()\r
-        */\r
-       protected function init() {\r
-               // get menu items from cache\r
-               $this->loadCache();\r
-               \r
-               // check menu items\r
-               $this->checkMenuItems();\r
-               \r
-               // remove items without children\r
-               $this->removeEmptyItems();\r
-               \r
-               // build plain menu item list\r
-               $this->buildMenuItemList();\r
-               \r
-               // call init event\r
-               EventHandler::getInstance()->fireAction($this, 'init');\r
-       }\r
-       \r
-       /**\r
-        * Loads cached menu items.\r
-        */\r
-       protected function loadCache() {\r
-               // call loadCache event\r
-               EventHandler::getInstance()->fireAction($this, 'loadCache');\r
-               \r
-               $this->menuItems = array();\r
-       }\r
-       \r
-       /**\r
-        * Checks the options and permissions of given menu item.\r
-        * \r
-        * @param       wcf\system\menu\ITreeMenuItem           $item\r
-        * @return      boolean\r
-        */\r
-       protected function checkMenuItem(ITreeMenuItem $item) {\r
-               // check the options of this item\r
-               $hasEnabledOption = true;\r
-               if (!empty($item->options)) {\r
-                       $hasEnabledOption = false;\r
-                       $options = explode(',', strtoupper($item->options));\r
-                       foreach ($options as $option) {\r
-                               if (defined($option) && constant($option)) {\r
-                                       $hasEnabledOption = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
-               if (!$hasEnabledOption) return false;\r
-               \r
-               // check the permission of this item for the active user\r
-               $hasPermission = true;\r
-               if (!empty($item->permissions)) {\r
-                       $hasPermission = false;\r
-                       $permissions = explode(',', $item->permissions);\r
-                       foreach ($permissions as $permission) {\r
-                               if (WCF::getSession()->getPermission($permission)) {\r
-                                       $hasPermission = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
-               if (!$hasPermission) return false;\r
-               \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Checks the options and permissions of the menu items.\r
-        * \r
-        * @param       string          $parentMenuItem\r
-        */\r
-       protected function checkMenuItems($parentMenuItem = '') {\r
-               if (!isset($this->menuItems[$parentMenuItem])) return;\r
-               \r
-               foreach ($this->menuItems[$parentMenuItem] as $key => $item) {\r
-                       if ($this->checkMenuItem($item)) {\r
-                               // check children\r
-                               $this->checkMenuItems($item->menuItem);\r
-                       }\r
-                       else {\r
-                               // remove this item\r
-                               unset($this->menuItems[$parentMenuItem][$key]);\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Removes items without children.\r
-        * \r
-        * @param       string          $parentMenuItem\r
-        */\r
-       protected function removeEmptyItems($parentMenuItem = '') {\r
-               if (!isset($this->menuItems[$parentMenuItem])) return;\r
-               \r
-               foreach ($this->menuItems[$parentMenuItem] as $key => $item) {\r
-                       $this->removeEmptyItems($item->menuItem);\r
-                       if (empty($item->menuItemLink) && (!isset($this->menuItems[$item->menuItem]) || !count($this->menuItems[$item->menuItem]))) {\r
-                               // remove this item\r
-                               unset($this->menuItems[$parentMenuItem][$key]);\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Builds a plain menu item list.\r
-        * \r
-        * @param       string          $parentMenuItem\r
-        */\r
-       protected function buildMenuItemList($parentMenuItem = '') {\r
-               if (!isset($this->menuItems[$parentMenuItem])) return;\r
-               \r
-               foreach ($this->menuItems[$parentMenuItem] as $key => $item) {\r
-                       $this->menuItemList[$item->menuItem] = $item;\r
-                       $this->buildMenuItemList($item->menuItem);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Sets the active menu item. \r
-        * This should be done before the menu.tpl template calls the function getMenu().\r
-        * \r
-        * This function should be used in each script which uses a template that includes the menu.tpl.\r
-        * \r
-        * @param       string          $menuItem       name of the active menu item\r
-        */\r
-       public function setActiveMenuItem($menuItem) {\r
-               $this->activeMenuItems = array(); \r
-               \r
-               // build active menu list\r
-               while (isset($this->menuItemList[$menuItem])) {\r
-                       $this->activeMenuItems[] = $menuItem;\r
-                       $menuItem = $this->menuItemList[$menuItem]->parentMenuItem;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns a list of the active menu items.\r
-        * \r
-        * @return      array\r
-        */\r
-       public function getActiveMenuItems() {\r
-               return $this->activeMenuItems;\r
-       }\r
-       \r
-       /**\r
-        * Returns the active menu item.\r
-        * \r
-        * @param       integer         $level\r
-        * @return      string\r
-        */\r
-       public function getActiveMenuItem($level = 0) {\r
-               if ($level < count($this->activeMenuItems)) {\r
-                       return $this->activeMenuItems[(count($this->activeMenuItems) - ($level + 1))];\r
-               }\r
-               return null;\r
-       }\r
-       \r
-       /**\r
-        * Returns the list of menu items.\r
-        * \r
-        * @param       string          $parentMenuItem\r
-        * @return      array\r
-        */\r
-       public function getMenuItems($parentMenuItem = null) {\r
-               if ($parentMenuItem === null) return $this->menuItems;\r
-               if (isset($this->menuItems[$parentMenuItem])) return $this->menuItems[$parentMenuItem];\r
-               return array();\r
-       }\r
+<?php
+namespace wcf\system\menu;
+use wcf\system\event\EventHandler;
+use wcf\system\SingletonFactory;
+use wcf\system\WCF;
+use wcf\util\FileUtil;
+
+/**
+ * Basis class for a tree menu.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.menu
+ * @category   Community Framework
+ */
+abstract class TreeMenu extends SingletonFactory {
+       /**
+        * List of visible menu items.
+        * 
+        * @var array
+        */
+       public $menuItemList = array();
+       
+       /**
+        * List of active menu items.
+        * 
+        * @var array
+        */
+       public $activeMenuItems = array();
+       
+       /**
+        * List of all menu items.
+        * 
+        * @var array
+        */
+       public $menuItems = null;
+
+       /**
+        * @see SingletonFactory::init()
+        */
+       protected function init() {
+               // get menu items from cache
+               $this->loadCache();
+               
+               // check menu items
+               $this->checkMenuItems();
+               
+               // remove items without children
+               $this->removeEmptyItems();
+               
+               // build plain menu item list
+               $this->buildMenuItemList();
+               
+               // call init event
+               EventHandler::getInstance()->fireAction($this, 'init');
+       }
+       
+       /**
+        * Loads cached menu items.
+        */
+       protected function loadCache() {
+               // call loadCache event
+               EventHandler::getInstance()->fireAction($this, 'loadCache');
+               
+               $this->menuItems = array();
+       }
+       
+       /**
+        * Checks the options and permissions of given menu item.
+        * 
+        * @param       wcf\system\menu\ITreeMenuItem           $item
+        * @return      boolean
+        */
+       protected function checkMenuItem(ITreeMenuItem $item) {
+               // check the options of this item
+               $hasEnabledOption = true;
+               if (!empty($item->options)) {
+                       $hasEnabledOption = false;
+                       $options = explode(',', strtoupper($item->options));
+                       foreach ($options as $option) {
+                               if (defined($option) && constant($option)) {
+                                       $hasEnabledOption = true;
+                                       break;
+                               }
+                       }
+               }
+               if (!$hasEnabledOption) return false;
+               
+               // check the permission of this item for the active user
+               $hasPermission = true;
+               if (!empty($item->permissions)) {
+                       $hasPermission = false;
+                       $permissions = explode(',', $item->permissions);
+                       foreach ($permissions as $permission) {
+                               if (WCF::getSession()->getPermission($permission)) {
+                                       $hasPermission = true;
+                                       break;
+                               }
+                       }
+               }
+               if (!$hasPermission) return false;
+               
+               return true;
+       }
+       
+       /**
+        * Checks the options and permissions of the menu items.
+        * 
+        * @param       string          $parentMenuItem
+        */
+       protected function checkMenuItems($parentMenuItem = '') {
+               if (!isset($this->menuItems[$parentMenuItem])) return;
+               
+               foreach ($this->menuItems[$parentMenuItem] as $key => $item) {
+                       if ($this->checkMenuItem($item)) {
+                               // check children
+                               $this->checkMenuItems($item->menuItem);
+                       }
+                       else {
+                               // remove this item
+                               unset($this->menuItems[$parentMenuItem][$key]);
+                       }
+               }
+       }
+       
+       /**
+        * Removes items without children.
+        * 
+        * @param       string          $parentMenuItem
+        */
+       protected function removeEmptyItems($parentMenuItem = '') {
+               if (!isset($this->menuItems[$parentMenuItem])) return;
+               
+               foreach ($this->menuItems[$parentMenuItem] as $key => $item) {
+                       $this->removeEmptyItems($item->menuItem);
+                       if (empty($item->menuItemLink) && (!isset($this->menuItems[$item->menuItem]) || !count($this->menuItems[$item->menuItem]))) {
+                               // remove this item
+                               unset($this->menuItems[$parentMenuItem][$key]);
+                       }
+               }
+       }
+       
+       /**
+        * Builds a plain menu item list.
+        * 
+        * @param       string          $parentMenuItem
+        */
+       protected function buildMenuItemList($parentMenuItem = '') {
+               if (!isset($this->menuItems[$parentMenuItem])) return;
+               
+               foreach ($this->menuItems[$parentMenuItem] as $key => $item) {
+                       $this->menuItemList[$item->menuItem] = $item;
+                       $this->buildMenuItemList($item->menuItem);
+               }
+       }
+       
+       /**
+        * Sets the active menu item. 
+        * This should be done before the menu.tpl template calls the function getMenu().
+        * 
+        * This function should be used in each script which uses a template that includes the menu.tpl.
+        * 
+        * @param       string          $menuItem       name of the active menu item
+        */
+       public function setActiveMenuItem($menuItem) {
+               $this->activeMenuItems = array(); 
+               
+               // build active menu list
+               while (isset($this->menuItemList[$menuItem])) {
+                       $this->activeMenuItems[] = $menuItem;
+                       $menuItem = $this->menuItemList[$menuItem]->parentMenuItem;
+               }
+       }
+       
+       /**
+        * Returns a list of the active menu items.
+        * 
+        * @return      array
+        */
+       public function getActiveMenuItems() {
+               return $this->activeMenuItems;
+       }
+       
+       /**
+        * Returns the active menu item.
+        * 
+        * @param       integer         $level
+        * @return      string
+        */
+       public function getActiveMenuItem($level = 0) {
+               if ($level < count($this->activeMenuItems)) {
+                       return $this->activeMenuItems[(count($this->activeMenuItems) - ($level + 1))];
+               }
+               return null;
+       }
+       
+       /**
+        * Returns the list of menu items.
+        * 
+        * @param       string          $parentMenuItem
+        * @return      array
+        */
+       public function getMenuItems($parentMenuItem = null) {
+               if ($parentMenuItem === null) return $this->menuItems;
+               if (isset($this->menuItems[$parentMenuItem])) return $this->menuItems[$parentMenuItem];
+               return array();
+       }
 }
index 21b39c54f395ead31889f87e2eeea29941d0ed53..0f22d036f866be65ea705c0534acd25e0c1e124e 100644 (file)
@@ -1,30 +1,30 @@
-<?php\r
-namespace wcf\system\menu\acp;\r
-use wcf\system\menu\TreeMenu;\r
-use wcf\system\cache\CacheHandler;\r
-\r
-/**\r
- * Builds the acp menu.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.menu.acp\r
- * @category   Community Framework\r
- */\r
-class ACPMenu extends TreeMenu {\r
-       /**\r
-        * @see TreeMenu::loadCache()\r
-        */\r
-       protected function loadCache() {\r
-               parent::loadCache();\r
-               \r
-               if (PACKAGE_ID == 0) {\r
-                       return;\r
-               }\r
-               \r
-               CacheHandler::getInstance()->addResource('menu-'.PACKAGE_ID, WCF_DIR.'cache/cache.menu-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderACPMenu');\r
-               $this->menuItems = CacheHandler::getInstance()->get('menu-'.PACKAGE_ID);\r
-       }\r
-}\r
+<?php
+namespace wcf\system\menu\acp;
+use wcf\system\menu\TreeMenu;
+use wcf\system\cache\CacheHandler;
+
+/**
+ * Builds the acp menu.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.menu.acp
+ * @category   Community Framework
+ */
+class ACPMenu extends TreeMenu {
+       /**
+        * @see TreeMenu::loadCache()
+        */
+       protected function loadCache() {
+               parent::loadCache();
+               
+               if (PACKAGE_ID == 0) {
+                       return;
+               }
+               
+               CacheHandler::getInstance()->addResource('menu-'.PACKAGE_ID, WCF_DIR.'cache/cache.menu-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderACPMenu');
+               $this->menuItems = CacheHandler::getInstance()->get('menu-'.PACKAGE_ID);
+       }
+}
index 31c2f81025e16b685b4c1ea485bc8eee2569a27c..c4a71880ec7eb40656232af92990bf7075f5f1ac 100644 (file)
@@ -1,29 +1,29 @@
-<?php\r
-namespace wcf\system\menu\page;\r
-use wcf\data\DatabaseObjectDecorator;\r
-\r
-/**\r
- * Provides default implementations for page menu item providers.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.menu.page\r
- * @category   Community Framework\r
- */\r
-class DefaultPageMenuItemProvider extends DatabaseObjectDecorator implements IPageMenuItemProvider {\r
-       /**\r
-        * @see wcf\system\menu\page\IPageMenuItemProvider::isVisible()\r
-        */\r
-       public function isVisible() {\r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\menu\page\IPageMenuItemProvider::getNotifications()\r
-        */\r
-       public function getNotifications() {\r
-               return 0;\r
-       }\r
+<?php
+namespace wcf\system\menu\page;
+use wcf\data\DatabaseObjectDecorator;
+
+/**
+ * Provides default implementations for page menu item providers.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.menu.page
+ * @category   Community Framework
+ */
+class DefaultPageMenuItemProvider extends DatabaseObjectDecorator implements IPageMenuItemProvider {
+       /**
+        * @see wcf\system\menu\page\IPageMenuItemProvider::isVisible()
+        */
+       public function isVisible() {
+               return true;
+       }
+       
+       /**
+        * @see wcf\system\menu\page\IPageMenuItemProvider::getNotifications()
+        */
+       public function getNotifications() {
+               return 0;
+       }
 }
index 9e32d06f63a57bf4c7cdd9eacba09ad59d88e545..c82a17f98b493e70a6b0a1e0a24701c8368d7e5b 100644 (file)
@@ -1,29 +1,29 @@
-<?php\r
-namespace wcf\system\menu\page;\r
-use wcf\data\IDatabaseObjectProcessor;\r
-\r
-/**\r
- * Any page menu item provider should implement this interface.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.menu.page\r
- * @category   Community Framework\r
- */\r
-interface IPageMenuItemProvider extends IDatabaseObjectProcessor {\r
-       /**\r
-        * Returns true if the associated menu item should be visible for the active user.\r
-        * \r
-        * @return boolean\r
-        */\r
-       public function isVisible();\r
-       \r
-       /**\r
-        * Returns the number of notifications for the associated menu item.\r
-        * \r
-        * @return boolean\r
-        */\r
-       public function getNotifications();\r
+<?php
+namespace wcf\system\menu\page;
+use wcf\data\IDatabaseObjectProcessor;
+
+/**
+ * Any page menu item provider should implement this interface.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.menu.page
+ * @category   Community Framework
+ */
+interface IPageMenuItemProvider extends IDatabaseObjectProcessor {
+       /**
+        * Returns true if the associated menu item should be visible for the active user.
+        * 
+        * @return boolean
+        */
+       public function isVisible();
+       
+       /**
+        * Returns the number of notifications for the associated menu item.
+        * 
+        * @return boolean
+        */
+       public function getNotifications();
 }
index 9de034832800032f48957c103b5e6fdec8614fd5..4e3c08d102cf8ca9a36f7d4002002bbc20480243 100644 (file)
@@ -1,38 +1,38 @@
-<?php\r
-namespace wcf\system\menu\page;\r
-use wcf\data\page\menu\item\PageMenuItem;\r
-use wcf\system\menu\TreeMenu;\r
-use wcf\system\menu\ITreeMenuItem;\r
-use wcf\system\cache\CacheHandler;\r
-\r
-/**\r
- * Builds the page menu.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.menu.page\r
- * @category   Community Framework\r
- */\r
-class PageMenu extends TreeMenu {\r
-       /**\r
-        * @see wcf\system\menu\TreeMenu::loadCache()\r
-        */\r
-       protected function loadCache() {\r
-               parent::loadCache();\r
-               \r
-               // get cache\r
-               CacheHandler::getInstance()->addResource('pageMenu-'.PACKAGE_ID, WCF_DIR.'cache/cache.pageMenu-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderPageMenu');\r
-               $this->menuItems = CacheHandler::getInstance()->get('pageMenu-'.PACKAGE_ID);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\menu\TreeMenu::checkMenuItem()\r
-        */\r
-       protected function checkMenuItem(ITreeMenuItem $item) {\r
-               if (!parent::checkMenuItem($item)) return false;\r
-               \r
-               return $item->getProcessor()->isVisible();\r
-       }\r
-}\r
+<?php
+namespace wcf\system\menu\page;
+use wcf\data\page\menu\item\PageMenuItem;
+use wcf\system\menu\TreeMenu;
+use wcf\system\menu\ITreeMenuItem;
+use wcf\system\cache\CacheHandler;
+
+/**
+ * Builds the page menu.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.menu.page
+ * @category   Community Framework
+ */
+class PageMenu extends TreeMenu {
+       /**
+        * @see wcf\system\menu\TreeMenu::loadCache()
+        */
+       protected function loadCache() {
+               parent::loadCache();
+               
+               // get cache
+               CacheHandler::getInstance()->addResource('pageMenu-'.PACKAGE_ID, WCF_DIR.'cache/cache.pageMenu-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderPageMenu');
+               $this->menuItems = CacheHandler::getInstance()->get('pageMenu-'.PACKAGE_ID);
+       }
+       
+       /**
+        * @see wcf\system\menu\TreeMenu::checkMenuItem()
+        */
+       protected function checkMenuItem(ITreeMenuItem $item) {
+               if (!parent::checkMenuItem($item)) return false;
+               
+               return $item->getProcessor()->isVisible();
+       }
+}
index fbf3b264877cba0c64f1adb0fe93dc557f9020be..9ec93a3923f7ea39a433841c5b410996a21a6821 100644 (file)
@@ -1,42 +1,42 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-\r
-/**\r
- * Any option type should implement this interface.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-interface IOptionType {\r
-       /**\r
-        * Returns the html code for the form element of this option.\r
-        * \r
-        * @param       Option          $option\r
-        * @param       mixed           $value\r
-        * @return      string          html\r
-        */\r
-       public function getFormElement(Option $option, $value);\r
-       \r
-       /**\r
-        * Validates the form input for this option.\r
-        * Throws an exception, if validation fails.\r
-        * \r
-        * @param       Option          $option\r
-        * @param       string          $newValue\r
-        */\r
-       public function validate(Option $option, $newValue);\r
-       \r
-       /**\r
-        * Returns the value of this option for saving in the database.\r
-        * \r
-        * @param       Option          $option\r
-        * @param       string          $newValue\r
-        * @return      string\r
-        */\r
-       public function getData(Option $option, $newValue);\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+
+/**
+ * Any option type should implement this interface.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+interface IOptionType {
+       /**
+        * Returns the html code for the form element of this option.
+        * 
+        * @param       Option          $option
+        * @param       mixed           $value
+        * @return      string          html
+        */
+       public function getFormElement(Option $option, $value);
+       
+       /**
+        * Validates the form input for this option.
+        * Throws an exception, if validation fails.
+        * 
+        * @param       Option          $option
+        * @param       string          $newValue
+        */
+       public function validate(Option $option, $newValue);
+       
+       /**
+        * Returns the value of this option for saving in the database.
+        * 
+        * @param       Option          $option
+        * @param       string          $newValue
+        * @return      string
+        */
+       public function getData(Option $option, $newValue);
 }
index 85434c8ec34130d596ae0bab3bc08db063ea1504..fe8940e5c78bdf8d2cdc2c897df0277d71920985 100644 (file)
@@ -1,35 +1,35 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-\r
-/**\r
- * Any searchable option type should implement this interface.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-interface ISearchableUserOption {\r
-       /**\r
-        * Returns the html code for the search form element of this option.\r
-        * \r
-        * @param       wcf\data\option\Option  $option\r
-        * @param       string          $value\r
-        * @return      string          html\r
-        */\r
-       public function getSearchFormElement(Option $option, $value);\r
-       \r
-       /**\r
-        * Returns a condition for search sql query.\r
-        * \r
-        * @param       wcf\system\database\condition\PreparedStatementConditionBuilder $conditions\r
-        * @param       wcf\data\option\Option  $option\r
-        * @param       string          $value\r
-        * @param       boolean\r
-        */\r
-       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value);\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+
+/**
+ * Any searchable option type should implement this interface.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+interface ISearchableUserOption {
+       /**
+        * Returns the html code for the search form element of this option.
+        * 
+        * @param       wcf\data\option\Option  $option
+        * @param       string          $value
+        * @return      string          html
+        */
+       public function getSearchFormElement(Option $option, $value);
+       
+       /**
+        * Returns a condition for search sql query.
+        * 
+        * @param       wcf\system\database\condition\PreparedStatementConditionBuilder $conditions
+        * @param       wcf\data\option\Option  $option
+        * @param       string          $value
+        * @param       boolean
+        */
+       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value);
 }
index 5fad0b08ff0d54cb3a78d8429fafea37761d513b..09266fcc9f464dc3d59ece715c454d06d9d93269 100644 (file)
@@ -1,64 +1,64 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * OptionTypeBoolean is an implementation of OptionType for boolean values.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeBoolean implements IOptionType, ISearchableUserOption {\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(Option $option, $value) {\r
-               $options = Option::parseEnableOptions($option->enableOptions);\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'disableOptions' => $options['disableOptions'],\r
-                       'enableOptions' => $options['enableOptions'],\r
-                       'option' => $option,\r
-                       'value' => $value\r
-               ));\r
-               return WCF::getTPL()->fetch('optionTypeBoolean');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::validate()\r
-        */\r
-       public function validate(Option $option, $newValue) {}\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(Option $option, $newValue) {\r
-               if ($newValue !== null) return 1;\r
-               return 0;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
-        */\r
-       public function getSearchFormElement(Option $option, $value) {\r
-               return $this->getFormElement($option, $value);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getCondition()\r
-        */\r
-       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
-               $value = intval($value);\r
-               if (!$value) return false;\r
-               \r
-               $conditions->add("option_value.userOption".$option->optionID." = ?", array(1));\r
-               return true;\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * OptionTypeBoolean is an implementation of OptionType for boolean values.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeBoolean implements IOptionType, ISearchableUserOption {
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(Option $option, $value) {
+               $options = Option::parseEnableOptions($option->enableOptions);
+               
+               WCF::getTPL()->assign(array(
+                       'disableOptions' => $options['disableOptions'],
+                       'enableOptions' => $options['enableOptions'],
+                       'option' => $option,
+                       'value' => $value
+               ));
+               return WCF::getTPL()->fetch('optionTypeBoolean');
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::validate()
+        */
+       public function validate(Option $option, $newValue) {}
+       
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(Option $option, $newValue) {
+               if ($newValue !== null) return 1;
+               return 0;
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+        */
+       public function getSearchFormElement(Option $option, $value) {
+               return $this->getFormElement($option, $value);
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getCondition()
+        */
+       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+               $value = intval($value);
+               if (!$value) return false;
+               
+               $conditions->add("option_value.userOption".$option->optionID." = ?", array(1));
+               return true;
+       }
 }
index 4f95ee15d58246032cd22e35d73cad4984045d58..f7549ea375ded71d53533a6745d8afe0477f58d3 100644 (file)
@@ -1,46 +1,46 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionTypeSelect;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * OptionTypeSelect is an implementation of OptionType for 'select' tags with a text field for custom inputs.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeCustomselect extends OptionTypeSelect {\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(Option $option, $value) {\r
-               WCF::getTPL()->assign(array(\r
-                       'option' => $option,\r
-                       'selectOptions' => $option->parseSelectOptions(),\r
-                       'value' => $value,\r
-                       'customValue' => (!isset($options[$value]) ? $value : '')\r
-               ));\r
-               \r
-               return WCF::getTPL()->fetch('optionTypeCustomselect');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::validate()\r
-        */\r
-       public function validate(Option $option, $newValue) {}\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(Option $option, $newValue) {\r
-               if (empty($newValue) && isset($_POST['values'][$option->optionName.'_custom'])) {\r
-                       return $_POST['values'][$option->optionName.'_custom'];\r
-               }\r
-               return $newValue;\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionTypeSelect;
+use wcf\system\WCF;
+
+/**
+ * OptionTypeSelect is an implementation of OptionType for 'select' tags with a text field for custom inputs.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeCustomselect extends OptionTypeSelect {
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(Option $option, $value) {
+               WCF::getTPL()->assign(array(
+                       'option' => $option,
+                       'selectOptions' => $option->parseSelectOptions(),
+                       'value' => $value,
+                       'customValue' => (!isset($options[$value]) ? $value : '')
+               ));
+               
+               return WCF::getTPL()->fetch('optionTypeCustomselect');
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::validate()
+        */
+       public function validate(Option $option, $newValue) {}
+       
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(Option $option, $newValue) {
+               if (empty($newValue) && isset($_POST['values'][$option->optionName.'_custom'])) {
+                       return $_POST['values'][$option->optionName.'_custom'];
+               }
+               return $newValue;
+       }
 }
index 5891a816727711ca390c34fa319439be7f573d5a..2569a94b78077b36e3f88cafae95b313398e33e1 100644 (file)
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\option\OptionType;\r
-use wcf\system\option\SearchableUserOption;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * OptionTypeDate is an implementation of OptionType for date inputs.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeDate implements IOptionType, ISearchableUserOption {\r
-       protected $yearRequired = true;\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(array &$optionData) {\r
-               if (!isset($optionData['optionValue'])) {\r
-                       if (isset($optionData['defaultValue'])) $optionData['optionValue'] = $optionData['defaultValue'];\r
-                       else $optionData['optionValue'] = '';\r
-               }\r
-               $optionData['isOptionGroup'] = true;\r
-               $optionData['divClass'] = 'formDate';\r
-               \r
-               $year = $month = $day = '';\r
-               $optionValue = explode('-', (is_array($optionData['optionValue']) ? implode('-', $optionData['optionValue']) : $optionData['optionValue']));\r
-               if (isset($optionValue[0])) $year = intval($optionValue[0]);\r
-               if (empty($year)) $year = '';\r
-               if (isset($optionValue[1])) $month = $optionValue[1];\r
-               if (isset($optionValue[2])) $day = $optionValue[2];\r
-               $dateInputOrder = explode('-', WCF::getLanguage()->get('wcf.global.dateInputOrder'));\r
-               \r
-               // generate days\r
-               $days = array();\r
-               $days[0] = '';\r
-               for ($i = 1; $i < 32; $i++) {\r
-                       $days[$i] = $i;         \r
-               }\r
-               \r
-               // generate months\r
-               $months = array();\r
-               $months[0] = '';\r
-               // TODO: $dateFormatLocalized is no longer available, fix this!\r
-               $monthFormat = (Language::$dateFormatLocalized ? '%B' : '%m');\r
-               for ($i = 1; $i < 13; $i++) {\r
-                       $months[$i] = DateUtil::formatDate($monthFormat, gmmktime(0, 0, 0, $i, 10, 2006), false, true);\r
-               }\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'year' => $year,\r
-                       'month' => $month,\r
-                       'day' => $day,\r
-                       'days' => $days,\r
-                       'months' => $months,\r
-                       'optionData' => $optionData,\r
-                       'dateInputOrder' => $dateInputOrder,\r
-                       'yearRequired' => $this->yearRequired\r
-               ));\r
-               return WCF::getTPL()->fetch('optionTypeDate');\r
-       }\r
-       \r
-       /**\r
-        * Formats the user input.\r
-        * \r
-        * @param       array           $newValue\r
-        */\r
-       protected function getValue(array &$newValue) {\r
-               if (isset($newValue['year'])) $newValue['year'] = intval($newValue['year']);\r
-               else $newValue['year'] = 0;\r
-               if (isset($newValue['month'])) $newValue['month'] = intval($newValue['month']);\r
-               else $newValue['month'] = 0;\r
-               if (isset($newValue['day'])) $newValue['day'] = intval($newValue['day']);\r
-               else $newValue['day'] = 0;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::validate()\r
-        */\r
-       public function validate(array $optionData, $newValue) {\r
-               $this->getValue($newValue);\r
-               \r
-               if ($newValue['year'] || $newValue['month'] || $newValue['day']) {\r
-                       if (strlen($newValue['year']) == 2) {\r
-                               $newValue['year'] = '19'.$newValue['year'];\r
-                       }\r
-                       \r
-                       if (!checkdate(intval($newValue['month']), intval($newValue['day']), ((!$this->yearRequired && !$newValue['year']) ? 2000 : intval($newValue['year'])))) {\r
-                               throw new UserInputException($optionData['optionName'], 'validationFailed');\r
-                       }\r
-                       if (($newValue['year'] || $this->yearRequired) && ((strlen($newValue['year']) != 4 && strlen($newValue['year']) != 2) || $newValue['year'] < 1902)) {\r
-                               throw new UserInputException($optionData['optionName'], 'validationFailed');\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(array $optionData, $newValue) {\r
-               $this->getValue($newValue);\r
-               \r
-               if ($newValue['year'] || $newValue['month'] || $newValue['day']) {\r
-                       if ($newValue['month'] < 10) $newValue['month'] = '0'.$newValue['month'];\r
-                       if ($newValue['day'] < 10) $newValue['day'] = '0'.$newValue['day'];\r
-                       if (strlen($newValue['year']) == 2) {\r
-                               $newValue['year'] = '19'.$newValue['year'];\r
-                       }\r
-                       if (!$this->yearRequired && strlen($newValue['year']) < 2) {\r
-                               $newValue['year'] = '0000';\r
-                       }\r
-                       return $newValue['year'].'-'.$newValue['month'].'-'.$newValue['day'];\r
-               }\r
-               \r
-               return '';\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
-        */\r
-       public function getSearchFormElement(array &$optionData) {\r
-               return $this->getFormElement($optionData);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getCondition()\r
-        */\r
-       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
-               $value = $this->getData($optionData, $value);\r
-               if ($value == '') return false;\r
-               \r
-               $conditions->add("option_value.userOption".$option->optionID." = ?", array($value));\r
-               return true;\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\UserInputException;
+use wcf\system\option\OptionType;
+use wcf\system\option\SearchableUserOption;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+
+/**
+ * OptionTypeDate is an implementation of OptionType for date inputs.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeDate implements IOptionType, ISearchableUserOption {
+       protected $yearRequired = true;
+       
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(array &$optionData) {
+               if (!isset($optionData['optionValue'])) {
+                       if (isset($optionData['defaultValue'])) $optionData['optionValue'] = $optionData['defaultValue'];
+                       else $optionData['optionValue'] = '';
+               }
+               $optionData['isOptionGroup'] = true;
+               $optionData['divClass'] = 'formDate';
+               
+               $year = $month = $day = '';
+               $optionValue = explode('-', (is_array($optionData['optionValue']) ? implode('-', $optionData['optionValue']) : $optionData['optionValue']));
+               if (isset($optionValue[0])) $year = intval($optionValue[0]);
+               if (empty($year)) $year = '';
+               if (isset($optionValue[1])) $month = $optionValue[1];
+               if (isset($optionValue[2])) $day = $optionValue[2];
+               $dateInputOrder = explode('-', WCF::getLanguage()->get('wcf.global.dateInputOrder'));
+               
+               // generate days
+               $days = array();
+               $days[0] = '';
+               for ($i = 1; $i < 32; $i++) {
+                       $days[$i] = $i;         
+               }
+               
+               // generate months
+               $months = array();
+               $months[0] = '';
+               // TODO: $dateFormatLocalized is no longer available, fix this!
+               $monthFormat = (Language::$dateFormatLocalized ? '%B' : '%m');
+               for ($i = 1; $i < 13; $i++) {
+                       $months[$i] = DateUtil::formatDate($monthFormat, gmmktime(0, 0, 0, $i, 10, 2006), false, true);
+               }
+               
+               WCF::getTPL()->assign(array(
+                       'year' => $year,
+                       'month' => $month,
+                       'day' => $day,
+                       'days' => $days,
+                       'months' => $months,
+                       'optionData' => $optionData,
+                       'dateInputOrder' => $dateInputOrder,
+                       'yearRequired' => $this->yearRequired
+               ));
+               return WCF::getTPL()->fetch('optionTypeDate');
+       }
+       
+       /**
+        * Formats the user input.
+        * 
+        * @param       array           $newValue
+        */
+       protected function getValue(array &$newValue) {
+               if (isset($newValue['year'])) $newValue['year'] = intval($newValue['year']);
+               else $newValue['year'] = 0;
+               if (isset($newValue['month'])) $newValue['month'] = intval($newValue['month']);
+               else $newValue['month'] = 0;
+               if (isset($newValue['day'])) $newValue['day'] = intval($newValue['day']);
+               else $newValue['day'] = 0;
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::validate()
+        */
+       public function validate(array $optionData, $newValue) {
+               $this->getValue($newValue);
+               
+               if ($newValue['year'] || $newValue['month'] || $newValue['day']) {
+                       if (strlen($newValue['year']) == 2) {
+                               $newValue['year'] = '19'.$newValue['year'];
+                       }
+                       
+                       if (!checkdate(intval($newValue['month']), intval($newValue['day']), ((!$this->yearRequired && !$newValue['year']) ? 2000 : intval($newValue['year'])))) {
+                               throw new UserInputException($optionData['optionName'], 'validationFailed');
+                       }
+                       if (($newValue['year'] || $this->yearRequired) && ((strlen($newValue['year']) != 4 && strlen($newValue['year']) != 2) || $newValue['year'] < 1902)) {
+                               throw new UserInputException($optionData['optionName'], 'validationFailed');
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(array $optionData, $newValue) {
+               $this->getValue($newValue);
+               
+               if ($newValue['year'] || $newValue['month'] || $newValue['day']) {
+                       if ($newValue['month'] < 10) $newValue['month'] = '0'.$newValue['month'];
+                       if ($newValue['day'] < 10) $newValue['day'] = '0'.$newValue['day'];
+                       if (strlen($newValue['year']) == 2) {
+                               $newValue['year'] = '19'.$newValue['year'];
+                       }
+                       if (!$this->yearRequired && strlen($newValue['year']) < 2) {
+                               $newValue['year'] = '0000';
+                       }
+                       return $newValue['year'].'-'.$newValue['month'].'-'.$newValue['day'];
+               }
+               
+               return '';
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+        */
+       public function getSearchFormElement(array &$optionData) {
+               return $this->getFormElement($optionData);
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getCondition()
+        */
+       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+               $value = $this->getData($optionData, $value);
+               if ($value == '') return false;
+               
+               $conditions->add("option_value.userOption".$option->optionID." = ?", array($value));
+               return true;
+       }
 }
index 60cb488dbe8869d9eff23b21ff1551f78125dcaa..26be493e201cc87bd7fdda8325af25cb47c724bb 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionTypeText;\r
-\r
-/**\r
- * OptionTypeText is an implementation of OptionType for integer fields.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeInteger extends OptionTypeText {\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(Option $option, $newValue) {\r
-               return intval($newValue);\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionTypeText;
+
+/**
+ * OptionTypeText is an implementation of OptionType for integer fields.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeInteger extends OptionTypeText {
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(Option $option, $newValue) {
+               return intval($newValue);
+       }
 }
index b361a27389dbd4c8300b1fcb2dcc23a80ca39fce..4bd0fe8b666311e8d5713bc77f5bb80c4e266e3e 100644 (file)
@@ -1,82 +1,82 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\option\OptionTypeSelect;\r
-use wcf\system\option\SearchableUserOption;\r
-use wcf\system\WCF;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\OptionUtil;\r
-\r
-/**\r
- * OptionTypeSelect is an implementation of OptionType for multiple 'select' tags.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeMultiselect extends OptionTypeSelect {\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(array &$optionData) {\r
-               if (!isset($optionData['optionValue'])) {\r
-                       if (isset($optionData['defaultValue'])) $optionData['optionValue'] = explode("\n", $optionData['defaultValue']);\r
-                       else $optionData['optionValue'] = array();\r
-               }\r
-               else if (!is_array($optionData['optionValue'])) {\r
-                       $optionData['optionValue'] = explode("\n", $optionData['optionValue']);\r
-               }\r
-               \r
-               // get options\r
-               $options = OptionUtil::parseSelectOptions($optionData['selectOptions']);\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'optionData' => $optionData,\r
-                       'options' => $options\r
-               ));\r
-               return WCF::getTPL()->fetch('optionTypeMultiselect');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::validate()\r
-        */\r
-       public function validate(array $optionData, $newValue) {\r
-               if (!is_array($newValue)) $newValue = array();\r
-               $options = OptionUtil::parseSelectOptions($optionData['selectOptions']);\r
-               foreach ($newValue as $value) {\r
-                       if (!isset($options[$value])) throw new UserInputException($optionData['optionName'], 'validationFailed');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(array $optionData, $newValue) {\r
-               if (!is_array($newValue)) $newValue = array();\r
-               return implode("\n", $newValue);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
-        */\r
-       public function getSearchFormElement(array &$optionData) {\r
-               return $this->getFormElement($optionData);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getCondition()\r
-        */\r
-       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $options, $value) {\r
-               if (!is_array($value) || !count($value)) return false;\r
-               $value = ArrayUtil::trim($value);\r
-               if (!count($value)) return false;\r
-               \r
-               $conditions->add("option_value.userOption".$option->optionID." = ?", array(implode("\n", $value)));\r
-               return true;\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\option\OptionTypeSelect;
+use wcf\system\option\SearchableUserOption;
+use wcf\system\WCF;
+use wcf\system\exception\UserInputException;
+use wcf\util\ArrayUtil;
+use wcf\util\OptionUtil;
+
+/**
+ * OptionTypeSelect is an implementation of OptionType for multiple 'select' tags.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeMultiselect extends OptionTypeSelect {
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(array &$optionData) {
+               if (!isset($optionData['optionValue'])) {
+                       if (isset($optionData['defaultValue'])) $optionData['optionValue'] = explode("\n", $optionData['defaultValue']);
+                       else $optionData['optionValue'] = array();
+               }
+               else if (!is_array($optionData['optionValue'])) {
+                       $optionData['optionValue'] = explode("\n", $optionData['optionValue']);
+               }
+               
+               // get options
+               $options = OptionUtil::parseSelectOptions($optionData['selectOptions']);
+               
+               WCF::getTPL()->assign(array(
+                       'optionData' => $optionData,
+                       'options' => $options
+               ));
+               return WCF::getTPL()->fetch('optionTypeMultiselect');
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::validate()
+        */
+       public function validate(array $optionData, $newValue) {
+               if (!is_array($newValue)) $newValue = array();
+               $options = OptionUtil::parseSelectOptions($optionData['selectOptions']);
+               foreach ($newValue as $value) {
+                       if (!isset($options[$value])) throw new UserInputException($optionData['optionName'], 'validationFailed');
+               }
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(array $optionData, $newValue) {
+               if (!is_array($newValue)) $newValue = array();
+               return implode("\n", $newValue);
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+        */
+       public function getSearchFormElement(array &$optionData) {
+               return $this->getFormElement($optionData);
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getCondition()
+        */
+       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $options, $value) {
+               if (!is_array($value) || !count($value)) return false;
+               $value = ArrayUtil::trim($value);
+               if (!count($value)) return false;
+               
+               $conditions->add("option_value.userOption".$option->optionID." = ?", array(implode("\n", $value)));
+               return true;
+       }
 }
index 23eb3693968041e5ed38e6394c8e25f9fce29a78..0ccdc63284faaff90850d2af0a4d7e65a6c2ba14 100644 (file)
@@ -1,29 +1,29 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\option\OptionTypeText;\r
-\r
-/**\r
- * OptionTypeText is an implementation of OptionType for 'input type="password"' tags.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypePassword extends OptionTypeText {\r
-       /**\r
-        * @see OptionTypeText::$inputType\r
-        */\r
-       protected $inputType = 'password';\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getCondition()\r
-        */\r
-       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
-               return false;\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\option\OptionTypeText;
+
+/**
+ * OptionTypeText is an implementation of OptionType for 'input type="password"' tags.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypePassword extends OptionTypeText {
+       /**
+        * @see OptionTypeText::$inputType
+        */
+       protected $inputType = 'password';
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getCondition()
+        */
+       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+               return false;
+       }
 }
index 7271cfeae2dc47d50ef30b77e758e1a01da310aa..ed8d524bc8c5a47e7ff9bf467842d7ea450bf33d 100644 (file)
@@ -1,90 +1,90 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\option\OptionType;\r
-use wcf\system\option\SearchableUserOption;\r
-use wcf\system\WCF;\r
-use wcf\system\UserInputException;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * OptionTypeRadiobuttons is an implementation of OptionType for 'input type="radio"' tags.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeRadiobuttons implements IOptionType, ISearchableUserOption {\r
-       public $templateName = 'optionTypeRadiobuttons';\r
-\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(Option $option, $value) {\r
-               // get options\r
-               $selectOptions = $option->parseSelectOptions();\r
-\r
-               $availableOptions = $option->parseMultipleEnableOptions();\r
-               $options = array(\r
-                       'disableOptions' => array(),\r
-                       'enableOptions' => array()\r
-               );\r
-               \r
-               foreach ($availableOptions as $key => $enableOptions) {\r
-                       $optionData = Option::parseEnableOptions($enableOptions);\r
-                       \r
-                       $options['disableOptions'][$key] = $optionData['disableOptions'];\r
-                       $options['enableOptions'][$key] = $optionData['enableOptions'];\r
-               }\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'disableOptions' => $options['disableOptions'],\r
-                       'enableOptions' => $options['enableOptions'],\r
-                       'option' => $option,\r
-                       'selectOptions' => $selectOptions,\r
-                       'value' => $value\r
-               ));\r
-               return WCF::getTPL()->fetch($this->templateName);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::validate()\r
-        */\r
-       public function validate(Option $option, $newValue) {\r
-               if (!empty($newValue)) {\r
-                       $options = $option->parseSelectOptions();\r
-                       if (!isset($options[$newValue])) {\r
-                               throw new UserInputException($option->optionName, 'validationFailed');\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(Option $option, $newValue) {\r
-               return $newValue;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
-        */\r
-       public function getSearchFormElement(Option $option, $value) {\r
-               return $this->getFormElement($optionData, $value);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getCondition()\r
-        */\r
-       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
-               $value = StringUtil::trim($value);\r
-               if (!$value) return false;\r
-               \r
-               $conditions->add("option_value.userOption".$option->optionID." = ?", array($value));\r
-               return true;\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\option\OptionType;
+use wcf\system\option\SearchableUserOption;
+use wcf\system\WCF;
+use wcf\system\UserInputException;
+use wcf\util\StringUtil;
+
+/**
+ * OptionTypeRadiobuttons is an implementation of OptionType for 'input type="radio"' tags.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeRadiobuttons implements IOptionType, ISearchableUserOption {
+       public $templateName = 'optionTypeRadiobuttons';
+
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(Option $option, $value) {
+               // get options
+               $selectOptions = $option->parseSelectOptions();
+
+               $availableOptions = $option->parseMultipleEnableOptions();
+               $options = array(
+                       'disableOptions' => array(),
+                       'enableOptions' => array()
+               );
+               
+               foreach ($availableOptions as $key => $enableOptions) {
+                       $optionData = Option::parseEnableOptions($enableOptions);
+                       
+                       $options['disableOptions'][$key] = $optionData['disableOptions'];
+                       $options['enableOptions'][$key] = $optionData['enableOptions'];
+               }
+               
+               WCF::getTPL()->assign(array(
+                       'disableOptions' => $options['disableOptions'],
+                       'enableOptions' => $options['enableOptions'],
+                       'option' => $option,
+                       'selectOptions' => $selectOptions,
+                       'value' => $value
+               ));
+               return WCF::getTPL()->fetch($this->templateName);
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::validate()
+        */
+       public function validate(Option $option, $newValue) {
+               if (!empty($newValue)) {
+                       $options = $option->parseSelectOptions();
+                       if (!isset($options[$newValue])) {
+                               throw new UserInputException($option->optionName, 'validationFailed');
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(Option $option, $newValue) {
+               return $newValue;
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+        */
+       public function getSearchFormElement(Option $option, $value) {
+               return $this->getFormElement($optionData, $value);
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getCondition()
+        */
+       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+               $value = StringUtil::trim($value);
+               if (!$value) return false;
+               
+               $conditions->add("option_value.userOption".$option->optionID." = ?", array($value));
+               return true;
+       }
 }
index 854bc8047c65008a47b484dda55c5d06728f2559..a6377e35f0b9956de4e44ed589ab293b0a825114 100644 (file)
@@ -1,74 +1,74 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionTypeRadiobuttons;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * OptionTypeSelect is an implementation of OptionType for 'select' tags.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeSelect extends OptionTypeRadiobuttons {\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(Option $option, $value) {\r
-               // get options\r
-               $options = $this->parseEnableOptions($option);\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'disableOptions' => $options['disableOptions'],\r
-                       'enableOptions' => $options['enableOptions'],\r
-                       'option' => $option,\r
-                       'selectOptions' => $option->parseSelectOptions(),\r
-                       'value' => $value\r
-               ));\r
-               return WCF::getTPL()->fetch('optionTypeSelect');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
-        */\r
-       public function getSearchFormElement(Option $option, $value) {\r
-               return $this->getFormElement($optionData, $value);\r
-       }\r
-       \r
-       /**\r
-        * @todo        This is not really tested yet!\r
-        * @param       Option          $option\r
-        * @return      array\r
-        */\r
-       protected function parseEnableOptions(Option $option) {\r
-               $disableOptions = $enableOptions = '';\r
-               \r
-               if (!empty($option->enableOptions)) {\r
-                       $options = $option->parseMultipleEnableOptions();\r
-                       \r
-                       foreach ($options as $key => $optionData) {\r
-                               $tmp = explode(',', $optionData);\r
-                               \r
-                               foreach ($optionData as $item) {\r
-                                       if ($item{0} == '!') {\r
-                                               if (!empty($disableOptions)) $disableOptions .= ',';\r
-                                               $disableOptions .= "{ value: '".$key."', option: '".StringUtil::substring($item, 1)."' }";\r
-                                       }\r
-                                       else {\r
-                                               if (!empty($enableOptions)) $enableOptions .= ',';\r
-                                               $enableOptions .= "{ value: '".$key."', option: '".$item."' }";\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               return array(\r
-                       'disableOptions' => $disableOptions,\r
-                       'enableOptions' => $enableOptions\r
-               );\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionTypeRadiobuttons;
+use wcf\system\WCF;
+
+/**
+ * OptionTypeSelect is an implementation of OptionType for 'select' tags.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeSelect extends OptionTypeRadiobuttons {
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(Option $option, $value) {
+               // get options
+               $options = $this->parseEnableOptions($option);
+               
+               WCF::getTPL()->assign(array(
+                       'disableOptions' => $options['disableOptions'],
+                       'enableOptions' => $options['enableOptions'],
+                       'option' => $option,
+                       'selectOptions' => $option->parseSelectOptions(),
+                       'value' => $value
+               ));
+               return WCF::getTPL()->fetch('optionTypeSelect');
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+        */
+       public function getSearchFormElement(Option $option, $value) {
+               return $this->getFormElement($optionData, $value);
+       }
+       
+       /**
+        * @todo        This is not really tested yet!
+        * @param       Option          $option
+        * @return      array
+        */
+       protected function parseEnableOptions(Option $option) {
+               $disableOptions = $enableOptions = '';
+               
+               if (!empty($option->enableOptions)) {
+                       $options = $option->parseMultipleEnableOptions();
+                       
+                       foreach ($options as $key => $optionData) {
+                               $tmp = explode(',', $optionData);
+                               
+                               foreach ($optionData as $item) {
+                                       if ($item{0} == '!') {
+                                               if (!empty($disableOptions)) $disableOptions .= ',';
+                                               $disableOptions .= "{ value: '".$key."', option: '".StringUtil::substring($item, 1)."' }";
+                                       }
+                                       else {
+                                               if (!empty($enableOptions)) $enableOptions .= ',';
+                                               $enableOptions .= "{ value: '".$key."', option: '".$item."' }";
+                                       }
+                               }
+                       }
+               }
+               
+               return array(
+                       'disableOptions' => $disableOptions,
+                       'enableOptions' => $enableOptions
+               );
+       }
 }
index 9d3c985358723dfa7d779da2f3818401f336e9bf..c555aaf7f03d2ad865d1f1a0eb7f90f0aa11b2fa 100644 (file)
@@ -1,68 +1,68 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\option\OptionType;\r
-use wcf\system\option\SearchableUserOption;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * OptionTypeText is an implementation of OptionType for 'input type="text"' tags.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeText implements IOptionType, ISearchableUserOption {\r
-       /**\r
-        * input type\r
-        * @var string\r
-        */\r
-       protected $inputType = 'text';\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(Option $option, $value) {\r
-               WCF::getTPL()->assign(array(\r
-                       'option' => $option,\r
-                       'inputType' => $this->inputType,\r
-                       'value' => $value\r
-               ));\r
-               return WCF::getTPL()->fetch('optionTypeText');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::validate()\r
-        */\r
-       public function validate(Option $option, $newValue) {}\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(Option $option, $newValue) {\r
-               return $newValue;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
-        */\r
-       public function getSearchFormElement(Option $option, $value) {\r
-               return $this->getFormElement($optionData, $value);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\ISearchableUserOption::getCondition()\r
-        */\r
-       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
-               $value = StringUtil::trim($value);\r
-               if (empty($value)) return false;\r
-               \r
-               $conditions->add("option_value.userOption".$option->optionID." LIKE ?", array('%'.addcslashes($value, '_%').'%'));\r
-               return true;\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\option\OptionType;
+use wcf\system\option\SearchableUserOption;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * OptionTypeText is an implementation of OptionType for 'input type="text"' tags.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeText implements IOptionType, ISearchableUserOption {
+       /**
+        * input type
+        * @var string
+        */
+       protected $inputType = 'text';
+       
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(Option $option, $value) {
+               WCF::getTPL()->assign(array(
+                       'option' => $option,
+                       'inputType' => $this->inputType,
+                       'value' => $value
+               ));
+               return WCF::getTPL()->fetch('optionTypeText');
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::validate()
+        */
+       public function validate(Option $option, $newValue) {}
+       
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(Option $option, $newValue) {
+               return $newValue;
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+        */
+       public function getSearchFormElement(Option $option, $value) {
+               return $this->getFormElement($optionData, $value);
+       }
+       
+       /**
+        * @see wcf\system\option\ISearchableUserOption::getCondition()
+        */
+       public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+               $value = StringUtil::trim($value);
+               if (empty($value)) return false;
+               
+               $conditions->add("option_value.userOption".$option->optionID." LIKE ?", array('%'.addcslashes($value, '_%').'%'));
+               return true;
+       }
 }
index 90afe6d216b032ecae50117a59ac8864f207e408..87a39ba2d6e1bcc7883b4ad3a52d6664fd3c7703 100644 (file)
@@ -1,28 +1,28 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionTypeText;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * OptionTypeTextarea is an implementation of OptionType for 'textarea' tags.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeTextarea extends OptionTypeText {\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(Option $option, $value) {\r
-               WCF::getTPL()->assign(array(\r
-                       'option' => $option,\r
-                       'value' => $value\r
-               ));\r
-               return WCF::getTPL()->fetch('optionTypeTextarea');\r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionTypeText;
+use wcf\system\WCF;
+
+/**
+ * OptionTypeTextarea is an implementation of OptionType for 'textarea' tags.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeTextarea extends OptionTypeText {
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(Option $option, $value) {
+               WCF::getTPL()->assign(array(
+                       'option' => $option,
+                       'value' => $value
+               ));
+               return WCF::getTPL()->fetch('optionTypeTextarea');
+       }
 }
index 3ef58beabddae75c662d8924e171ff994dcb5255..2b3f521d7830b4c915859b1cd71babaea08b3a05 100644 (file)
@@ -1,52 +1,52 @@
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionType;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * OptionTypeTimezone is an implementation of OptionType for a select box, which list the available time zones.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category   Community Framework\r
- */\r
-class OptionTypeTimezone implements IOptionType {\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(Option $option, $value) {\r
-               $timezoneOptions = array();\r
-               foreach (DateUtil::getAvailableTimezones() as $timezone) {\r
-                       $timezoneOptions[$timezone] = WCF::getLanguage()->get('wcf.global.date.timezone.'.str_replace('/', '.', strtolower($timezone)));\r
-               }\r
-               \r
-               WCF::getTPL()->assign(array(\r
-                       'option' => $option,\r
-                       'selectOptions' => $timezoneOptions,\r
-                       'value' => $value\r
-               ));\r
-               return WCF::getTPL()->fetch('optionTypeSelect');\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::validate()\r
-        */\r
-       public function validate(Option $option, $newValue) {\r
-               if (!in_array($newValue, DateUtil::getAvailableTimezones())) {\r
-                       throw new UserInputException($option->optionName, 'validationFailed');\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(Option $option, $newValue) {\r
-               return $newValue;               \r
-       }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionType;
+use wcf\system\exception\UserInputException;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+
+/**
+ * OptionTypeTimezone is an implementation of OptionType for a select box, which list the available time zones.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option
+ * @category   Community Framework
+ */
+class OptionTypeTimezone implements IOptionType {
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(Option $option, $value) {
+               $timezoneOptions = array();
+               foreach (DateUtil::getAvailableTimezones() as $timezone) {
+                       $timezoneOptions[$timezone] = WCF::getLanguage()->get('wcf.global.date.timezone.'.str_replace('/', '.', strtolower($timezone)));
+               }
+               
+               WCF::getTPL()->assign(array(
+                       'option' => $option,
+                       'selectOptions' => $timezoneOptions,
+                       'value' => $value
+               ));
+               return WCF::getTPL()->fetch('optionTypeSelect');
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::validate()
+        */
+       public function validate(Option $option, $newValue) {
+               if (!in_array($newValue, DateUtil::getAvailableTimezones())) {
+                       throw new UserInputException($option->optionName, 'validationFailed');
+               }
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(Option $option, $newValue) {
+               return $newValue;               
+       }
 }
index c6d691ac7e43ebe496fbb2efc5dad1b8f01fa1e8..09bcbfad03d4cc80acb8e43cf0368dfc9556efcd 100644 (file)
@@ -1,27 +1,27 @@
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\OptionTypeBoolean;\r
-\r
-/**\r
- * GroupOptionTypeBoolean is an implementation of GroupOptionType for boolean values.\r
- * The merge of option values returns true, if at least one value is true. Otherwise false.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category   Community Framework\r
- */\r
-class GroupOptionTypeBoolean extends OptionTypeBoolean implements IGroupOptionType {\r
-       /**\r
-        * @see wcf\system\option\group\IGroupOptionType::merge()\r
-        */\r
-       public function merge(array $values) {\r
-               foreach ($values as $value) {\r
-                       if ($value) return true;\r
-               }\r
-\r
-               return false;\r
-       }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\OptionTypeBoolean;
+
+/**
+ * GroupOptionTypeBoolean is an implementation of GroupOptionType for boolean values.
+ * The merge of option values returns true, if at least one value is true. Otherwise false.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category   Community Framework
+ */
+class GroupOptionTypeBoolean extends OptionTypeBoolean implements IGroupOptionType {
+       /**
+        * @see wcf\system\option\group\IGroupOptionType::merge()
+        */
+       public function merge(array $values) {
+               foreach ($values as $value) {
+                       if ($value) return true;
+               }
+
+               return false;
+       }
 }
index 8ed86335cdee773b264a6ca6b2bb0984f6d83fca..29ee07b21ceb79750b58ad54b7b04f10630d4a0b 100644 (file)
@@ -1,81 +1,81 @@
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\data\option\Option;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * GroupOptionTypeGroups generates a select-list of all available user groups.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category   Community Framework\r
- */\r
-class GroupOptionTypeGroups implements IGroupOptionType {\r
-       /**\r
-        * @see wcf\system\option\IOptionType::getFormElement()\r
-        */\r
-       public function getFormElement(Option $option, $value) {\r
-               // get selected group\r
-               $selectedGroups = explode(',', $value);\r
-               \r
-               // get all groups\r
-               $groups = UserGroup::getGroupsByType();\r
-               \r
-               // generate html\r
-               $html = '';\r
-               foreach ($groups as $group) {\r
-                       $html .= '<label><input type="checkbox" name="values['.StringUtil::encodeHTML($option->optionName).'][]" value="'.$group->groupID.'" '.(in_array($group->groupID, $selectedGroups) ? 'checked="checked" ' : '').'/> '.StringUtil::encodeHTML($group->groupName).'</label>';\r
-               }\r
-               \r
-               return $html;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::validate()\r
-        */\r
-       public function validate(Option $option, $newValue) {\r
-               // get all groups\r
-               $groups = UserGroup::getGroupsByType();\r
-               \r
-               // get new value\r
-               if (!is_array($newValue)) $newValue = array();\r
-               $selectedGroups = ArrayUtil::toIntegerArray($newValue);\r
-               \r
-               // check groups\r
-               foreach ($selectedGroups as $groupID) {\r
-                       if (!isset($groups[$groupID])) {\r
-                               throw new UserInputException($option->optionName, 'validationFailed');\r
-                       }\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\IOptionType::getData()\r
-        */\r
-       public function getData(Option $option, $newValue) {\r
-               if (!is_array($newValue)) $newValue = array();\r
-               $newValue = ArrayUtil::toIntegerArray($newValue);\r
-               sort($newValue, SORT_NUMERIC);\r
-               return implode(',', $newValue);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\option\group\IGroupOptionType::merge()\r
-        */\r
-       public function merge(array $values) {\r
-               $result = array();\r
-               foreach ($values as $value) {\r
-                       $value = explode(',', $value);\r
-                       $result = array_merge($result, $value);\r
-               }\r
-               \r
-               $result = array_unique($result);\r
-\r
-               return implode(',', $result);\r
-       }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\data\option\Option;
+use wcf\data\user\group\UserGroup;
+use wcf\util\ArrayUtil;
+use wcf\util\StringUtil;
+
+/**
+ * GroupOptionTypeGroups generates a select-list of all available user groups.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category   Community Framework
+ */
+class GroupOptionTypeGroups implements IGroupOptionType {
+       /**
+        * @see wcf\system\option\IOptionType::getFormElement()
+        */
+       public function getFormElement(Option $option, $value) {
+               // get selected group
+               $selectedGroups = explode(',', $value);
+               
+               // get all groups
+               $groups = UserGroup::getGroupsByType();
+               
+               // generate html
+               $html = '';
+               foreach ($groups as $group) {
+                       $html .= '<label><input type="checkbox" name="values['.StringUtil::encodeHTML($option->optionName).'][]" value="'.$group->groupID.'" '.(in_array($group->groupID, $selectedGroups) ? 'checked="checked" ' : '').'/> '.StringUtil::encodeHTML($group->groupName).'</label>';
+               }
+               
+               return $html;
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::validate()
+        */
+       public function validate(Option $option, $newValue) {
+               // get all groups
+               $groups = UserGroup::getGroupsByType();
+               
+               // get new value
+               if (!is_array($newValue)) $newValue = array();
+               $selectedGroups = ArrayUtil::toIntegerArray($newValue);
+               
+               // check groups
+               foreach ($selectedGroups as $groupID) {
+                       if (!isset($groups[$groupID])) {
+                               throw new UserInputException($option->optionName, 'validationFailed');
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\system\option\IOptionType::getData()
+        */
+       public function getData(Option $option, $newValue) {
+               if (!is_array($newValue)) $newValue = array();
+               $newValue = ArrayUtil::toIntegerArray($newValue);
+               sort($newValue, SORT_NUMERIC);
+               return implode(',', $newValue);
+       }
+       
+       /**
+        * @see wcf\system\option\group\IGroupOptionType::merge()
+        */
+       public function merge(array $values) {
+               $result = array();
+               foreach ($values as $value) {
+                       $value = explode(',', $value);
+                       $result = array_merge($result, $value);
+               }
+               
+               $result = array_unique($result);
+
+               return implode(',', $result);
+       }
 }
index b4a4faa494026c5c1d2a3d444c9c7bda6d069c3e..6b093c0c7657c2d5c6e866665002519afc92eda7 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\option\group;\r
-\r
-/**\r
- * GroupOptionTypeInfiniteinteger is an implementation of GroupOptionType for integer values with the infinite option.\r
- * The merge of option values returns true, if at least one value is -1. Otherwise it returns the highest value.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category   Community Framework\r
- */\r
-class GroupOptionTypeInfiniteInteger extends GroupOptionTypeInteger {\r
-       /**\r
-        * @see wcf\system\option\group\IGroupOptionType::merge()\r
-        */\r
-       public function merge(array $values) {\r
-               if (in_array(-1, $values)) return -1;\r
-               return parent::merge($values);\r
-       }\r
+<?php
+namespace wcf\system\option\group;
+
+/**
+ * GroupOptionTypeInfiniteinteger is an implementation of GroupOptionType for integer values with the infinite option.
+ * The merge of option values returns true, if at least one value is -1. Otherwise it returns the highest value.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category   Community Framework
+ */
+class GroupOptionTypeInfiniteInteger extends GroupOptionTypeInteger {
+       /**
+        * @see wcf\system\option\group\IGroupOptionType::merge()
+        */
+       public function merge(array $values) {
+               if (in_array(-1, $values)) return -1;
+               return parent::merge($values);
+       }
 }
index f792f43215e3693318d58d878ddc1832503d97bf..cc2cd2205417ecc10173e9dd7546128aee947436 100644 (file)
@@ -1,27 +1,27 @@
-<?php\r
-namespace wcf\system\option\group;\r
-\r
-/**\r
- * GroupOptionTypeInfiniteinverseinteger is an implementation of GroupOptionType for integer values.\r
- * The merge of option values returns -1 if all values are -1 otherwise the lowest value.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category   Community Framework\r
- */\r
-class GroupOptionTypeInfiniteInverseInteger extends GroupOptionTypeInverseinteger {\r
-       /**\r
-        * @see wcf\system\option\group\IGroupOptionType::merge()\r
-        */\r
-       public function merge(array $values) {\r
-               foreach ($values as $key => $value) {\r
-                       if ($value == -1) unset($values[$key]);\r
-               }\r
-               \r
-               if (count($values) == 0) return -1;\r
-               return min($values);\r
-       }\r
+<?php
+namespace wcf\system\option\group;
+
+/**
+ * GroupOptionTypeInfiniteinverseinteger is an implementation of GroupOptionType for integer values.
+ * The merge of option values returns -1 if all values are -1 otherwise the lowest value.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category   Community Framework
+ */
+class GroupOptionTypeInfiniteInverseInteger extends GroupOptionTypeInverseinteger {
+       /**
+        * @see wcf\system\option\group\IGroupOptionType::merge()
+        */
+       public function merge(array $values) {
+               foreach ($values as $key => $value) {
+                       if ($value == -1) unset($values[$key]);
+               }
+               
+               if (count($values) == 0) return -1;
+               return min($values);
+       }
 }
index aa816cf96728dfaaa33f69fccf6d78d5c15bfd89..b70913e119553594f74a9c7520c64856619ea1b6 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\OptionTypeInteger;\r
-\r
-/**\r
- * GroupOptionTypeInteger is an implementation of GroupOptionType for integer values.\r
- * The merge of option values returns the highest value.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category   Community Framework\r
- */\r
-class GroupOptionTypeInteger extends OptionTypeInteger implements IGroupOptionType {\r
-       /**\r
-        * @see wcf\system\option\group\IGroupOptionType::merge()\r
-        */\r
-       public function merge(array $values) {\r
-               return max($values);\r
-       }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\OptionTypeInteger;
+
+/**
+ * GroupOptionTypeInteger is an implementation of GroupOptionType for integer values.
+ * The merge of option values returns the highest value.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category   Community Framework
+ */
+class GroupOptionTypeInteger extends OptionTypeInteger implements IGroupOptionType {
+       /**
+        * @see wcf\system\option\group\IGroupOptionType::merge()
+        */
+       public function merge(array $values) {
+               return max($values);
+       }
 }
index d95d1cd5e352031ace02777169b8b2a95bc74797..8169a75534a0d634c254ac5dba9263d54eb66686 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\OptionTypeInteger;\r
-\r
-/**\r
- * GroupOptionTypeInverseInteger is an implementation of GroupOptionType for integer values.\r
- * The merge of option values returns the lowest value.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category   Community Framework\r
- */\r
-class GroupOptionTypeInverseInteger extends OptionTypeInteger implements IGroupOptionType {\r
-       /**\r
-        * @see wcf\system\option\group\IGroupOptionType::merge()\r
-        */\r
-       public function merge(array $values) {\r
-               return min($values);\r
-       }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\OptionTypeInteger;
+
+/**
+ * GroupOptionTypeInverseInteger is an implementation of GroupOptionType for integer values.
+ * The merge of option values returns the lowest value.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category   Community Framework
+ */
+class GroupOptionTypeInverseInteger extends OptionTypeInteger implements IGroupOptionType {
+       /**
+        * @see wcf\system\option\group\IGroupOptionType::merge()
+        */
+       public function merge(array $values) {
+               return min($values);
+       }
 }
index b8933826c2df433fc63896924c4f09b2f2f78865..5685a19d9eaccdb3595a13fba9da65a3cc7b94cc 100644 (file)
@@ -1,30 +1,30 @@
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\OptionTypeTextarea;\r
-\r
-/**\r
- * GroupOptionTypeTextarea is an implementation of GroupOptionType for text values.\r
- * The merge of option values returns merge of all text values.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category   Community Framework\r
- */\r
-class GroupOptionTypeTextarea extends OptionTypeTextarea implements IGroupOptionType {\r
-       /**\r
-        * @see wcf\system\option\group\IGroupOptionType::merge()\r
-        */\r
-       public function merge(array $values) {\r
-               $result = '';\r
-               \r
-               foreach ($values as $value) {\r
-                       if (!empty($result)) $result .= "\n";\r
-                       $result .= $value;\r
-               }\r
-\r
-               return $result;\r
-       }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\OptionTypeTextarea;
+
+/**
+ * GroupOptionTypeTextarea is an implementation of GroupOptionType for text values.
+ * The merge of option values returns merge of all text values.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category   Community Framework
+ */
+class GroupOptionTypeTextarea extends OptionTypeTextarea implements IGroupOptionType {
+       /**
+        * @see wcf\system\option\group\IGroupOptionType::merge()
+        */
+       public function merge(array $values) {
+               $result = '';
+               
+               foreach ($values as $value) {
+                       if (!empty($result)) $result .= "\n";
+                       $result .= $value;
+               }
+
+               return $result;
+       }
 }
index 9dfa59f7d18e943a8a921af458d3f851d59a4620..8dc31f76dd2b954973108a958cfeb77f1f50e75f 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\IOptionType;\r
-\r
-/**\r
- * Any group permission type should implement this interface.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category   Community Framework\r
- */\r
-interface IGroupOptionType extends IOptionType {\r
-       /**\r
-        * Merges the different values of an option to a single value.\r
-        * \r
-        * @param       array           $values\r
-        * @return      mixed           $value\r
-        */\r
-       public function merge(array $values);\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\IOptionType;
+
+/**
+ * Any group permission type should implement this interface.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category   Community Framework
+ */
+interface IGroupOptionType extends IOptionType {
+       /**
+        * Merges the different values of an option to a single value.
+        * 
+        * @param       array           $values
+        * @return      mixed           $value
+        */
+       public function merge(array $values);
 }
index de25051210496df9c6183ed4dba204ca9eb4ebfb..d72e7b946670226c63a82b8636b5a9e6da43d09a 100644 (file)
@@ -1,97 +1,97 @@
-<?php\r
-namespace wcf\system\package;\r
-use wcf\system\form\FormDocument;\r
-\r
-/**\r
- * Represents step information within an installation node.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.package\r
- * @category   Community Framework\r
- */\r
-class PackageInstallationStep {\r
-       /**\r
-        * form document object\r
-        *\r
-        * @var FormDocument\r
-        */\r
-       protected $document = null;\r
-       \r
-       /**\r
-        * next installation node\r
-        *\r
-        * @var string\r
-        */\r
-       protected $node = '';\r
-       \r
-       /**\r
-        * split current node\r
-        *\r
-        * @var boolean\r
-        */\r
-       protected $splitNode = false;\r
-       \r
-       /**\r
-        * Sets next installation node.\r
-        *\r
-        * @param       string          $node\r
-        */\r
-       public function setNode($node) {\r
-               $this->node = $node;\r
-       }\r
-       \r
-       /**\r
-        * Returns next installation node.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getNode() {\r
-               return $this->node;\r
-       }\r
-       \r
-       /**\r
-        * Sets form document object.\r
-        *\r
-        * @param       FormDocument    $document\r
-        */\r
-       public function setDocument(FormDocument $document) {\r
-               $this->document = $document;\r
-       }\r
-       \r
-       /**\r
-        * Returns HTML-representation of form document object.\r
-        *\r
-        * @return      string\r
-        */\r
-       public function getTemplate() {\r
-               return $this->document->getHTML();\r
-       }\r
-       \r
-       /**\r
-        * Returns true if current step holds a form document object.\r
-        *\r
-        * @return      boolean\r
-        */\r
-       public function hasDocument() {\r
-               return ($this->document !== null);\r
-       }\r
-       \r
-       /**\r
-        * Enforces node splitting.\r
-        */\r
-       public function setSplitNode() {\r
-               $this->splitNode = true;\r
-       }\r
-       \r
-       /**\r
-        * Returns true if node should be splitted.\r
-        *\r
-        * @return      boolean\r
-        */\r
-       public function splitNode() {\r
-               return $this->splitNode;\r
-       }\r
+<?php
+namespace wcf\system\package;
+use wcf\system\form\FormDocument;
+
+/**
+ * Represents step information within an installation node.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.package
+ * @category   Community Framework
+ */
+class PackageInstallationStep {
+       /**
+        * form document object
+        *
+        * @var FormDocument
+        */
+       protected $document = null;
+       
+       /**
+        * next installation node
+        *
+        * @var string
+        */
+       protected $node = '';
+       
+       /**
+        * split current node
+        *
+        * @var boolean
+        */
+       protected $splitNode = false;
+       
+       /**
+        * Sets next installation node.
+        *
+        * @param       string          $node
+        */
+       public function setNode($node) {
+               $this->node = $node;
+       }
+       
+       /**
+        * Returns next installation node.
+        *
+        * @return      string
+        */
+       public function getNode() {
+               return $this->node;
+       }
+       
+       /**
+        * Sets form document object.
+        *
+        * @param       FormDocument    $document
+        */
+       public function setDocument(FormDocument $document) {
+               $this->document = $document;
+       }
+       
+       /**
+        * Returns HTML-representation of form document object.
+        *
+        * @return      string
+        */
+       public function getTemplate() {
+               return $this->document->getHTML();
+       }
+       
+       /**
+        * Returns true if current step holds a form document object.
+        *
+        * @return      boolean
+        */
+       public function hasDocument() {
+               return ($this->document !== null);
+       }
+       
+       /**
+        * Enforces node splitting.
+        */
+       public function setSplitNode() {
+               $this->splitNode = true;
+       }
+       
+       /**
+        * Returns true if node should be splitted.
+        *
+        * @return      boolean
+        */
+       public function splitNode() {
+               return $this->splitNode;
+       }
 }
index bfac89a3a91ad17554b6bea77c8519d61f9cfe2a..e3f80deb3fddbfd97c6aae423a32aa603609eaea 100644 (file)
@@ -1,36 +1,36 @@
-<?php\r
-namespace wcf\system\package\plugin;\r
-\r
-/**\r
- * Any PackageInstallationPlugin should implement this interface.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.package.plugin\r
- * @category   Community Framework\r
- */\r
-interface IPackageInstallationPlugin {\r
-       /**\r
-        * Executes the installation of this plugin.\r
-        */\r
-       public function install();\r
-       \r
-       /**\r
-        * Executes the update of this plugin.\r
-        */\r
-       public function update();\r
-       \r
-       /**\r
-        * Returns true, if the uninstallation of the given package should execute this plugin.\r
-        * \r
-        * @return      boolean\r
-        */\r
-       public function hasUninstall();\r
-       \r
-       /**\r
-        * Executes the uninstallation of this plugin.\r
-        */\r
-       public function uninstall();\r
+<?php
+namespace wcf\system\package\plugin;
+
+/**
+ * Any PackageInstallationPlugin should implement this interface.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.package.plugin
+ * @category   Community Framework
+ */
+interface IPackageInstallationPlugin {
+       /**
+        * Executes the installation of this plugin.
+        */
+       public function install();
+       
+       /**
+        * Executes the update of this plugin.
+        */
+       public function update();
+       
+       /**
+        * Returns true, if the uninstallation of the given package should execute this plugin.
+        * 
+        * @return      boolean
+        */
+       public function hasUninstall();
+       
+       /**
+        * Executes the uninstallation of this plugin.
+        */
+       public function uninstall();
 }
index 95a8753afcdf594025e263b1746e2a239bda64fd..093b6e0a4209c74539012ddbef708ae9b1f61478 100644 (file)
@@ -1,47 +1,47 @@
-<?php\r
-namespace wcf\system\package\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * This PIP installs, updates or deletes page page menu items.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.package.plugin\r
- * @category   Community Framework\r
- */\r
-class PageMenuPackageInstallationPlugin extends AbstractMenuPackageInstallationPlugin {\r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$className\r
-        */\r
-       public $className = 'wcf\data\page\menu\item\PageMenuItemEditor';\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName\r
-        */     \r
-       public $tableName = 'page_menu_item';\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName\r
-        */     \r
-       public $tagName = 'pagemenuitem';\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::prepareImport()\r
-        */\r
-       protected function prepareImport(array $data) {\r
-               $result = parent::prepareImport($data);\r
-               \r
-               // position\r
-               $result['menuPosition'] = (!empty($data['elements']['position']) && $data['elements']['position'] == 'footer') ? 'footer' : 'header';\r
-               // class name\r
-               if (!empty($data['elements']['classname'])) {\r
-                       $result['className'] = $data['elements']['classname'];\r
-               }\r
-               \r
-               return $result;\r
-       }\r
-}\r
+<?php
+namespace wcf\system\package\plugin;
+use wcf\system\exception\SystemException;
+use wcf\util\ClassUtil;
+
+/**
+ * This PIP installs, updates or deletes page page menu items.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.package.plugin
+ * @category   Community Framework
+ */
+class PageMenuPackageInstallationPlugin extends AbstractMenuPackageInstallationPlugin {
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$className
+        */
+       public $className = 'wcf\data\page\menu\item\PageMenuItemEditor';
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName
+        */     
+       public $tableName = 'page_menu_item';
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName
+        */     
+       public $tagName = 'pagemenuitem';
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::prepareImport()
+        */
+       protected function prepareImport(array $data) {
+               $result = parent::prepareImport($data);
+               
+               // position
+               $result['menuPosition'] = (!empty($data['elements']['position']) && $data['elements']['position'] == 'footer') ? 'footer' : 'header';
+               // class name
+               if (!empty($data['elements']['classname'])) {
+                       $result['className'] = $data['elements']['classname'];
+               }
+               
+               return $result;
+       }
+}
index 596263646415a907bc84e3c277c3e0fb9fee0f91..b56b2da1743f47e6cb157a09d3128fcd98d1ee2d 100644 (file)
-<?php\r
-namespace wcf\system\package\plugin;\r
-use wcf\data\style\StyleEditor;\r
-use wcf\data\style\StyleList;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * This PIP installs, updates or deletes style attributes.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.package.plugin\r
- * @category   Community Framework\r
- */\r
-class StyleAttributesPackageInstallationPlugin extends AbstractXMLPackageInstallationPlugin {\r
-       /**\r
-        * list of updated or new style variables\r
-        * @var array\r
-        */     \r
-       protected $styleVariables = array();\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName\r
-        */     \r
-       public $tableName = 'style_variable_to_attribute';\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName\r
-        */\r
-       public $tagName = 'styleattribute';\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::handleDelete()\r
-        */\r
-       protected function handleDelete(array $items) {\r
-               $sql = "DELETE FROM     wcf".WCF_N."_".$this->tableName."\r
-                       WHERE           packageID = ?\r
-                                       AND cssSelector = ?\r
-                                       AND attributeName = ?\r
-                                       AND variableName = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               \r
-               foreach ($items as $item) {\r
-                       $statement->execute(array(\r
-                               $this->installation->getPackageID(),\r
-                               $item['elements']['selector'],\r
-                               $item['elements']['name'],\r
-                               $item['elements']['value']\r
-                       ));\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::prepareImport()\r
-        */\r
-       protected function prepareImport(array $data) {\r
-               return array(\r
-                       'cssSelector' => $data['elements']['selector'],\r
-                       'attributeName' => $data['elements']['name'],\r
-                       'variableName' => $data['elements']['value']\r
-               );\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::findExistingItem()\r
-        */\r
-       protected function findExistingItem(array $data) {\r
-               return null;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::import()\r
-        */     \r
-       protected function import(array $row, array $data) {\r
-               $this->styleVariables[] = $data;\r
-       }\r
-       \r
-       /**\r
-        * It is not possible to properly update and insert values without\r
-        * spamming loads of queries for each import, thus delete all\r
-        * matching variables first and insert them afterwards.\r
-        * \r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::postImport()\r
-        */\r
-       protected function postImport() {\r
-               if (!count($this->styleVariables)) return;\r
-               \r
-               // delete items first\r
-               $sql = "DELETE FROM     wcf".WCF_N."_".$this->tableName."\r
-                       WHERE           packageID = ?\r
-                                       AND cssSelector = ?\r
-                                       AND attributeName = ?\r
-                                       AND variableName = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               foreach ($this->styleVariables as $variable) {\r
-                       $statement->execute(array(\r
-                               $this->installation->getPackageID(),\r
-                               $variable['cssSelector'],\r
-                               $variable['attributeName'],\r
-                               $variable['variableName']\r
-                       ));\r
-               }\r
-               \r
-               // insert items\r
-               $sql = "INSERT INTO     wcf".WCF_N."_".$this->tableName."\r
-                                       (packageID, cssSelector, attributeName, variableName)\r
-                       VALUES          (?, ?, ?, ?)";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               foreach ($this->styleVariables as $variable) {\r
-                       $statement->execute(array(\r
-                               $this->installation->getPackageID(),\r
-                               $variable['cssSelector'],\r
-                               $variable['attributeName'],\r
-                               $variable['variableName']\r
-                       ));\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()\r
-        */\r
-       public function uninstall() {\r
-               parent::uninstall();\r
-               \r
-               $this->cleanup();\r
-       }\r
-       \r
-       /**\r
-        * Updates styles files of all styles.\r
-        */\r
-       protected function cleanup() {\r
-               // get all styles\r
-               $styleList = new StyleList();\r
-               $styleList->sqlLimit = 0;\r
-               $styleList->readObjects();\r
-               \r
-               foreach ($styleList->getObjects() as $style) {\r
-                       $styleEditor = new StyleEditor($style);\r
-                       $style->writeStyleFile();\r
-               }\r
-       }\r
-}\r
+<?php
+namespace wcf\system\package\plugin;
+use wcf\data\style\StyleEditor;
+use wcf\data\style\StyleList;
+use wcf\system\WCF;
+
+/**
+ * This PIP installs, updates or deletes style attributes.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.package.plugin
+ * @category   Community Framework
+ */
+class StyleAttributesPackageInstallationPlugin extends AbstractXMLPackageInstallationPlugin {
+       /**
+        * list of updated or new style variables
+        * @var array
+        */     
+       protected $styleVariables = array();
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName
+        */     
+       public $tableName = 'style_variable_to_attribute';
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName
+        */
+       public $tagName = 'styleattribute';
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::handleDelete()
+        */
+       protected function handleDelete(array $items) {
+               $sql = "DELETE FROM     wcf".WCF_N."_".$this->tableName."
+                       WHERE           packageID = ?
+                                       AND cssSelector = ?
+                                       AND attributeName = ?
+                                       AND variableName = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               
+               foreach ($items as $item) {
+                       $statement->execute(array(
+                               $this->installation->getPackageID(),
+                               $item['elements']['selector'],
+                               $item['elements']['name'],
+                               $item['elements']['value']
+                       ));
+               }
+       }
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::prepareImport()
+        */
+       protected function prepareImport(array $data) {
+               return array(
+                       'cssSelector' => $data['elements']['selector'],
+                       'attributeName' => $data['elements']['name'],
+                       'variableName' => $data['elements']['value']
+               );
+       }
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::findExistingItem()
+        */
+       protected function findExistingItem(array $data) {
+               return null;
+       }
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::import()
+        */     
+       protected function import(array $row, array $data) {
+               $this->styleVariables[] = $data;
+       }
+       
+       /**
+        * It is not possible to properly update and insert values without
+        * spamming loads of queries for each import, thus delete all
+        * matching variables first and insert them afterwards.
+        * 
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::postImport()
+        */
+       protected function postImport() {
+               if (!count($this->styleVariables)) return;
+               
+               // delete items first
+               $sql = "DELETE FROM     wcf".WCF_N."_".$this->tableName."
+                       WHERE           packageID = ?
+                                       AND cssSelector = ?
+                                       AND attributeName = ?
+                                       AND variableName = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               foreach ($this->styleVariables as $variable) {
+                       $statement->execute(array(
+                               $this->installation->getPackageID(),
+                               $variable['cssSelector'],
+                               $variable['attributeName'],
+                               $variable['variableName']
+                       ));
+               }
+               
+               // insert items
+               $sql = "INSERT INTO     wcf".WCF_N."_".$this->tableName."
+                                       (packageID, cssSelector, attributeName, variableName)
+                       VALUES          (?, ?, ?, ?)";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               foreach ($this->styleVariables as $variable) {
+                       $statement->execute(array(
+                               $this->installation->getPackageID(),
+                               $variable['cssSelector'],
+                               $variable['attributeName'],
+                               $variable['variableName']
+                       ));
+               }
+       }
+       
+       /**
+        * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
+        */
+       public function uninstall() {
+               parent::uninstall();
+               
+               $this->cleanup();
+       }
+       
+       /**
+        * Updates styles files of all styles.
+        */
+       protected function cleanup() {
+               // get all styles
+               $styleList = new StyleList();
+               $styleList->sqlLimit = 0;
+               $styleList->readObjects();
+               
+               foreach ($styleList->getObjects() as $style) {
+                       $styleEditor = new StyleEditor($style);
+                       $style->writeStyleFile();
+               }
+       }
+}
index 2161881643566a09dead1d12f8e3092bdc6be37a..7b6843a34e0763165bd90262283533fb90cc08aa 100644 (file)
@@ -1,89 +1,89 @@
-<?php\r
-namespace wcf\system\package\plugin;\r
-use wcf\data\style\StyleEditor;\r
-use wcf\data\style\StyleList;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * This PIP installs, updates or deletes styles.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.package.plugin\r
- * @category   Community Framework\r
- */\r
-class StylePackageInstallationPlugin extends AbstractPackageInstallationPlugin {\r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$className\r
-        */\r
-       public $className = 'wcf\data\style\StyleEditor';\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName\r
-        */     \r
-       public $tableName = 'style';\r
-       \r
-       /**\r
-        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName\r
-        */     \r
-       public $tagName = 'style';\r
-       \r
-       /** \r
-        * @see wcf\system\package\plugin\IPackageInstallationPlugin::install()\r
-        */\r
-       public function install() {\r
-               parent::install();\r
-               \r
-               // extract style tar\r
-               $filename = $this->installation->getArchive()->extractTar($this->instructions['value'], 'style_');\r
-               \r
-               // import style\r
-               $style = StyleEditor::import($filename, $this->installation->getPackageID());\r
-               \r
-               // set style as default\r
-               if (isset($this->instruction['attributes']['default'])) {\r
-                       $style->setAsDefault();\r
-               }\r
-               \r
-               // remove tmp file\r
-               @unlink($filename);\r
-       }\r
-       \r
-       /** \r
-        * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()\r
-        */\r
-       public function uninstall() {\r
-               // call uninstall event\r
-               EventHandler::fireAction($this, 'uninstall');\r
-               \r
-               // get all style of this package\r
-               $isDefault = false;\r
-               $styleList = new StyleList();\r
-               $styleList->getConditionBuilder()->add("packageID = ?", array($this->installation->getPackageID()));\r
-               $styleList->sqlLimit = 0;\r
-               $styleList->readObjects();\r
-               \r
-               foreach ($styleList->getObjects() as $style) {\r
-                       $styleEditor = new StyleEditor($style);\r
-                       $styleEditor->delete();\r
-                       \r
-                       $isDefault = $isDefault || $style->isDefault;\r
-               }\r
-               \r
-               // default style deleted\r
-               if ($isDefault) {\r
-                       $styleList = new StyleList();\r
-                       $styleList->sqlOrderBy = 'style.styleID ASC';\r
-                       $styleList->sqlLimit = 1;\r
-                       $styleList->readObjects();\r
-                       $styles = $styleList->getObjects();\r
-                       \r
-                       if (count($styles)) {\r
-                               $styleEditor = new StyleEditor($styles[0]);\r
-                               $styleEditor->setAsDefault();\r
-                       }\r
-               }\r
-       }\r
-}\r
+<?php
+namespace wcf\system\package\plugin;
+use wcf\data\style\StyleEditor;
+use wcf\data\style\StyleList;
+use wcf\system\WCF;
+
+/**
+ * This PIP installs, updates or deletes styles.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.package.plugin
+ * @category   Community Framework
+ */
+class StylePackageInstallationPlugin extends AbstractPackageInstallationPlugin {
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$className
+        */
+       public $className = 'wcf\data\style\StyleEditor';
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName
+        */     
+       public $tableName = 'style';
+       
+       /**
+        * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName
+        */     
+       public $tagName = 'style';
+       
+       /** 
+        * @see wcf\system\package\plugin\IPackageInstallationPlugin::install()
+        */
+       public function install() {
+               parent::install();
+               
+               // extract style tar
+               $filename = $this->installation->getArchive()->extractTar($this->instructions['value'], 'style_');
+               
+               // import style
+               $style = StyleEditor::import($filename, $this->installation->getPackageID());
+               
+               // set style as default
+               if (isset($this->instruction['attributes']['default'])) {
+                       $style->setAsDefault();
+               }
+               
+               // remove tmp file
+               @unlink($filename);
+       }
+       
+       /** 
+        * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
+        */
+       public function uninstall() {
+               // call uninstall event
+               EventHandler::fireAction($this, 'uninstall');
+               
+               // get all style of this package
+               $isDefault = false;
+               $styleList = new StyleList();
+               $styleList->getConditionBuilder()->add("packageID = ?", array($this->installation->getPackageID()));
+               $styleList->sqlLimit = 0;
+               $styleList->readObjects();
+               
+               foreach ($styleList->getObjects() as $style) {
+                       $styleEditor = new StyleEditor($style);
+                       $styleEditor->delete();
+                       
+                       $isDefault = $isDefault || $style->isDefault;
+               }
+               
+               // default style deleted
+               if ($isDefault) {
+                       $styleList = new StyleList();
+                       $styleList->sqlOrderBy = 'style.styleID ASC';
+                       $styleList->sqlLimit = 1;
+                       $styleList->readObjects();
+                       $styles = $styleList->getObjects();
+                       
+                       if (count($styles)) {
+                               $styleEditor = new StyleEditor($styles[0]);
+                               $styleEditor->setAsDefault();
+                       }
+               }
+       }
+}
index 158936753f3e2c2888ddd495d8250db2979e0729..6ebbaebfa303ad5d63e6e785cadc14773c497f5b 100644 (file)
@@ -1,97 +1,97 @@
-<?php\r
-namespace wcf\system\request;\r
-\r
-/**\r
- * Represents a page request.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.request\r
- * @category   Community Framework\r
- */\r
-class Request {\r
-       /**\r
-        * page class name\r
-        * @var string\r
-        */\r
-       protected $className = '';\r
-       \r
-       /**\r
-        * page name\r
-        * @var string\r
-        */\r
-       protected $pageName = '';\r
-       \r
-       /**\r
-        * page type\r
-        * @var string\r
-        */\r
-       protected $pageType = '';\r
-       \r
-       /**\r
-        * true, if this request was executed already.\r
-        * @var boolean\r
-        */\r
-       protected $executed = false;\r
-       \r
-       /**\r
-        * Creates a new request object.\r
-        * \r
-        * @param       string          $className\r
-        * @param       string          $pageName\r
-        * @param       string          $pageType\r
-        */\r
-       public function __construct($className, $pageName, $pageType) {\r
-               $this->className = $className;\r
-               $this->pageName = $pageName;\r
-               $this->pageType = $pageType;\r
-       }\r
-       \r
-       /**\r
-        * Executes this request.\r
-        */\r
-       public function execute() {\r
-               if (!$this->executed) {\r
-                       $this->executed = true;\r
-                       new $this->className();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns true, if this request was executed already.\r
-        * \r
-        * @return boolean\r
-        */\r
-       public function isExecuted() {\r
-               return $this->executed;\r
-       }\r
-       \r
-       /**\r
-        * Returns the page class name of this request.\r
-        * \r
-        * @return string\r
-        */\r
-       public function getClassName() {\r
-               return $this->className; \r
-       }\r
-       \r
-       /**\r
-        * Returns the page name of this request.\r
-        * \r
-        * @return string\r
-        */\r
-       public function getPageName() {\r
-               return $this->pageName;\r
-       }\r
-       \r
-       /**\r
-        * Returns the page type of this request.\r
-        * \r
-        * @return string\r
-        */\r
-       public function getPageType() {\r
-               return $this->pageType;\r
-       }\r
+<?php
+namespace wcf\system\request;
+
+/**
+ * Represents a page request.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.request
+ * @category   Community Framework
+ */
+class Request {
+       /**
+        * page class name
+        * @var string
+        */
+       protected $className = '';
+       
+       /**
+        * page name
+        * @var string
+        */
+       protected $pageName = '';
+       
+       /**
+        * page type
+        * @var string
+        */
+       protected $pageType = '';
+       
+       /**
+        * true, if this request was executed already.
+        * @var boolean
+        */
+       protected $executed = false;
+       
+       /**
+        * Creates a new request object.
+        * 
+        * @param       string          $className
+        * @param       string          $pageName
+        * @param       string          $pageType
+        */
+       public function __construct($className, $pageName, $pageType) {
+               $this->className = $className;
+               $this->pageName = $pageName;
+               $this->pageType = $pageType;
+       }
+       
+       /**
+        * Executes this request.
+        */
+       public function execute() {
+               if (!$this->executed) {
+                       $this->executed = true;
+                       new $this->className();
+               }
+       }
+       
+       /**
+        * Returns true, if this request was executed already.
+        * 
+        * @return boolean
+        */
+       public function isExecuted() {
+               return $this->executed;
+       }
+       
+       /**
+        * Returns the page class name of this request.
+        * 
+        * @return string
+        */
+       public function getClassName() {
+               return $this->className; 
+       }
+       
+       /**
+        * Returns the page name of this request.
+        * 
+        * @return string
+        */
+       public function getPageName() {
+               return $this->pageName;
+       }
+       
+       /**
+        * Returns the page type of this request.
+        * 
+        * @return string
+        */
+       public function getPageType() {
+               return $this->pageType;
+       }
 }
index b345c735101e3c3cac32c3c79e96eb69972d4619..8d70f646eea28f2cbdce644f6d43696035757172 100644 (file)
@@ -1,98 +1,98 @@
-<?php\r
-namespace wcf\system\request;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\SingletonFactory;\r
-\r
-/**\r
- * Handles http requests.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.request\r
- * @category   Community Framework\r
- */\r
-class RequestHandler extends SingletonFactory {\r
-       /**\r
-        * active request object\r
-        * @var Request\r
-        */\r
-       protected $activeRequest = null;\r
-       \r
-       /**\r
-        * Handles a http request\r
-        *\r
-        * @param       string          $application\r
-        */\r
-       public function handle($application = 'wcf', $isACP = false) {\r
-               // default values\r
-               $pageName = 'Index';\r
-               $pageType = 'page';\r
-               \r
-               if (!empty($_GET['page']) || !empty($_POST['page'])) {\r
-                       $pageName = (!empty($_GET['page']) ? $_GET['page'] : $_POST['page']);\r
-                       $pageType = 'page';\r
-               }\r
-               else if (!empty($_GET['form']) || !empty($_POST['form'])) {\r
-                       $pageName = (!empty($_GET['form']) ? $_GET['form'] : $_POST['form']);\r
-                       $pageType = 'form';\r
-               }\r
-               else if (!empty($_GET['action']) || !empty($_POST['action'])) {\r
-                       $pageName = (!empty($_GET['action']) ? $_GET['action'] : $_POST['action']);\r
-                       $pageType = 'action';\r
-               }\r
-               \r
-               // build request\r
-               $this->buildRequest($pageName, $pageType, $application, $isACP);\r
-               // start request\r
-               $this->activeRequest->execute();\r
-       }\r
-       \r
-       /**\r
-        * Builds a new request.\r
-        *\r
-        * @param       string          $pageName\r
-        * @param       string          $application\r
-        * @param       string          $pageType\r
-        * @param       boolean         $isACP\r
-        */\r
-       protected function buildRequest($pageName, $pageType, $application, $isACP) {\r
-               try {\r
-                       // validate class name\r
-                       if (!preg_match('~^[a-z0-9_]+$~i', $pageName)) {\r
-                               throw new SystemException("Illegal class name '".$pageName."'", 11009);\r
-                       }\r
-                       \r
-                       // find class\r
-                       $className = $application.'\\'.($isACP ? 'acp\\' : '').$pageType.'\\'.ucfirst($pageName).ucfirst($pageType);\r
-                       if ($application != 'wcf' && !class_exists($className)) {\r
-                               $className = 'wcf\\'.($isACP ? 'acp\\' : '').$pageType.'\\'.ucfirst($pageName).ucfirst($pageType);\r
-                       }\r
-                       if (!class_exists($className)) {\r
-                               throw new SystemException("unable to find class '".$className."'", 11000);\r
-                       }\r
-                       \r
-                       // check whether the class is abstract\r
-                       $reflectionClass = new \ReflectionClass($className);\r
-                       if ($reflectionClass->isAbstract()) {\r
-                               throw new SystemException("class '".$className."' is abstract");\r
-                       }\r
-                       \r
-                       $this->activeRequest = new Request($className, $pageName, $pageType);\r
-               }\r
-               catch (SystemException $e) {\r
-                       throw new IllegalLinkException();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns the active request object.\r
-        *\r
-        * @return Request\r
-        */\r
-       public function getActiveRequest() {\r
-               return $this->activeRequest;\r
-       }\r
+<?php
+namespace wcf\system\request;
+use wcf\system\exception\SystemException;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\SingletonFactory;
+
+/**
+ * Handles http requests.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.request
+ * @category   Community Framework
+ */
+class RequestHandler extends SingletonFactory {
+       /**
+        * active request object
+        * @var Request
+        */
+       protected $activeRequest = null;
+       
+       /**
+        * Handles a http request
+        *
+        * @param       string          $application
+        */
+       public function handle($application = 'wcf', $isACP = false) {
+               // default values
+               $pageName = 'Index';
+               $pageType = 'page';
+               
+               if (!empty($_GET['page']) || !empty($_POST['page'])) {
+                       $pageName = (!empty($_GET['page']) ? $_GET['page'] : $_POST['page']);
+                       $pageType = 'page';
+               }
+               else if (!empty($_GET['form']) || !empty($_POST['form'])) {
+                       $pageName = (!empty($_GET['form']) ? $_GET['form'] : $_POST['form']);
+                       $pageType = 'form';
+               }
+               else if (!empty($_GET['action']) || !empty($_POST['action'])) {
+                       $pageName = (!empty($_GET['action']) ? $_GET['action'] : $_POST['action']);
+                       $pageType = 'action';
+               }
+               
+               // build request
+               $this->buildRequest($pageName, $pageType, $application, $isACP);
+               // start request
+               $this->activeRequest->execute();
+       }
+       
+       /**
+        * Builds a new request.
+        *
+        * @param       string          $pageName
+        * @param       string          $application
+        * @param       string          $pageType
+        * @param       boolean         $isACP
+        */
+       protected function buildRequest($pageName, $pageType, $application, $isACP) {
+               try {
+                       // validate class name
+                       if (!preg_match('~^[a-z0-9_]+$~i', $pageName)) {
+                               throw new SystemException("Illegal class name '".$pageName."'", 11009);
+                       }
+                       
+                       // find class
+                       $className = $application.'\\'.($isACP ? 'acp\\' : '').$pageType.'\\'.ucfirst($pageName).ucfirst($pageType);
+                       if ($application != 'wcf' && !class_exists($className)) {
+                               $className = 'wcf\\'.($isACP ? 'acp\\' : '').$pageType.'\\'.ucfirst($pageName).ucfirst($pageType);
+                       }
+                       if (!class_exists($className)) {
+                               throw new SystemException("unable to find class '".$className."'", 11000);
+                       }
+                       
+                       // check whether the class is abstract
+                       $reflectionClass = new \ReflectionClass($className);
+                       if ($reflectionClass->isAbstract()) {
+                               throw new SystemException("class '".$className."' is abstract");
+                       }
+                       
+                       $this->activeRequest = new Request($className, $pageName, $pageType);
+               }
+               catch (SystemException $e) {
+                       throw new IllegalLinkException();
+               }
+       }
+       
+       /**
+        * Returns the active request object.
+        *
+        * @return Request
+        */
+       public function getActiveRequest() {
+               return $this->activeRequest;
+       }
 }
index 85bf06455bb2d0b1491e2f4291c37f6d4308190d..fbf9833b4301df9effea67e4a33975a9f0732f9b 100644 (file)
@@ -1,66 +1,66 @@
-<?php\r
-namespace wcf\system\session;\r
-use wcf\util\HeaderUtil;\r
-\r
-/**\r
- * SessionFactory handles session for active user.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.session\r
- * @category   Community Framework\r
- */\r
-class SessionFactory extends ACPSessionFactory {\r
-       /**\r
-        * @see ACPSessionFactory::$sessionEditor\r
-        */     \r
-       protected $sessionEditor = 'wcf\data\session\SessionEditor';\r
-       \r
-       /**\r
-        * @see ACPSessionFactory::$sessionDataEditor\r
-        */\r
-       protected $sessionDataEditor = 'wcf\data\session\data\SessionDataEditor';\r
-       \r
-       /**\r
-        * @see ACPSessionFactory::readSessionID()\r
-        */     \r
-       protected function readSessionID() {\r
-               $sessionID = parent::readSessionID();\r
-               \r
-               // get sessionID from cookie\r
-               if (empty($sessionID) && isset($_COOKIE[COOKIE_PREFIX.'cookieHash'])) {\r
-                       $sessionID = $_COOKIE[COOKIE_PREFIX . 'cookieHash'];\r
-               }\r
-               \r
-               return $sessionID;\r
-       }\r
-       \r
-       /**\r
-        * @see ACPSessionFactory::init()\r
-        */     \r
-       protected function init() {\r
-               $usesCookies = true;\r
-               \r
-               if (isset($_COOKIE[COOKIE_PREFIX.'cookieHash'])) {\r
-                       if ($_COOKIE[COOKIE_PREFIX.'cookieHash'] != SessionHandler::getInstance()->sessionID) {\r
-                               $usesCookies = false;\r
-                       }\r
-               }\r
-               else {\r
-                       $usesCookies = false;\r
-               }\r
-               \r
-               if (!$usesCookies) {\r
-                       // cookie support will be enabled upon next request\r
-                       HeaderUtil::setCookie('cookieHash', SessionHandler::getInstance()->sessionID);\r
-               }\r
-               else {\r
-                       // enable cookie support\r
-                       SessionHandler::getInstance()->enableCookies();\r
-               }\r
-               \r
-               parent::init();\r
-       }\r
+<?php
+namespace wcf\system\session;
+use wcf\util\HeaderUtil;
+
+/**
+ * SessionFactory handles session for active user.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.session
+ * @category   Community Framework
+ */
+class SessionFactory extends ACPSessionFactory {
+       /**
+        * @see ACPSessionFactory::$sessionEditor
+        */     
+       protected $sessionEditor = 'wcf\data\session\SessionEditor';
+       
+       /**
+        * @see ACPSessionFactory::$sessionDataEditor
+        */
+       protected $sessionDataEditor = 'wcf\data\session\data\SessionDataEditor';
+       
+       /**
+        * @see ACPSessionFactory::readSessionID()
+        */     
+       protected function readSessionID() {
+               $sessionID = parent::readSessionID();
+               
+               // get sessionID from cookie
+               if (empty($sessionID) && isset($_COOKIE[COOKIE_PREFIX.'cookieHash'])) {
+                       $sessionID = $_COOKIE[COOKIE_PREFIX . 'cookieHash'];
+               }
+               
+               return $sessionID;
+       }
+       
+       /**
+        * @see ACPSessionFactory::init()
+        */     
+       protected function init() {
+               $usesCookies = true;
+               
+               if (isset($_COOKIE[COOKIE_PREFIX.'cookieHash'])) {
+                       if ($_COOKIE[COOKIE_PREFIX.'cookieHash'] != SessionHandler::getInstance()->sessionID) {
+                               $usesCookies = false;
+                       }
+               }
+               else {
+                       $usesCookies = false;
+               }
+               
+               if (!$usesCookies) {
+                       // cookie support will be enabled upon next request
+                       HeaderUtil::setCookie('cookieHash', SessionHandler::getInstance()->sessionID);
+               }
+               else {
+                       // enable cookie support
+                       SessionHandler::getInstance()->enableCookies();
+               }
+               
+               parent::init();
+       }
 }
index ae1177148f4bd06a95dd813a60e29c9a5d3e00af..5092d28630e01f7907341ef9e8cd987d67720bc0 100644 (file)
@@ -1,28 +1,28 @@
-<?php\r
-namespace wcf\system\setup;\r
-\r
-/**\r
- * A FileHandler class logs files and checks their overwriting rights.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.setup\r
- * @category   Community Framework\r
- */\r
-interface IFileHandler {\r
-       /**\r
-        * Checks the overwriting rights of the given files.\r
-        * \r
-        * @param       array           $files\r
-        */\r
-       public function checkFiles(array $files);\r
-       \r
-       /**\r
-        * Logs the given list of files.\r
-        * \r
-        * @param       array           $files\r
-        */\r
-       public function logFiles(array $files);\r
+<?php
+namespace wcf\system\setup;
+
+/**
+ * A FileHandler class logs files and checks their overwriting rights.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.setup
+ * @category   Community Framework
+ */
+interface IFileHandler {
+       /**
+        * Checks the overwriting rights of the given files.
+        * 
+        * @param       array           $files
+        */
+       public function checkFiles(array $files);
+       
+       /**
+        * Logs the given list of files.
+        * 
+        * @param       array           $files
+        */
+       public function logFiles(array $files);
 }
index 777002686a7fc4aaa665b70339960e7cb4f43ce9..4303dc9a414b6e0c7b29b4474fee59ab46756586 100644 (file)
-<?php\r
-namespace wcf\system\setup;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\io\Tar;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Installer extracts folders and files from a tar archive.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.setup\r
- * @category   Community Framework\r
- */\r
-class Installer {\r
-       protected $targetDir, $source, $folder, $fileHandler;\r
-       \r
-       /**\r
-        * Creates a new Installer object.\r
-        *\r
-        * @param       string          $targetDir      extract the files in this dir\r
-        * @param       string          $source         name of the source tar archive\r
-        * @param       FileHandler     $fileHandler\r
-        * @param       string          $folder         extract only the files from this subfolder\r
-        */\r
-       public function __construct($targetDir, $source, $fileHandler = null, $folder = '') {\r
-               $this->targetDir = FileUtil::addTrailingSlash($targetDir);\r
-               $this->source = $source;\r
-               $this->folder = $folder;\r
-               $this->fileHandler = $fileHandler;\r
-               $this->install();\r
-       }\r
-       \r
-       /**\r
-        * Creates the target directory if necessary.\r
-        */\r
-       protected function createTargetDir() {\r
-               if (!@is_dir($this->targetDir)) {\r
-                       if (!FileUtil::makePath($this->targetDir, (FileUtil::isApacheModule() ? 0777 : 0755))) {\r
-                               throw new SystemException("Could not create dir '".$this->targetDir."'", 11011);\r
-                       }\r
-               }\r
-               if (FileUtil::isApacheModule() || !is_writeable($this->targetDir)) {\r
-                       $this->makeWriteable($this->targetDir);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Creates a directory in the target directory.\r
-        *\r
-        * @param       string          $dir\r
-        */\r
-       protected function createDir($dir) {\r
-               if (!@is_dir($this->targetDir.$dir)) {\r
-                       $oldumask = umask(0);\r
-                       if (!@mkdir($this->targetDir.$dir, 0755, true)) {\r
-                               throw new SystemException("Could not create dir '".$this->targetDir.$dir."'", 11011);\r
-                       }\r
-                       umask($oldumask);\r
-               }\r
-               if (FileUtil::isApacheModule() || !is_writeable($this->targetDir.$dir)) {\r
-                       $this->makeWriteable($this->targetDir.$dir);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Touches a file in the target directory.\r
-        *\r
-        * @param       string          $file\r
-        */\r
-       public function touchFile($file) {\r
-               @touch($this->targetDir.$file);\r
-               $this->makeWriteable($this->targetDir.$file);\r
-       }\r
-       \r
-       /**\r
-        * Creates a file in the target directory.\r
-        *\r
-        * @param       string          $file\r
-        * @param       integer         $index\r
-        * @param       Tar             $tar\r
-        */\r
-       protected function createFile($file, $index, Tar $tar) {\r
-               $tar->extract($index, $this->targetDir.$file);\r
-               if (FileUtil::isApacheModule() || !is_writeable($this->targetDir.$file)) {\r
-                       $this->makeWriteable($this->targetDir.$file);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Starts the extracting of the files.\r
-        */\r
-       protected function install() {\r
-               $this->createTargetDir();\r
-               \r
-               // open source archive\r
-               $tar = new Tar($this->source);\r
-               \r
-               // distinct directories and files\r
-               $directories = array();\r
-               $files = array();\r
-               foreach ($tar->getContentList() as $index => $file) {\r
-                       if (empty($this->folder) || StringUtil::indexOf($file['filename'], $this->folder) === 0) {\r
-                               if (!empty($this->folder)) {\r
-                                       $file['filename'] = StringUtil::replace($this->folder, '', $file['filename']);\r
-                               }\r
-                               \r
-                               // remove leading slash\r
-                               $file['filename'] = FileUtil::removeLeadingSlash($file['filename']);\r
-                               if ($file['type'] == 'folder') {\r
-                                       // remove trailing slash\r
-                                       $directories[] = FileUtil::removeTrailingSlash($file['filename']);\r
-                               }\r
-                               else {\r
-                                       $files[$index] = $file['filename'];\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               $this->checkFiles($files);\r
-\r
-               // now create the directories\r
-               $errors = array();\r
-               foreach ($directories as $dir) {\r
-                       try {\r
-                               $this->createDir($dir);\r
-                       }\r
-                       catch (SystemException $e) {\r
-                               $errors[] = array('file' => $dir, 'code' => $e->getCode(), 'message' => $e->getMessage());\r
-                       }\r
-               }\r
-\r
-               // now untar all files\r
-               foreach ($files as $index => $file) {\r
-                       try {\r
-                               $this->createFile($file, $index, $tar);\r
-                       }\r
-                       catch (SystemException $e) {\r
-                               $errors[] = array('file' => $file, 'code' => $e->getCode(), 'message' => $e->getMessage());\r
-                       }\r
-               }\r
-               if (count($errors) > 0) {\r
-                       throw new SystemException('error(s) during the installation of the files.', 11111, $errors);\r
-               }\r
-               \r
-               $this->logFiles($files);\r
-\r
-               // close tar\r
-               $tar->close();\r
-       }\r
-       \r
-       /**\r
-        * Checkes whether the given files overwriting locked existing files.\r
-        *\r
-        * @param       array           $files          list of files\r
-        */\r
-       protected function checkFiles(&$files) {\r
-               if ($this->fileHandler != null && $this->fileHandler instanceof IFileHandler) {\r
-                       $this->fileHandler->checkFiles($files);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Logs the extracted files.\r
-        *\r
-        * @param       array           $files          list of files\r
-        */\r
-       protected function logFiles(&$files) {\r
-               if ($this->fileHandler != null && $this->fileHandler instanceof IFileHandler) {\r
-                       $this->fileHandler->logFiles($files);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Makes a file or directory writeable.\r
-        *\r
-        * @param       string          $target\r
-        */\r
-       protected function makeWriteable($target) {\r
-               if (!preg_match('/^WIN/i', PHP_OS)) {\r
-                       if (!@chmod($target, 0777)) {\r
-                               //throw new SystemException("Could not chmod file '".$target."'", 11005);\r
-                       }\r
-               }\r
-       }\r
+<?php
+namespace wcf\system\setup;
+use wcf\system\exception\SystemException;
+use wcf\system\io\Tar;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Installer extracts folders and files from a tar archive.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.setup
+ * @category   Community Framework
+ */
+class Installer {
+       protected $targetDir, $source, $folder, $fileHandler;
+       
+       /**
+        * Creates a new Installer object.
+        *
+        * @param       string          $targetDir      extract the files in this dir
+        * @param       string          $source         name of the source tar archive
+        * @param       FileHandler     $fileHandler
+        * @param       string          $folder         extract only the files from this subfolder
+        */
+       public function __construct($targetDir, $source, $fileHandler = null, $folder = '') {
+               $this->targetDir = FileUtil::addTrailingSlash($targetDir);
+               $this->source = $source;
+               $this->folder = $folder;
+               $this->fileHandler = $fileHandler;
+               $this->install();
+       }
+       
+       /**
+        * Creates the target directory if necessary.
+        */
+       protected function createTargetDir() {
+               if (!@is_dir($this->targetDir)) {
+                       if (!FileUtil::makePath($this->targetDir, (FileUtil::isApacheModule() ? 0777 : 0755))) {
+                               throw new SystemException("Could not create dir '".$this->targetDir."'", 11011);
+                       }
+               }
+               if (FileUtil::isApacheModule() || !is_writeable($this->targetDir)) {
+                       $this->makeWriteable($this->targetDir);
+               }
+       }
+       
+       /**
+        * Creates a directory in the target directory.
+        *
+        * @param       string          $dir
+        */
+       protected function createDir($dir) {
+               if (!@is_dir($this->targetDir.$dir)) {
+                       $oldumask = umask(0);
+                       if (!@mkdir($this->targetDir.$dir, 0755, true)) {
+                               throw new SystemException("Could not create dir '".$this->targetDir.$dir."'", 11011);
+                       }
+                       umask($oldumask);
+               }
+               if (FileUtil::isApacheModule() || !is_writeable($this->targetDir.$dir)) {
+                       $this->makeWriteable($this->targetDir.$dir);
+               }
+       }
+       
+       /**
+        * Touches a file in the target directory.
+        *
+        * @param       string          $file
+        */
+       public function touchFile($file) {
+               @touch($this->targetDir.$file);
+               $this->makeWriteable($this->targetDir.$file);
+       }
+       
+       /**
+        * Creates a file in the target directory.
+        *
+        * @param       string          $file
+        * @param       integer         $index
+        * @param       Tar             $tar
+        */
+       protected function createFile($file, $index, Tar $tar) {
+               $tar->extract($index, $this->targetDir.$file);
+               if (FileUtil::isApacheModule() || !is_writeable($this->targetDir.$file)) {
+                       $this->makeWriteable($this->targetDir.$file);
+               }
+       }
+       
+       /**
+        * Starts the extracting of the files.
+        */
+       protected function install() {
+               $this->createTargetDir();
+               
+               // open source archive
+               $tar = new Tar($this->source);
+               
+               // distinct directories and files
+               $directories = array();
+               $files = array();
+               foreach ($tar->getContentList() as $index => $file) {
+                       if (empty($this->folder) || StringUtil::indexOf($file['filename'], $this->folder) === 0) {
+                               if (!empty($this->folder)) {
+                                       $file['filename'] = StringUtil::replace($this->folder, '', $file['filename']);
+                               }
+                               
+                               // remove leading slash
+                               $file['filename'] = FileUtil::removeLeadingSlash($file['filename']);
+                               if ($file['type'] == 'folder') {
+                                       // remove trailing slash
+                                       $directories[] = FileUtil::removeTrailingSlash($file['filename']);
+                               }
+                               else {
+                                       $files[$index] = $file['filename'];
+                               }
+                       }
+               }
+               
+               $this->checkFiles($files);
+
+               // now create the directories
+               $errors = array();
+               foreach ($directories as $dir) {
+                       try {
+                               $this->createDir($dir);
+                       }
+                       catch (SystemException $e) {
+                               $errors[] = array('file' => $dir, 'code' => $e->getCode(), 'message' => $e->getMessage());
+                       }
+               }
+
+               // now untar all files
+               foreach ($files as $index => $file) {
+                       try {
+                               $this->createFile($file, $index, $tar);
+                       }
+                       catch (SystemException $e) {
+                               $errors[] = array('file' => $file, 'code' => $e->getCode(), 'message' => $e->getMessage());
+                       }
+               }
+               if (count($errors) > 0) {
+                       throw new SystemException('error(s) during the installation of the files.', 11111, $errors);
+               }
+               
+               $this->logFiles($files);
+
+               // close tar
+               $tar->close();
+       }
+       
+       /**
+        * Checkes whether the given files overwriting locked existing files.
+        *
+        * @param       array           $files          list of files
+        */
+       protected function checkFiles(&$files) {
+               if ($this->fileHandler != null && $this->fileHandler instanceof IFileHandler) {
+                       $this->fileHandler->checkFiles($files);
+               }
+       }
+       
+       /**
+        * Logs the extracted files.
+        *
+        * @param       array           $files          list of files
+        */
+       protected function logFiles(&$files) {
+               if ($this->fileHandler != null && $this->fileHandler instanceof IFileHandler) {
+                       $this->fileHandler->logFiles($files);
+               }
+       }
+       
+       /**
+        * Makes a file or directory writeable.
+        *
+        * @param       string          $target
+        */
+       protected function makeWriteable($target) {
+               if (!preg_match('/^WIN/i', PHP_OS)) {
+                       if (!@chmod($target, 0777)) {
+                               //throw new SystemException("Could not chmod file '".$target."'", 11005);
+                       }
+               }
+       }
 }
index e240b25966c3ad23f5732156eb1f50bfc005c123..ae6243d6b75671a57c84bd1d86c127b0db6618f9 100644 (file)
-<?php\r
-namespace wcf\system\setup;\r
-\r
-/**\r
- * Uninstaller deletes files and directories.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.setup\r
- * @category   Community Framework\r
- */\r
-class Uninstaller {\r
-       protected $targetDir, $files, $deleteEmptyTargetDir, $deleteEmptyDirectories;\r
-       \r
-       /**\r
-        * Creates a new Uninstaller object.\r
-        *\r
-        * @param       string          $targetDir\r
-        * @param       array           $files                  delete the files\r
-        * @param       boolean         $deleteEmptyTargetDir   delete target dir if empty\r
-        * @param       boolean         $deleteEmptyDirectories delete sub-directories if empty\r
-        */\r
-       public function __construct($targetDir, $files, $deleteEmptyTargetDir, $deleteEmptyDirectories) {\r
-               $this->targetDir = $targetDir;\r
-               $this->files = $files;\r
-               $this->deleteEmptyTargetDir = $deleteEmptyTargetDir;\r
-               $this->deleteEmptyDirectories = $deleteEmptyDirectories;\r
-               $this->uninstall();\r
-       }\r
-       \r
-       /**\r
-        * Checks if the target directory is a valid directory.\r
-        */\r
-       protected function checkTargetDir() {\r
-               return is_dir($this->targetDir);\r
-       }\r
-       \r
-       /**\r
-        * Returns true if a directory is emtpy.\r
-        *\r
-        * @param       string          $dir\r
-        * @return      boolean                         true if dir is empty\r
-        */\r
-       protected function isEmpty($dir) {\r
-               if (is_dir($dir)) {\r
-                       // subtract default directories . and ..\r
-                       return count(scandir($dir)) - 2 == 0;\r
-               }\r
-               return false;\r
-       }\r
-       \r
-       /**\r
-        * Deletes a file.\r
-        *\r
-        * @param       string          $file\r
-        */\r
-       protected function deleteFile($file) {\r
-               @unlink($file);\r
-       }\r
-       \r
-       /**\r
-        * Deletes a directory.\r
-        *\r
-        * @param       string          $dir\r
-        */\r
-       protected function deleteDir($dir) {\r
-               @rmdir($dir);\r
-       }\r
-       \r
-       /**\r
-        * Starts the deletion of the files.\r
-        */\r
-       protected function uninstall() {\r
-               if ($this->checkTargetDir()) {\r
-                       \r
-                       // delete all files\r
-                       $directories = array();\r
-                       foreach ($this->files as $file) {\r
-                               $this->deleteFile($this->targetDir.$file);\r
-\r
-                               // store directory if this file is not direct in the targetdirectory\r
-                               $dirname = dirname($file);\r
-                               if ($dirname != '.') {\r
-                                       // split the directory\r
-                                       $path = explode("/", $dirname);\r
-                               \r
-                                       // store the directory in a key which is the representation\r
-                                       // for the depth of this directory.\r
-                                       // use dirname as key to store each dir only once\r
-                                       $directories[count($path)][$dirname] = $dirname;\r
-                                       \r
-                                       // store the parent directories\r
-                                       while (array_pop($path)) {\r
-                                               $dirname = implode("/", $path);\r
-                                               if (!empty($dirname)) {\r
-                                                       $directories[count($path)][$dirname] = $dirname;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-                       // delete direcotries\r
-                       if ($this->deleteEmptyDirectories) {\r
-                               // the deepest diretories first\r
-                               krsort($directories, SORT_NUMERIC);\r
-                               foreach ($directories as $depth) {\r
-                                       foreach ($depth as $dir) {\r
-                                               if ($this->isEmpty($this->targetDir.$dir)) {\r
-                                                       $this->deleteDir($this->targetDir.$dir);\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-                       // delete target directory\r
-                       if ($this->deleteEmptyTargetDir && $this->isEmpty($this->targetDir)) {\r
-                               $this->deleteDir($this->targetDir);\r
-                       }\r
-               }\r
-               // TODO: else throw SystemException ?\r
-       }\r
-       \r
+<?php
+namespace wcf\system\setup;
+
+/**
+ * Uninstaller deletes files and directories.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.setup
+ * @category   Community Framework
+ */
+class Uninstaller {
+       protected $targetDir, $files, $deleteEmptyTargetDir, $deleteEmptyDirectories;
+       
+       /**
+        * Creates a new Uninstaller object.
+        *
+        * @param       string          $targetDir
+        * @param       array           $files                  delete the files
+        * @param       boolean         $deleteEmptyTargetDir   delete target dir if empty
+        * @param       boolean         $deleteEmptyDirectories delete sub-directories if empty
+        */
+       public function __construct($targetDir, $files, $deleteEmptyTargetDir, $deleteEmptyDirectories) {
+               $this->targetDir = $targetDir;
+               $this->files = $files;
+               $this->deleteEmptyTargetDir = $deleteEmptyTargetDir;
+               $this->deleteEmptyDirectories = $deleteEmptyDirectories;
+               $this->uninstall();
+       }
+       
+       /**
+        * Checks if the target directory is a valid directory.
+        */
+       protected function checkTargetDir() {
+               return is_dir($this->targetDir);
+       }
+       
+       /**
+        * Returns true if a directory is emtpy.
+        *
+        * @param       string          $dir
+        * @return      boolean                         true if dir is empty
+        */
+       protected function isEmpty($dir) {
+               if (is_dir($dir)) {
+                       // subtract default directories . and ..
+                       return count(scandir($dir)) - 2 == 0;
+               }
+               return false;
+       }
+       
+       /**
+        * Deletes a file.
+        *
+        * @param       string          $file
+        */
+       protected function deleteFile($file) {
+               @unlink($file);
+       }
+       
+       /**
+        * Deletes a directory.
+        *
+        * @param       string          $dir
+        */
+       protected function deleteDir($dir) {
+               @rmdir($dir);
+       }
+       
+       /**
+        * Starts the deletion of the files.
+        */
+       protected function uninstall() {
+               if ($this->checkTargetDir()) {
+                       
+                       // delete all files
+                       $directories = array();
+                       foreach ($this->files as $file) {
+                               $this->deleteFile($this->targetDir.$file);
+
+                               // store directory if this file is not direct in the targetdirectory
+                               $dirname = dirname($file);
+                               if ($dirname != '.') {
+                                       // split the directory
+                                       $path = explode("/", $dirname);
+                               
+                                       // store the directory in a key which is the representation
+                                       // for the depth of this directory.
+                                       // use dirname as key to store each dir only once
+                                       $directories[count($path)][$dirname] = $dirname;
+                                       
+                                       // store the parent directories
+                                       while (array_pop($path)) {
+                                               $dirname = implode("/", $path);
+                                               if (!empty($dirname)) {
+                                                       $directories[count($path)][$dirname] = $dirname;
+                                               }
+                                       }
+                               }
+                       }
+                       
+                       // delete direcotries
+                       if ($this->deleteEmptyDirectories) {
+                               // the deepest diretories first
+                               krsort($directories, SORT_NUMERIC);
+                               foreach ($directories as $depth) {
+                                       foreach ($depth as $dir) {
+                                               if ($this->isEmpty($this->targetDir.$dir)) {
+                                                       $this->deleteDir($this->targetDir.$dir);
+                                               }
+                                       }
+                               }
+                       }
+                       
+                       // delete target directory
+                       if ($this->deleteEmptyTargetDir && $this->isEmpty($this->targetDir)) {
+                               $this->deleteDir($this->targetDir);
+                       }
+               }
+               // TODO: else throw SystemException ?
+       }
+       
 }
index 6c89a61963201f57df9afd6af2ee55db0b5c9cb1..175f44611ac3c4dafaca7ce15ab7cb8790c949f5 100644 (file)
@@ -1,40 +1,40 @@
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Block functions encloses a template block and operate on the contents of this block.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category   Community Framework\r
- */\r
-interface ITemplatePluginBlock {\r
-       /**\r
-        * Executes this template block.\r
-        * \r
-        * @param       array                   $tagArgs\r
-        * @param       string                  $blockContent\r
-        * @param       TemplateEngine          $tplObj\r
-        * @return      string                  output\r
-        */\r
-       public function execute($tagArgs, $blockContent, TemplateEngine $tplObj);\r
-       \r
-       /**\r
-        * Initialises this template block.\r
-        * \r
-        * @param       array                   $tagArgs\r
-        * @param       TemplateEngine          $tplObj\r
-        */\r
-       public function init($tagArgs, TemplateEngine $tplObj);\r
-       \r
-       /**\r
-        * This function is called before every execution of this block function.\r
-        * \r
-        * @param       TemplateEngine          $tplObj\r
-        * @return      boolean\r
-        */\r
-       public function next(TemplateEngine $tplObj);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Block functions encloses a template block and operate on the contents of this block.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template
+ * @category   Community Framework
+ */
+interface ITemplatePluginBlock {
+       /**
+        * Executes this template block.
+        * 
+        * @param       array                   $tagArgs
+        * @param       string                  $blockContent
+        * @param       TemplateEngine          $tplObj
+        * @return      string                  output
+        */
+       public function execute($tagArgs, $blockContent, TemplateEngine $tplObj);
+       
+       /**
+        * Initialises this template block.
+        * 
+        * @param       array                   $tagArgs
+        * @param       TemplateEngine          $tplObj
+        */
+       public function init($tagArgs, TemplateEngine $tplObj);
+       
+       /**
+        * This function is called before every execution of this block function.
+        * 
+        * @param       TemplateEngine          $tplObj
+        * @return      boolean
+        */
+       public function next(TemplateEngine $tplObj);
 }
index 0566fe41394a5e06029356a1f11d27ae9df0ac65..beeb84fa3145a5d2a6c67d4befc5e24149a93913 100644 (file)
@@ -1,31 +1,31 @@
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Compiler functions are called during the compilation of a template.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category   Community Framework\r
- */\r
-interface ITemplatePluginCompiler {\r
-       /**\r
-        * Executes the start tag of this compiler function.\r
-        * \r
-        * @param       array                           $tagArgs                \r
-        * @param       TemplateScriptingCompiler       $compiler\r
-        * @return      string                                          php code        \r
-        */\r
-       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler);\r
-       \r
-       /**\r
-        * Executes the end tag of this compiler function.\r
-        * \r
-        * @param       TemplateScriptingCompiler       $compiler       \r
-        * @return      string                                          php code        \r
-        */\r
-       public function executeEnd(TemplateScriptingCompiler $tplObj);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Compiler functions are called during the compilation of a template.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template
+ * @category   Community Framework
+ */
+interface ITemplatePluginCompiler {
+       /**
+        * Executes the start tag of this compiler function.
+        * 
+        * @param       array                           $tagArgs                
+        * @param       TemplateScriptingCompiler       $compiler
+        * @return      string                                          php code        
+        */
+       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler);
+       
+       /**
+        * Executes the end tag of this compiler function.
+        * 
+        * @param       TemplateScriptingCompiler       $compiler       
+        * @return      string                                          php code        
+        */
+       public function executeEnd(TemplateScriptingCompiler $tplObj);
 }
index 4ec3014e2992312e8334ecb2a4eb87c904856f21..48a526f8643d100aa8daf4b193543cbdfe31a795 100644 (file)
@@ -1,23 +1,23 @@
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Template functions are identical to template blocks, but they have no closing tag.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category   Community Framework\r
- */\r
-interface ITemplatePluginFunction {\r
-       /**\r
-        * Executes this template function.\r
-        * \r
-        * @param       array                   $tagArgs\r
-        * @param       TemplateEngine          $tplObj\r
-        * @return      string                          output\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Template functions are identical to template blocks, but they have no closing tag.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template
+ * @category   Community Framework
+ */
+interface ITemplatePluginFunction {
+       /**
+        * Executes this template function.
+        * 
+        * @param       array                   $tagArgs
+        * @param       TemplateEngine          $tplObj
+        * @return      string                          output
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj);
 }
index 46adf58258548f9eb998d4e0190d2caded7247d8..66f0461ab76a064bb8a327abc8cbc562d1bcd038 100644 (file)
@@ -1,24 +1,24 @@
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Modifiers are functions that are applied to a variable in the template \r
- * before it is displayed or used in some other context.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category   Community Framework\r
- */\r
-interface ITemplatePluginModifier {\r
-       /**\r
-        * Executes this modifier.\r
-        * \r
-        * @param       array                   $tagArgs                \r
-        * @param       TemplateEngine          $tplObj\r
-        * @return      string                  output          \r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Modifiers are functions that are applied to a variable in the template 
+ * before it is displayed or used in some other context.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template
+ * @category   Community Framework
+ */
+interface ITemplatePluginModifier {
+       /**
+        * Executes this modifier.
+        * 
+        * @param       array                   $tagArgs                
+        * @param       TemplateEngine          $tplObj
+        * @return      string                  output          
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj);
 }
index c0e079dccea78ff17985c7beac87ae3dc56ace25..a66a4a89320d687cbd485b40fc4a2763db4a421a 100644 (file)
@@ -1,24 +1,24 @@
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Prefilters are used to process the source of the template immediately before compilation.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category   Community Framework\r
- */\r
-interface ITemplatePluginPrefilter {\r
-       /**\r
-        * Executes this prefilter.\r
-        * \r
-        * @param       string                          $templateName\r
-        * @param       string                          $sourceContent  \r
-        * @param       TemplateScriptingCompiler       $compiler       \r
-        * @return      string                          $sourceContent\r
-        */\r
-       public function execute($templateName, $sourceContent, TemplateScriptingCompiler $compiler);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Prefilters are used to process the source of the template immediately before compilation.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template
+ * @category   Community Framework
+ */
+interface ITemplatePluginPrefilter {
+       /**
+        * Executes this prefilter.
+        * 
+        * @param       string                          $templateName
+        * @param       string                          $sourceContent  
+        * @param       TemplateScriptingCompiler       $compiler       
+        * @return      string                          $sourceContent
+        */
+       public function execute($templateName, $sourceContent, TemplateScriptingCompiler $compiler);
 }
index ee7c8f851946e505d638ac55497329d67cd32d2a..5d46a4d3f2e5c506b78bef81f5ee9bf50fd08f57 100644 (file)
@@ -1,57 +1,57 @@
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * SetupTemplate loads and displays template in the setup process.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category   Community Framework\r
- */\r
-class SetupTemplate extends Template {\r
-       protected $templatePath = '';\r
-       \r
-       /**\r
-        * @see Template::setTemplatePaths()\r
-        */\r
-       public function setTemplatePaths($templatePaths) {\r
-               if (is_array($templatePaths)) $this->templatePath = array_shift($templatePaths);\r
-               else $this->templatePath = $templatePaths;\r
-       }\r
-       \r
-       /**\r
-        * @see Template::loadTemplateStructure()\r
-        */\r
-       protected function loadTemplateStructure() {}\r
-       \r
-       /**\r
-        * @see Template::getSourceFilename()\r
-        */\r
-       public function getSourceFilename($templateName, $packageID = 0) {\r
-               return $this->templatePath.TMP_FILE_PREFIX.$templateName.'.tpl';\r
-       }\r
-       \r
-       /**\r
-        * @see Template::getCompiledFilename()\r
-        */\r
-       public function getCompiledFilename($templateName, $packageID = 0) {\r
-               return $this->compileDir.TMP_FILE_PREFIX.$this->languageID.'_'.$templateName.'.php';\r
-       }\r
-       \r
-       /**\r
-        * @see Template::getPluginFilename()\r
-        */\r
-       public function getPluginFilename($type, $tag) {\r
-               return $this->pluginDir.TMP_FILE_PREFIX.'TemplatePlugin'.StringUtil::firstCharToUpperCase(StringUtil::toLowerCase($type)).StringUtil::firstCharToUpperCase(StringUtil::toLowerCase($tag)).'.class.php';\r
-       }\r
-       \r
-       /**\r
-        * @see Template::getCompiler()\r
-        */\r
-       protected function getCompiler() {\r
-               return new TemplateCompiler($this);\r
-       }\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * SetupTemplate loads and displays template in the setup process.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template
+ * @category   Community Framework
+ */
+class SetupTemplate extends Template {
+       protected $templatePath = '';
+       
+       /**
+        * @see Template::setTemplatePaths()
+        */
+       public function setTemplatePaths($templatePaths) {
+               if (is_array($templatePaths)) $this->templatePath = array_shift($templatePaths);
+               else $this->templatePath = $templatePaths;
+       }
+       
+       /**
+        * @see Template::loadTemplateStructure()
+        */
+       protected function loadTemplateStructure() {}
+       
+       /**
+        * @see Template::getSourceFilename()
+        */
+       public function getSourceFilename($templateName, $packageID = 0) {
+               return $this->templatePath.TMP_FILE_PREFIX.$templateName.'.tpl';
+       }
+       
+       /**
+        * @see Template::getCompiledFilename()
+        */
+       public function getCompiledFilename($templateName, $packageID = 0) {
+               return $this->compileDir.TMP_FILE_PREFIX.$this->languageID.'_'.$templateName.'.php';
+       }
+       
+       /**
+        * @see Template::getPluginFilename()
+        */
+       public function getPluginFilename($type, $tag) {
+               return $this->pluginDir.TMP_FILE_PREFIX.'TemplatePlugin'.StringUtil::firstCharToUpperCase(StringUtil::toLowerCase($type)).StringUtil::firstCharToUpperCase(StringUtil::toLowerCase($tag)).'.class.php';
+       }
+       
+       /**
+        * @see Template::getCompiler()
+        */
+       protected function getCompiler() {
+               return new TemplateCompiler($this);
+       }
 }
index 073c949d6bdac3dbe38e8a7f83dec43b2b3553e7..e8a0ef0bfcfff185863db09350045fd575a8a729 100644 (file)
@@ -1,58 +1,58 @@
-<?php\r
-namespace wcf\system\template;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * SetupTemplateEngine loads and displays template in the setup process.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category   Community Framework\r
- */\r
-class SetupTemplateEngine extends TemplateEngine {\r
-       /**\r
-        * @see TemplateEngine::loadTemplateGroupCache()\r
-        */\r
-       protected function loadTemplateGroupCache() {}\r
-       \r
-       /**\r
-        * @see TemplateEngine::getSourceFilename()\r
-        */\r
-       public function getSourceFilename($templateName, $packageID) {\r
-               return $this->templatePaths[PACKAGE_ID].'setup/template/'.$templateName.'.tpl';\r
-       }\r
-       \r
-       /**\r
-        * @see TemplateEngine::getCompiledFilename()\r
-        */\r
-       public function getCompiledFilename($templateName, $packageID) {\r
-               return $this->compileDir.'setup/template/compiled/'.$this->languageID.'_'.$templateName.'.php';\r
-       }\r
-       \r
-       /**\r
-        * @see TemplateEngine::getPackageID()\r
-        */\r
-       public function getPackageID($templateName, $packageID) {\r
-               $path = $this->templatePaths[PACKAGE_ID].'setup/template/'.$templateName.'.tpl';\r
-               if (file_exists($path)) {\r
-                       return PACKAGE_ID;\r
-               }\r
-               \r
-               throw new SystemException("Unable to find template '$templateName'", 12005);\r
-       }\r
-       \r
-       /**\r
-        * @see TemplateEngine::getCompiler()\r
-        */\r
-       protected function getCompiler() {\r
-               return new TemplateCompiler($this);\r
-       }\r
-       \r
-       /**\r
-        * Template Listener are not available during setup.\r
-        */\r
-       protected function loadTemplateListeners() {}\r
+<?php
+namespace wcf\system\template;
+use wcf\system\exception\SystemException;
+
+/**
+ * SetupTemplateEngine loads and displays template in the setup process.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template
+ * @category   Community Framework
+ */
+class SetupTemplateEngine extends TemplateEngine {
+       /**
+        * @see TemplateEngine::loadTemplateGroupCache()
+        */
+       protected function loadTemplateGroupCache() {}
+       
+       /**
+        * @see TemplateEngine::getSourceFilename()
+        */
+       public function getSourceFilename($templateName, $packageID) {
+               return $this->templatePaths[PACKAGE_ID].'setup/template/'.$templateName.'.tpl';
+       }
+       
+       /**
+        * @see TemplateEngine::getCompiledFilename()
+        */
+       public function getCompiledFilename($templateName, $packageID) {
+               return $this->compileDir.'setup/template/compiled/'.$this->languageID.'_'.$templateName.'.php';
+       }
+       
+       /**
+        * @see TemplateEngine::getPackageID()
+        */
+       public function getPackageID($templateName, $packageID) {
+               $path = $this->templatePaths[PACKAGE_ID].'setup/template/'.$templateName.'.tpl';
+               if (file_exists($path)) {
+                       return PACKAGE_ID;
+               }
+               
+               throw new SystemException("Unable to find template '$templateName'", 12005);
+       }
+       
+       /**
+        * @see TemplateEngine::getCompiler()
+        */
+       protected function getCompiler() {
+               return new TemplateCompiler($this);
+       }
+       
+       /**
+        * Template Listener are not available during setup.
+        */
+       protected function loadTemplateListeners() {}
 }
index ea88880b843e17cfdcafe71eead105420fb56257..b7174ddfe2b3d4d3a15c7557b64abb17d8da57fd 100644 (file)
@@ -1,44 +1,44 @@
-<?php\r
-namespace wcf\system\template;\r
-use wcf\system\io\File;\r
-\r
-/**\r
- * TemplateCompiler compiles template source in valid php code.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category   Community Framework\r
- */\r
-class TemplateCompiler extends TemplateScriptingCompiler {\r
-       /**\r
-        * Compiles the source of a template.\r
-        * \r
-        * @param       string          $templateName\r
-        * @param       string          $sourceContent\r
-        * @param       string          $compiledFilename\r
-        */\r
-       public function compile($templateName, $sourceContent, $compiledFilename) {\r
-               // build fileheader\r
-               $compiledHeader = "<?php\n/**\n* WoltLab Community Framework\n* Template: ".$templateName."\n* Compiled at: ".gmdate('r')."\n* \n* DO NOT EDIT THIS FILE\n*/\n\$this->v['tpl']['template'] = '".addcslashes($templateName, "'\\")."';\n?>\n";\r
-               \r
-               // include Plugins\r
-               $compiledContent = $this->compileString($templateName, $sourceContent);\r
-               \r
-               // write compiled to file\r
-               $file = new File($compiledFilename);\r
-               $file->write($compiledHeader.$compiledContent);\r
-               $file->close();\r
-       }\r
-       \r
-       /**\r
-        * Returns the name of the current template.\r
-        * \r
-        * @return      string\r
-        */\r
-       public function getCurrentTemplate() {\r
-               return $this->getCurrentIdentifier();\r
-       }\r
+<?php
+namespace wcf\system\template;
+use wcf\system\io\File;
+
+/**
+ * TemplateCompiler compiles template source in valid php code.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template
+ * @category   Community Framework
+ */
+class TemplateCompiler extends TemplateScriptingCompiler {
+       /**
+        * Compiles the source of a template.
+        * 
+        * @param       string          $templateName
+        * @param       string          $sourceContent
+        * @param       string          $compiledFilename
+        */
+       public function compile($templateName, $sourceContent, $compiledFilename) {
+               // build fileheader
+               $compiledHeader = "<?php\n/**\n* WoltLab Community Framework\n* Template: ".$templateName."\n* Compiled at: ".gmdate('r')."\n* \n* DO NOT EDIT THIS FILE\n*/\n\$this->v['tpl']['template'] = '".addcslashes($templateName, "'\\")."';\n?>\n";
+               
+               // include Plugins
+               $compiledContent = $this->compileString($templateName, $sourceContent);
+               
+               // write compiled to file
+               $file = new File($compiledFilename);
+               $file->write($compiledHeader.$compiledContent);
+               $file->close();
+       }
+       
+       /**
+        * Returns the name of the current template.
+        * 
+        * @return      string
+        */
+       public function getCurrentTemplate() {
+               return $this->getCurrentIdentifier();
+       }
 }
index ff00f48070ffde4aa845bdf4b4809f11860c95f5..7861d47b1d860eadf7f361e5224936b98b7cf803 100644 (file)
@@ -1,57 +1,57 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\request\LinkHandler;\r
-use wcf\system\template\ITemplatePluginBlock;\r
-use wcf\system\template\TemplateEngine;\r
-\r
-/**\r
- * Shortcut for usage of LinkHandler::getInstance()->getLink() in template scripting.\r
- * \r
- * Usage:\r
- * {link application='wcf'}index.php{/link}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginBlockLink implements ITemplatePluginBlock {\r
-       /**\r
-        * internal loop counter\r
-        * @var integer\r
-        */\r
-       protected $counter = 0;\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginBlock::execute()\r
-        */\r
-       public function execute($tagArgs, $blockContent, TemplateEngine $tplObj) {\r
-               $application = 'wcf';\r
-               if (!empty($tagArgs['application'])) {\r
-                       $application = $tagArgs['application'];\r
-               }\r
-               \r
-               return LinkHandler::getInstance()->getLink($blockContent, $application);\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginBlock::init()\r
-        */\r
-       public function init($tagArgs, TemplateEngine $tplObj) {\r
-               $this->counter = 0;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginBlock::next()\r
-        */\r
-       public function next(TemplateEngine $tplObj) {\r
-               if ($this->counter == 0) {\r
-                       $this->counter++;\r
-                       return true;\r
-               }\r
-               \r
-               return false;\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\request\LinkHandler;
+use wcf\system\template\ITemplatePluginBlock;
+use wcf\system\template\TemplateEngine;
+
+/**
+ * Shortcut for usage of LinkHandler::getInstance()->getLink() in template scripting.
+ * 
+ * Usage:
+ * {link application='wcf'}index.php{/link}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginBlockLink implements ITemplatePluginBlock {
+       /**
+        * internal loop counter
+        * @var integer
+        */
+       protected $counter = 0;
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginBlock::execute()
+        */
+       public function execute($tagArgs, $blockContent, TemplateEngine $tplObj) {
+               $application = 'wcf';
+               if (!empty($tagArgs['application'])) {
+                       $application = $tagArgs['application'];
+               }
+               
+               return LinkHandler::getInstance()->getLink($blockContent, $application);
+       }
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginBlock::init()
+        */
+       public function init($tagArgs, TemplateEngine $tplObj) {
+               $this->counter = 0;
+       }
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginBlock::next()
+        */
+       public function next(TemplateEngine $tplObj) {
+               if ($this->counter == 0) {
+                       $this->counter++;
+                       return true;
+               }
+               
+               return false;
+       }
 }
index 5a1a6f289710cabd38fbb251f4459232b38378e2..d0d9342c32a9579de69e650e2409c76805f8fd96 100644 (file)
@@ -1,41 +1,41 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The 'append' compiler function calls the append function on the template object.\r
- * \r
- * Usage:\r
- * {append var=name value="foo"}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginCompilerAppend implements ITemplatePluginCompiler {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
-        */\r
-       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
-               if (!isset($tagArgs['var'])) {\r
-                       throw new SystemException($compiler->formatSyntaxError("missing 'var' argument in append tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
-               }\r
-               if (!isset($tagArgs['value'])) {\r
-                       throw new SystemException($compiler->formatSyntaxError("missing 'value' argument in append tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
-               }\r
-                               \r
-               return "<?php \$this->append(".$tagArgs['var'].", ".$tagArgs['value']."); ?>";\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
-        */\r
-       public function executeEnd(TemplateScriptingCompiler $compiler) {\r
-               throw new SystemException($compiler->formatSyntaxError("unknown tag {/append}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\exception\SystemException;
+
+/**
+ * The 'append' compiler function calls the append function on the template object.
+ * 
+ * Usage:
+ * {append var=name value="foo"}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginCompilerAppend implements ITemplatePluginCompiler {
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+        */
+       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+               if (!isset($tagArgs['var'])) {
+                       throw new SystemException($compiler->formatSyntaxError("missing 'var' argument in append tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+               }
+               if (!isset($tagArgs['value'])) {
+                       throw new SystemException($compiler->formatSyntaxError("missing 'value' argument in append tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+               }
+                               
+               return "<?php \$this->append(".$tagArgs['var'].", ".$tagArgs['value']."); ?>";
+       }
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+        */
+       public function executeEnd(TemplateScriptingCompiler $compiler) {
+               throw new SystemException($compiler->formatSyntaxError("unknown tag {/append}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);
+       }
 }
index d9c36eaed023530f7a777a5f91a76117e2e5607e..f4c05938bf53d31878a577bc2e49be0100a42687 100644 (file)
@@ -1,41 +1,41 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The 'assign' compiler function calls the assign function on the template object.\r
- * \r
- * Usage:\r
- * {assign var=name value="foo"}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginCompilerAssign implements ITemplatePluginCompiler {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
-        */\r
-       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
-               if (!isset($tagArgs['var'])) {\r
-                       throw new SystemException($compiler->formatSyntaxError("missing 'var' argument in assign tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
-               }\r
-               if (!isset($tagArgs['value'])) {\r
-                       throw new SystemException($compiler->formatSyntaxError("missing 'value' argument in assign tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
-               }\r
-                               \r
-               return "<?php \$this->assign(".$tagArgs['var'].", ".$tagArgs['value']."); ?>";\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
-        */\r
-       public function executeEnd(TemplateScriptingCompiler $compiler) {\r
-               throw new SystemException($compiler->formatSyntaxError("unknown tag {/assign}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\exception\SystemException;
+
+/**
+ * The 'assign' compiler function calls the assign function on the template object.
+ * 
+ * Usage:
+ * {assign var=name value="foo"}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginCompilerAssign implements ITemplatePluginCompiler {
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+        */
+       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+               if (!isset($tagArgs['var'])) {
+                       throw new SystemException($compiler->formatSyntaxError("missing 'var' argument in assign tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+               }
+               if (!isset($tagArgs['value'])) {
+                       throw new SystemException($compiler->formatSyntaxError("missing 'value' argument in assign tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+               }
+                               
+               return "<?php \$this->assign(".$tagArgs['var'].", ".$tagArgs['value']."); ?>";
+       }
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+        */
+       public function executeEnd(TemplateScriptingCompiler $compiler) {
+               throw new SystemException($compiler->formatSyntaxError("unknown tag {/assign}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);
+       }
 }
index c98c3f7f14fa7be31278a048e1392ab6d3bf5a2f..b39837141760d1eaf8a9538f75ffe0eb21e019fc 100644 (file)
@@ -1,44 +1,44 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The 'fetch' compiler function fetches files from the local file system, http, or ftp and displays the content.\r
- * \r
- * Usage:\r
- * {fetch file='x.html'}\r
- * {fetch file='x.html' assign=var}\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginCompilerFetch implements ITemplatePluginCompiler {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
-        */\r
-       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
-               if (!isset($tagArgs['file'])) {\r
-                       throw new SystemException($compiler->formatSyntaxError("missing 'file' argument in fetch tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
-               }\r
-               \r
-               if (isset($tagArgs['assign'])) {\r
-                       return "<?php \$this->assign(".$tagArgs['assign'].", @file_get_contents(".$tagArgs['file'].")); ?>";\r
-               }\r
-               else {\r
-                       return "<?php echo @file_get_contents(".$tagArgs['file']."); ?>";\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
-        */\r
-       public function executeEnd(TemplateScriptingCompiler $compiler) {\r
-               throw new SystemException($compiler->formatSyntaxError("unknown tag {/fetch}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\exception\SystemException;
+
+/**
+ * The 'fetch' compiler function fetches files from the local file system, http, or ftp and displays the content.
+ * 
+ * Usage:
+ * {fetch file='x.html'}
+ * {fetch file='x.html' assign=var}
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginCompilerFetch implements ITemplatePluginCompiler {
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+        */
+       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+               if (!isset($tagArgs['file'])) {
+                       throw new SystemException($compiler->formatSyntaxError("missing 'file' argument in fetch tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+               }
+               
+               if (isset($tagArgs['assign'])) {
+                       return "<?php \$this->assign(".$tagArgs['assign'].", @file_get_contents(".$tagArgs['file'].")); ?>";
+               }
+               else {
+                       return "<?php echo @file_get_contents(".$tagArgs['file']."); ?>";
+               }
+       }
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+        */
+       public function executeEnd(TemplateScriptingCompiler $compiler) {
+               throw new SystemException($compiler->formatSyntaxError("unknown tag {/fetch}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);
+       }
 }
index b43877766995188e8cefd78a3b7378926423d825..beaddf72090b6f0cb7ed82e8cfd2776973ad50e1 100644 (file)
@@ -1,61 +1,61 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'implode' compiler function joins array elements with a string.\r
- * \r
- * Usage:\r
- * {implode from=$array key=bar item=foo glue=";"}{$foo}{/implode}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginCompilerImplode implements ITemplatePluginCompiler {\r
-       protected $tagStack = array();\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
-        */\r
-       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
-               $compiler->pushTag('implode');\r
-               \r
-               if (!isset($tagArgs['from'])) {\r
-                       throw new SystemException($compiler->formatSyntaxError("missing 'from' argument in implode tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
-               }\r
-               if (!isset($tagArgs['item'])) {\r
-                       throw new SystemException($compiler->formatSyntaxError("missing 'item' argument in implode tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
-               }\r
-               \r
-               $hash = StringUtil::getRandomID();\r
-               $glue = isset($tagArgs['glue']) ? $tagArgs['glue'] : "', '";\r
-               $this->tagStack[] = array('hash' => $hash, 'glue' => $glue);\r
-               \r
-               $phpCode = "<?php\n";\r
-               $phpCode .= "\$_length".$hash." = count(".$tagArgs['from'].");\n";\r
-               $phpCode .= "\$_i".$hash." = 0;\n";\r
-               $phpCode .= "foreach (".$tagArgs['from']." as ".(isset($tagArgs['key']) ? (StringUtil::substring($tagArgs['key'], 0, 1) != '$' ? "\$this->v[".$tagArgs['key']."]" : $tagArgs['key'])." => " : '').(StringUtil::substring($tagArgs['item'], 0, 1) != '$' ? "\$this->v[".$tagArgs['item']."]" : $tagArgs['item']).") { ?>";\r
-               return $phpCode;\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
-        */\r
-       public function executeEnd(TemplateScriptingCompiler $compiler) {\r
-               $compiler->popTag('implode');\r
-               $tagArgs = array_pop($this->tagStack);\r
-               \r
-               $phpCode = "<?php\n";\r
-               $phpCode .= "if (++\$_i".$tagArgs['hash']." < \$_length".$tagArgs['hash'].") { echo ".$tagArgs['glue']."; }\n";\r
-               $phpCode .= "} ?>";\r
-               \r
-               return $phpCode;\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\exception\SystemException;
+use wcf\util\StringUtil;
+
+/**
+ * The 'implode' compiler function joins array elements with a string.
+ * 
+ * Usage:
+ * {implode from=$array key=bar item=foo glue=";"}{$foo}{/implode}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginCompilerImplode implements ITemplatePluginCompiler {
+       protected $tagStack = array();
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+        */
+       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+               $compiler->pushTag('implode');
+               
+               if (!isset($tagArgs['from'])) {
+                       throw new SystemException($compiler->formatSyntaxError("missing 'from' argument in implode tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+               }
+               if (!isset($tagArgs['item'])) {
+                       throw new SystemException($compiler->formatSyntaxError("missing 'item' argument in implode tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+               }
+               
+               $hash = StringUtil::getRandomID();
+               $glue = isset($tagArgs['glue']) ? $tagArgs['glue'] : "', '";
+               $this->tagStack[] = array('hash' => $hash, 'glue' => $glue);
+               
+               $phpCode = "<?php\n";
+               $phpCode .= "\$_length".$hash." = count(".$tagArgs['from'].");\n";
+               $phpCode .= "\$_i".$hash." = 0;\n";
+               $phpCode .= "foreach (".$tagArgs['from']." as ".(isset($tagArgs['key']) ? (StringUtil::substring($tagArgs['key'], 0, 1) != '$' ? "\$this->v[".$tagArgs['key']."]" : $tagArgs['key'])." => " : '').(StringUtil::substring($tagArgs['item'], 0, 1) != '$' ? "\$this->v[".$tagArgs['item']."]" : $tagArgs['item']).") { ?>";
+               return $phpCode;
+       }
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+        */
+       public function executeEnd(TemplateScriptingCompiler $compiler) {
+               $compiler->popTag('implode');
+               $tagArgs = array_pop($this->tagStack);
+               
+               $phpCode = "<?php\n";
+               $phpCode .= "if (++\$_i".$tagArgs['hash']." < \$_length".$tagArgs['hash'].") { echo ".$tagArgs['glue']."; }\n";
+               $phpCode .= "} ?>";
+               
+               return $phpCode;
+       }
 }
index 9d7c00d209b46fa672508183d97b1d23cbf1e802..a1a76c612ac3533cf91a0620304d6aa8c41bb341 100644 (file)
@@ -1,45 +1,45 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'lang' compiler function compiles dynamic language variables.\r
- * \r
- * Usage:\r
- * {lang}$blah{/lang}\r
- * {lang var=$x}foo{/lang}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginCompilerLang implements ITemplatePluginCompiler {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
-        */\r
-       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
-               $compiler->pushTag('lang');\r
-               \r
-               $newTagArgs = array();\r
-               foreach ($tagArgs as $key => $arg) {\r
-                       $newTagArgs[$key] = 'wcf\util\StringUtil::encodeHTML('.$arg.')';\r
-               }\r
-               \r
-               $tagArgs = $compiler->makeArgString($newTagArgs);\r
-               return "<?php \$this->tagStack[] = array('lang', array($tagArgs)); ob_start(); ?>";\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
-        */\r
-       public function executeEnd(TemplateScriptingCompiler $compiler) {\r
-               $compiler->popTag('lang');\r
-               $hash = StringUtil::getRandomID();\r
-               return "<?php \$_lang".$hash." = ob_get_contents(); ob_end_clean(); echo wcf\system\WCF::getLanguage()->getDynamicVariable(\$_lang".$hash.", \$this->tagStack[count(\$this->tagStack) - 1][1]); array_pop(\$this->tagStack); ?>";\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\util\StringUtil;
+
+/**
+ * The 'lang' compiler function compiles dynamic language variables.
+ * 
+ * Usage:
+ * {lang}$blah{/lang}
+ * {lang var=$x}foo{/lang}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginCompilerLang implements ITemplatePluginCompiler {
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+        */
+       public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+               $compiler->pushTag('lang');
+               
+               $newTagArgs = array();
+               foreach ($tagArgs as $key => $arg) {
+                       $newTagArgs[$key] = 'wcf\util\StringUtil::encodeHTML('.$arg.')';
+               }
+               
+               $tagArgs = $compiler->makeArgString($newTagArgs);
+               return "<?php \$this->tagStack[] = array('lang', array($tagArgs)); ob_start(); ?>";
+       }
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+        */
+       public function executeEnd(TemplateScriptingCompiler $compiler) {
+               $compiler->popTag('lang');
+               $hash = StringUtil::getRandomID();
+               return "<?php \$_lang".$hash." = ob_get_contents(); ob_end_clean(); echo wcf\system\WCF::getLanguage()->getDynamicVariable(\$_lang".$hash.", \$this->tagStack[count(\$this->tagStack) - 1][1]); array_pop(\$this->tagStack); ?>";
+       }
 }
index 854ef545fac908c2e95d4fac6204b95b82f7d340..ccc80f0ef4c61d5995b957b6cb51dfcab2e1e69c 100644 (file)
@@ -1,77 +1,77 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginFunction;\r
-use wcf\system\template\TemplateEngine;\r
-\r
-/**\r
- * The 'counter' template function is used to print out a count.\r
- * \r
- * Usage:\r
- * {counter assign=i}\r
- * {counter start=10 skip=2}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginFunctionCounter implements ITemplatePluginFunction {\r
-       protected $counters = array();\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginFunction::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               if (!isset($tagArgs['name'])) {\r
-                       $tagArgs['name'] = 'default';\r
-               }\r
-\r
-               if (!isset($this->counters[$tagArgs['name']])) {\r
-                       $this->counters[$tagArgs['name']] = array(\r
-                               'start' => 1,\r
-                               'skip' => 1,\r
-                               'direction' => 'up',\r
-                               'count' => 1\r
-                       );\r
-               }\r
-\r
-               $counter =& $this->counters[$tagArgs['name']];\r
-\r
-               if (isset($tagArgs['start'])) {\r
-                       $counter['start'] = $counter['count'] = intval($tagArgs['start']);\r
-               }\r
-\r
-               if (isset($tagArgs['assign']) && !empty($tagArgs['assign'])) {\r
-                       $counter['assign'] = $tagArgs['assign'];\r
-               }\r
-\r
-               if (isset($counter['assign'])) {\r
-                       $tplObj->assign($counter['assign'], $counter['count']);\r
-               }\r
-\r
-               $result = null;\r
-               if (!isset($tagArgs['print']) || $tagArgs['print']) {\r
-                       $result = $counter['count'];\r
-               } \r
-               \r
-               if (isset($tagArgs['skip'])) {\r
-                       $counter['skip'] = intval($tagArgs['skip']);\r
-               }\r
-\r
-               // get direction\r
-               if (isset($tagArgs['direction'])) {\r
-                       $counter['direction'] = $tagArgs['direction'];\r
-               }\r
-\r
-               if ($counter['direction'] == 'down') {\r
-                       $counter['count'] -= $counter['skip'];\r
-               }\r
-               else {\r
-                       $counter['count'] += $counter['skip'];\r
-               }\r
-\r
-               return $result;\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginFunction;
+use wcf\system\template\TemplateEngine;
+
+/**
+ * The 'counter' template function is used to print out a count.
+ * 
+ * Usage:
+ * {counter assign=i}
+ * {counter start=10 skip=2}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginFunctionCounter implements ITemplatePluginFunction {
+       protected $counters = array();
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginFunction::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               if (!isset($tagArgs['name'])) {
+                       $tagArgs['name'] = 'default';
+               }
+
+               if (!isset($this->counters[$tagArgs['name']])) {
+                       $this->counters[$tagArgs['name']] = array(
+                               'start' => 1,
+                               'skip' => 1,
+                               'direction' => 'up',
+                               'count' => 1
+                       );
+               }
+
+               $counter =& $this->counters[$tagArgs['name']];
+
+               if (isset($tagArgs['start'])) {
+                       $counter['start'] = $counter['count'] = intval($tagArgs['start']);
+               }
+
+               if (isset($tagArgs['assign']) && !empty($tagArgs['assign'])) {
+                       $counter['assign'] = $tagArgs['assign'];
+               }
+
+               if (isset($counter['assign'])) {
+                       $tplObj->assign($counter['assign'], $counter['count']);
+               }
+
+               $result = null;
+               if (!isset($tagArgs['print']) || $tagArgs['print']) {
+                       $result = $counter['count'];
+               } 
+               
+               if (isset($tagArgs['skip'])) {
+                       $counter['skip'] = intval($tagArgs['skip']);
+               }
+
+               // get direction
+               if (isset($tagArgs['direction'])) {
+                       $counter['direction'] = $tagArgs['direction'];
+               }
+
+               if ($counter['direction'] == 'down') {
+                       $counter['count'] -= $counter['skip'];
+               }
+               else {
+                       $counter['count'] += $counter['skip'];
+               }
+
+               return $result;
+       }
 }
index 79764ecec6f8a3407da8ffdbc909643603490e12..54d15818cb1101c5c190aa37af16fc76421050a4 100644 (file)
@@ -1,92 +1,92 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\ITemplatePluginFunction;\r
-use wcf\system\template\TemplateEngine;\r
-\r
-/**\r
- * The 'cycle' template function cycles through given values.\r
- * \r
- * Usage:\r
- * {cycle values="#eee,#fff"}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginFunctionCycle implements ITemplatePluginFunction {\r
-       protected $cycles = array();\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginFunction::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               // get params\r
-               $name = isset($tagArgs['name']) ? $tagArgs['name'] : 'default';\r
-               $print = isset($tagArgs['print']) ? $tagArgs['print'] : 1;\r
-               $advance = isset($tagArgs['advance']) ? $tagArgs['advance'] : 1;\r
-               $reset = isset($tagArgs['reset']) ? $tagArgs['reset'] : 0;\r
-               \r
-               // get values\r
-               if (!isset($tagArgs['values']) ) {\r
-                       if (!isset($this->cycles[$name]['values'])) {\r
-                               throw new SystemException("missing 'values' argument in cycle tag", 12001);\r
-                       }\r
-               }\r
-               else {\r
-                       if (isset($this->cycles[$name]['values']) && $this->cycles[$name]['values'] != $tagArgs['values'] ) {\r
-                               $this->cycles[$name]['index'] = 0;\r
-                       }\r
-                       $this->cycles[$name]['values'] = $tagArgs['values'];\r
-               }\r
-               \r
-               // get delimiter\r
-               if (!isset($this->cycles[$name]['delimiter'])) {\r
-                       // set default delimiter\r
-                       $this->cycles[$name]['delimiter'] = ',';\r
-               }\r
-               if (isset($tagArgs['delimiter'])) {\r
-                       $this->cycles[$name]['delimiter'] = $tagArgs['delimiter'];\r
-               }\r
-               \r
-               // split values\r
-               if (is_array($this->cycles[$name]['values'])) {\r
-                       $cycleArray = $this->cycles[$name]['values'];\r
-               }\r
-               else {\r
-                       $cycleArray = explode($this->cycles[$name]['delimiter'], $this->cycles[$name]['values']);\r
-               }\r
-               \r
-               // set index\r
-               if (!isset($this->cycles[$name]['index']) || $reset) {\r
-                       $this->cycles[$name]['index'] = 0;\r
-               }\r
-               \r
-               // get result\r
-               $result = $cycleArray[$this->cycles[$name]['index']];\r
-               \r
-               // assign result to template var\r
-               if (isset($tagArgs['assign'])) {\r
-                       $print = false;\r
-                       $tplObj->assign($tagArgs['assign'], $result);\r
-               }\r
-               \r
-               // update index\r
-               if ($advance) {\r
-                       if ($this->cycles[$name]['index'] >= count($cycleArray) - 1) {\r
-                               $this->cycles[$name]['index'] = 0;\r
-                       }\r
-                       else {\r
-                               $this->cycles[$name]['index']++;\r
-                       }\r
-               }\r
-               \r
-               // print var\r
-               if ($print) {\r
-                       return $result;\r
-               }\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\exception\SystemException;
+use wcf\system\template\ITemplatePluginFunction;
+use wcf\system\template\TemplateEngine;
+
+/**
+ * The 'cycle' template function cycles through given values.
+ * 
+ * Usage:
+ * {cycle values="#eee,#fff"}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginFunctionCycle implements ITemplatePluginFunction {
+       protected $cycles = array();
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginFunction::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               // get params
+               $name = isset($tagArgs['name']) ? $tagArgs['name'] : 'default';
+               $print = isset($tagArgs['print']) ? $tagArgs['print'] : 1;
+               $advance = isset($tagArgs['advance']) ? $tagArgs['advance'] : 1;
+               $reset = isset($tagArgs['reset']) ? $tagArgs['reset'] : 0;
+               
+               // get values
+               if (!isset($tagArgs['values']) ) {
+                       if (!isset($this->cycles[$name]['values'])) {
+                               throw new SystemException("missing 'values' argument in cycle tag", 12001);
+                       }
+               }
+               else {
+                       if (isset($this->cycles[$name]['values']) && $this->cycles[$name]['values'] != $tagArgs['values'] ) {
+                               $this->cycles[$name]['index'] = 0;
+                       }
+                       $this->cycles[$name]['values'] = $tagArgs['values'];
+               }
+               
+               // get delimiter
+               if (!isset($this->cycles[$name]['delimiter'])) {
+                       // set default delimiter
+                       $this->cycles[$name]['delimiter'] = ',';
+               }
+               if (isset($tagArgs['delimiter'])) {
+                       $this->cycles[$name]['delimiter'] = $tagArgs['delimiter'];
+               }
+               
+               // split values
+               if (is_array($this->cycles[$name]['values'])) {
+                       $cycleArray = $this->cycles[$name]['values'];
+               }
+               else {
+                       $cycleArray = explode($this->cycles[$name]['delimiter'], $this->cycles[$name]['values']);
+               }
+               
+               // set index
+               if (!isset($this->cycles[$name]['index']) || $reset) {
+                       $this->cycles[$name]['index'] = 0;
+               }
+               
+               // get result
+               $result = $cycleArray[$this->cycles[$name]['index']];
+               
+               // assign result to template var
+               if (isset($tagArgs['assign'])) {
+                       $print = false;
+                       $tplObj->assign($tagArgs['assign'], $result);
+               }
+               
+               // update index
+               if ($advance) {
+                       if ($this->cycles[$name]['index'] >= count($cycleArray) - 1) {
+                               $this->cycles[$name]['index'] = 0;
+                       }
+                       else {
+                               $this->cycles[$name]['index']++;
+                       }
+               }
+               
+               // print var
+               if ($print) {
+                       return $result;
+               }
+       }
 }
index 481fee44d922cfc32fe4a20b3d1287b2ebab1741..a6bd7f8a2e25f5fe35fba0c1895164a7dca12c38 100644 (file)
@@ -1,88 +1,88 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\ITemplatePluginFunction;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'htmlcheckboxes' template function generates a list of html checkboxes.\r
- * \r
- * Usage:\r
- * {htmlcheckboxes name="x" options=$array}\r
- * {htmlcheckboxes name="x" options=$array selected=$foo}\r
- * {htmlcheckboxes name="x" output=$outputArray}\r
- * {htmlcheckboxes name="x" output=$outputArray values=$valueArray}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginFunctionHtmlcheckboxes implements ITemplatePluginFunction {\r
-       protected $disableEncoding = false;\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginFunction::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               // get options\r
-               if (isset($tagArgs['output']) && is_array($tagArgs['output'])) {\r
-                       if (isset($tagArgs['values']) && is_array($tagArgs['values'])) {\r
-                               $tagArgs['options'] = array_combine($tagArgs['values'], $tagArgs['output']);\r
-                       }\r
-                       else {\r
-                               $tagArgs['options'] = array_combine($tagArgs['output'], $tagArgs['output']);\r
-                       }\r
-               }\r
-\r
-               if (!isset($tagArgs['options']) || !is_array($tagArgs['options'])) {\r
-                       throw new SystemException("missing 'options' argument in htmlCheckboxes tag", 12001);\r
-               }\r
-               \r
-               if (!isset($tagArgs['name'])) {\r
-                       throw new SystemException("missing 'name' argument in htmlCheckboxes tag", 12001);\r
-               }\r
-               \r
-               if (isset($tagArgs['disableEncoding']) && $tagArgs['disableEncoding']) {\r
-                       $this->disableEncoding = true;\r
-               }\r
-               else {\r
-                       $this->disableEncoding = false;\r
-               }\r
-               \r
-               // get selected values\r
-               if (isset($tagArgs['selected'])) {\r
-                       if (!is_array($tagArgs['selected'])) $tagArgs['selected'] = array($tagArgs['selected']);        \r
-               }\r
-               else {\r
-                       $tagArgs['selected'] = array();\r
-               }\r
-               if (!isset($tagArgs['separator'])) {\r
-                       $tagArgs['separator'] = '';\r
-               }\r
-               \r
-               // build html\r
-               $html = '';\r
-               foreach ($tagArgs['options'] as $key => $value) {\r
-                       if (!empty($html)) $html .= $tagArgs['separator'];\r
-                       $html .= '<label><input type="checkbox" name="'.$this->encodeHTML($tagArgs['name']).'[]" value="'.$this->encodeHTML($key).'"'.(in_array($key, $tagArgs['selected']) ? ' checked="checked"' : '').' /> '.$this->encodeHTML($value).'</label>';                   \r
-               }\r
-               \r
-               return $html;\r
-       }\r
-       \r
-       /**\r
-        * Executes StringUtil::encodeHTML on the given text if disableEncoding is false.\r
-        * @see StringUtil::encodeHTML()\r
-        */\r
-       protected function encodeHTML($text) {\r
-               if (!$this->disableEncoding) {\r
-                       $text = StringUtil::encodeHTML($text);\r
-               }\r
-               \r
-               return $text;\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\exception\SystemException;
+use wcf\system\template\ITemplatePluginFunction;
+use wcf\system\template\TemplateEngine;
+use wcf\util\StringUtil;
+
+/**
+ * The 'htmlcheckboxes' template function generates a list of html checkboxes.
+ * 
+ * Usage:
+ * {htmlcheckboxes name="x" options=$array}
+ * {htmlcheckboxes name="x" options=$array selected=$foo}
+ * {htmlcheckboxes name="x" output=$outputArray}
+ * {htmlcheckboxes name="x" output=$outputArray values=$valueArray}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginFunctionHtmlcheckboxes implements ITemplatePluginFunction {
+       protected $disableEncoding = false;
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginFunction::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               // get options
+               if (isset($tagArgs['output']) && is_array($tagArgs['output'])) {
+                       if (isset($tagArgs['values']) && is_array($tagArgs['values'])) {
+                               $tagArgs['options'] = array_combine($tagArgs['values'], $tagArgs['output']);
+                       }
+                       else {
+                               $tagArgs['options'] = array_combine($tagArgs['output'], $tagArgs['output']);
+                       }
+               }
+
+               if (!isset($tagArgs['options']) || !is_array($tagArgs['options'])) {
+                       throw new SystemException("missing 'options' argument in htmlCheckboxes tag", 12001);
+               }
+               
+               if (!isset($tagArgs['name'])) {
+                       throw new SystemException("missing 'name' argument in htmlCheckboxes tag", 12001);
+               }
+               
+               if (isset($tagArgs['disableEncoding']) && $tagArgs['disableEncoding']) {
+                       $this->disableEncoding = true;
+               }
+               else {
+                       $this->disableEncoding = false;
+               }
+               
+               // get selected values
+               if (isset($tagArgs['selected'])) {
+                       if (!is_array($tagArgs['selected'])) $tagArgs['selected'] = array($tagArgs['selected']);        
+               }
+               else {
+                       $tagArgs['selected'] = array();
+               }
+               if (!isset($tagArgs['separator'])) {
+                       $tagArgs['separator'] = '';
+               }
+               
+               // build html
+               $html = '';
+               foreach ($tagArgs['options'] as $key => $value) {
+                       if (!empty($html)) $html .= $tagArgs['separator'];
+                       $html .= '<label><input type="checkbox" name="'.$this->encodeHTML($tagArgs['name']).'[]" value="'.$this->encodeHTML($key).'"'.(in_array($key, $tagArgs['selected']) ? ' checked="checked"' : '').' /> '.$this->encodeHTML($value).'</label>';                   
+               }
+               
+               return $html;
+       }
+       
+       /**
+        * Executes StringUtil::encodeHTML on the given text if disableEncoding is false.
+        * @see StringUtil::encodeHTML()
+        */
+       protected function encodeHTML($text) {
+               if (!$this->disableEncoding) {
+                       $text = StringUtil::encodeHTML($text);
+               }
+               
+               return $text;
+       }
 }
index 9ab01ebf6f7509036636033f9006a689c00ba8bc..4f6e3d9e1937d3fab15db71aebaaff5e50cfb985 100644 (file)
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'htmloptions' template function generates the options of an html select list.\r
- * \r
- * Usage:\r
- * {htmloptions options=$array}\r
- * {htmloptions options=$array selected=$foo}\r
- * {htmloptions options=$array name="x"}\r
- * {htmloptions output=$outputArray}\r
- * {htmloptions output=$outputArray values=$valueArray}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginFunctionHtmloptions extends TemplatePluginFunctionHtmlcheckboxes {\r
-       protected $selected = array();\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginFunction::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               if (isset($tagArgs['output']) && is_array($tagArgs['output'])) {\r
-                       if (count($tagArgs['output'])) {\r
-                               if (isset($tagArgs['values']) && is_array($tagArgs['values'])) {\r
-                                       if (count($tagArgs['output']) == count($tagArgs['values'])) {\r
-                                               $tagArgs['options'] = array_combine($tagArgs['values'], $tagArgs['output']);\r
-                                       }\r
-                                       else {\r
-                                               $tagArgs['options'] = array();\r
-                                       }\r
-                               }\r
-                               else {\r
-                                       $tagArgs['options'] = array_combine($tagArgs['output'], $tagArgs['output']);\r
-                               }\r
-                       }\r
-                       else {\r
-                               $tagArgs['options'] = array();\r
-                       }\r
-               }\r
-\r
-               if (!isset($tagArgs['options']) || !is_array($tagArgs['options'])) {\r
-                       throw new SystemException("missing 'options' argument in htmloptions tag", 12001);\r
-               }\r
-               \r
-               if (isset($tagArgs['disableEncoding']) && $tagArgs['disableEncoding']) {\r
-                       $this->disableEncoding = true;\r
-               }\r
-               else {\r
-                       $this->disableEncoding = false;\r
-               }\r
-               \r
-               // get selected values\r
-               $this->selected = array();\r
-               if (isset($tagArgs['selected'])) {\r
-                       $this->selected = $tagArgs['selected'];\r
-                       if (!is_array($this->selected)) $this->selected = array($this->selected);       \r
-               }\r
-               \r
-               // create option list\r
-               $htmloptions = $this->makeOptionGroup(null, $tagArgs['options']);\r
-               \r
-               // create also a 'select' tag\r
-               if (isset($tagArgs['name'])) {\r
-                       // unset all system vars\r
-                       unset($tagArgs['options'], $tagArgs['selected'], $tagArgs['output'], $tagArgs['values'], $tagArgs['disableEncoding']);\r
-                       \r
-                       // generate 'select' parameters\r
-                       $params = '';\r
-                       foreach ($tagArgs as $key => $value) {\r
-                               $params .= ' '.$key.'="'.$this->encodeHTML($value).'"';\r
-                       }\r
-                       \r
-                       $htmloptions = '<select'.$params.'>'."\n".$htmloptions."</select>\n";\r
-               }\r
-               \r
-               return $htmloptions;\r
-       }\r
-       \r
-       /**\r
-        * Makes the html for an option group.\r
-        * \r
-        * @param       string          $key\r
-        * @param       array           $values\r
-        * @return      string                          html code of an option group\r
-        */\r
-       protected function makeOptionGroup($key, $values) {\r
-               $html = '';\r
-               if ($key !== null) {\r
-                       $html = '<optgroup label="'.$this->encodeHTML($key).'">'."\n";\r
-               }\r
-               \r
-               foreach ($values as $childKey => $value) {\r
-                       if (is_array($value)) {\r
-                               $html .= $this->makeOptionGroup($childKey, $value);\r
-                       }\r
-                       else {\r
-                               $html .= $this->makeOption($childKey, $value);\r
-                       }\r
-               }\r
-               \r
-               if ($key !== null) {\r
-                       $html .= "</optgroup>\n";\r
-               }\r
-               \r
-               return $html;\r
-       }\r
-       \r
-       /**\r
-        * Makes the html for an option.\r
-        * \r
-        * @param       string          $key\r
-        * @param       string          $value\r
-        * @return      string                          html code of an option tag\r
-        */\r
-       protected function makeOption($key, $value) {\r
-               $value = $this->encodeHTML($value);\r
-               return '<option label="'.$value.'" value="'.$this->encodeHTML($key).'"'.(in_array($key, $this->selected) ? ' selected="selected"' : '').'>'.$value."</option>\n";\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\exception\SystemException;
+use wcf\system\template\TemplateEngine;
+use wcf\util\StringUtil;
+
+/**
+ * The 'htmloptions' template function generates the options of an html select list.
+ * 
+ * Usage:
+ * {htmloptions options=$array}
+ * {htmloptions options=$array selected=$foo}
+ * {htmloptions options=$array name="x"}
+ * {htmloptions output=$outputArray}
+ * {htmloptions output=$outputArray values=$valueArray}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginFunctionHtmloptions extends TemplatePluginFunctionHtmlcheckboxes {
+       protected $selected = array();
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginFunction::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               if (isset($tagArgs['output']) && is_array($tagArgs['output'])) {
+                       if (count($tagArgs['output'])) {
+                               if (isset($tagArgs['values']) && is_array($tagArgs['values'])) {
+                                       if (count($tagArgs['output']) == count($tagArgs['values'])) {
+                                               $tagArgs['options'] = array_combine($tagArgs['values'], $tagArgs['output']);
+                                       }
+                                       else {
+                                               $tagArgs['options'] = array();
+                                       }
+                               }
+                               else {
+                                       $tagArgs['options'] = array_combine($tagArgs['output'], $tagArgs['output']);
+                               }
+                       }
+                       else {
+                               $tagArgs['options'] = array();
+                       }
+               }
+
+               if (!isset($tagArgs['options']) || !is_array($tagArgs['options'])) {
+                       throw new SystemException("missing 'options' argument in htmloptions tag", 12001);
+               }
+               
+               if (isset($tagArgs['disableEncoding']) && $tagArgs['disableEncoding']) {
+                       $this->disableEncoding = true;
+               }
+               else {
+                       $this->disableEncoding = false;
+               }
+               
+               // get selected values
+               $this->selected = array();
+               if (isset($tagArgs['selected'])) {
+                       $this->selected = $tagArgs['selected'];
+                       if (!is_array($this->selected)) $this->selected = array($this->selected);       
+               }
+               
+               // create option list
+               $htmloptions = $this->makeOptionGroup(null, $tagArgs['options']);
+               
+               // create also a 'select' tag
+               if (isset($tagArgs['name'])) {
+                       // unset all system vars
+                       unset($tagArgs['options'], $tagArgs['selected'], $tagArgs['output'], $tagArgs['values'], $tagArgs['disableEncoding']);
+                       
+                       // generate 'select' parameters
+                       $params = '';
+                       foreach ($tagArgs as $key => $value) {
+                               $params .= ' '.$key.'="'.$this->encodeHTML($value).'"';
+                       }
+                       
+                       $htmloptions = '<select'.$params.'>'."\n".$htmloptions."</select>\n";
+               }
+               
+               return $htmloptions;
+       }
+       
+       /**
+        * Makes the html for an option group.
+        * 
+        * @param       string          $key
+        * @param       array           $values
+        * @return      string                          html code of an option group
+        */
+       protected function makeOptionGroup($key, $values) {
+               $html = '';
+               if ($key !== null) {
+                       $html = '<optgroup label="'.$this->encodeHTML($key).'">'."\n";
+               }
+               
+               foreach ($values as $childKey => $value) {
+                       if (is_array($value)) {
+                               $html .= $this->makeOptionGroup($childKey, $value);
+                       }
+                       else {
+                               $html .= $this->makeOption($childKey, $value);
+                       }
+               }
+               
+               if ($key !== null) {
+                       $html .= "</optgroup>\n";
+               }
+               
+               return $html;
+       }
+       
+       /**
+        * Makes the html for an option.
+        * 
+        * @param       string          $key
+        * @param       string          $value
+        * @return      string                          html code of an option tag
+        */
+       protected function makeOption($key, $value) {
+               $value = $this->encodeHTML($value);
+               return '<option label="'.$value.'" value="'.$this->encodeHTML($key).'"'.(in_array($key, $this->selected) ? ' selected="selected"' : '').'>'.$value."</option>\n";
+       }
 }
index 24a3014408c342763a96edefe6b18f9329be42d1..9529ebb001bfe20439e1d94989fc80c1713fdeba 100644 (file)
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\WCF;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginFunction;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'pages' template function is used to generate sliding pagers.\r
- * \r
- * Usage:\r
- * {pages pages=10 link='page-%d.html'}\r
- * {pages page=8 pages=10 link='page-%d.html'}\r
- * \r
- * assign to variable 'output'; do not print: \r
- * {pages page=8 pages=10 link='page-%d.html' assign='output'}\r
- * \r
- * assign to variable 'output' and do print also:\r
- * {pages page=8 pages=10 link='page-%d.html' assign='output' print=true}\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginFunctionPages implements ITemplatePluginFunction {\r
-       const SHOW_LINKS = 11;\r
-       const SHOW_SUB_LINKS = 20;\r
-       \r
-       /**\r
-        * Inserts the page number into the link.\r
-        * \r
-        * @param       string          $link\r
-        * @param       integer         $pageNo\r
-        * @return      string          final link\r
-        */\r
-       protected static function insertPageNumber($link, $pageNo) {\r
-               $startPos = StringUtil::indexOf($link, '%d');\r
-               if ($startPos !== null) $link = StringUtil::substring($link, 0, $startPos) . $pageNo . StringUtil::substring($link, $startPos + 2);\r
-               return $link;\r
-       }\r
-       \r
-       /**\r
-        * Generates html code of a link.\r
-        * \r
-        * @param       string          $link\r
-        * @param       integer         $pageNo\r
-        * @param       integer         $activePage\r
-        * @param       boolean         $break\r
-        * @return      string\r
-        */\r
-       protected function makeLink($link, $pageNo, $activePage, $break = false) {\r
-               // first page\r
-               if ($activePage != $pageNo) {\r
-                       return '<li'.($break ? ' class="break"' : '').'><a href="'.$this->insertPageNumber($link, $pageNo).'">'.StringUtil::formatInteger($pageNo).'</a></li>'."\n";\r
-               }\r
-               else {\r
-                       return '<li class="'.($break ? 'break ' : '').'active"><span>'.StringUtil::formatInteger($pageNo).'</span></li>'."\n";\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginFunction::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               // needed params: link, page, pages\r
-               if (!isset($tagArgs['link'])) throw new SystemException("missing 'link' argument in pages tag", 12001);\r
-               if (!isset($tagArgs['pages'])) {\r
-                       if (($tagArgs['pages'] = $tplObj->get('pages')) === null) {\r
-                               throw new SystemException("missing 'pages' argument in pages tag", 12001);\r
-                       }\r
-               }\r
-               \r
-               $html = '';\r
-               \r
-               if ($tagArgs['pages'] > 1) {\r
-                       // define page link for js function\r
-                       $html .= "<script type=\"text/javascript\">\n//<![CDATA[\nmultiPagesLinks.setPageLink('".StringUtil::replace("'", "\'", $tagArgs['link'])."');\n//]]>\n</script>";\r
-                       \r
-                       // encode link\r
-                       $tagArgs['link'] = StringUtil::encodeHTML($tagArgs['link']);\r
-               \r
-                       if (!isset($tagArgs['page'])) {\r
-                               if (($tagArgs['page'] = $tplObj->get('pageNo')) === null) {\r
-                                       $tagArgs['page'] = 0;\r
-                               }\r
-                       }\r
-                       \r
-                       // open div and ul\r
-                       $html .= "<div class=\"pageNavigation\">\n<ul>\n";\r
-                       \r
-                       // previous page\r
-                       $previousTitle = WCF::getLanguage()->getDynamicVariable('wcf.global.page.previous');\r
-                       if ($tagArgs['page'] > 1) {\r
-                               $html .= '<li class="skip"><a href="'.$this->insertPageNumber($tagArgs['link'], $tagArgs['page'] - 1).'" title="'.$previousTitle.'"><img src="'.self::getIconPath('previousS.png').'" alt="" /></a></li>'."\n";\r
-                       }\r
-                       else {\r
-                               $html .= '<li class="skip"><img src="'.self::getIconPath('previousDisabledS.png').'" alt="" /></li>'."\n";\r
-                       }\r
-                       \r
-                       // first page\r
-                       $html .= $this->makeLink($tagArgs['link'], 1, $tagArgs['page']);\r
-                       \r
-                       // calculate page links\r
-                       $maxLinks = self::SHOW_LINKS - 4;\r
-                       $linksBeforePage = $tagArgs['page'] - 2;\r
-                       if ($linksBeforePage < 0) $linksBeforePage = 0; \r
-                       $linksAfterPage = $tagArgs['pages'] - ($tagArgs['page'] + 1);\r
-                       if ($linksAfterPage < 0) $linksAfterPage = 0; \r
-                       if ($tagArgs['page'] > 1 && $tagArgs['page'] < $tagArgs['pages']) {\r
-                               $maxLinks--;\r
-                       }\r
-                       \r
-                       $half = $maxLinks / 2;\r
-                       $left = $right = $tagArgs['page'];\r
-                       if ($left < 1) $left = 1;\r
-                       if ($right < 1) $right = 1;\r
-                       if ($right > $tagArgs['pages'] - 1) $right = $tagArgs['pages'] - 1;\r
-                       \r
-                       if ($linksBeforePage >= $half) {\r
-                               $left -= $half;\r
-                       }\r
-                       else {\r
-                               $left -= $linksBeforePage;\r
-                               $right += $half - $linksBeforePage;\r
-                       }\r
-                       \r
-                       if ($linksAfterPage >= $half) {\r
-                               $right += $half;\r
-                       }\r
-                       else {\r
-                               $right += $linksAfterPage;\r
-                               $left -= $half - $linksAfterPage;\r
-                       }\r
-                       \r
-                       $right = intval(ceil($right));\r
-                       $left = intval(ceil($left));\r
-                       if ($left < 1) $left = 1;\r
-                       if ($right > $tagArgs['pages']) $right = $tagArgs['pages'];\r
-                       \r
-                       // left ... links\r
-                       if ($left > 1) {\r
-                               if ($left - 1 < 2) {\r
-                                       $html .= $this->makeLink($tagArgs['link'], 2, $tagArgs['page']);\r
-                               }\r
-                               else {\r
-                                       $html .= '<li class="children"><a onclick="multiPagesLinks.startPageNumberInput(this)">&hellip;<img src="'.self::getIconPath('arrowDown.png').'" alt="" /></a><input type="text" class="inputText" name="pageNo" /><div><ul>'."\n";\r
-                                       \r
-                                       $k = 0;\r
-                                       $step = intval(ceil(($left - 2) / self::SHOW_SUB_LINKS));\r
-                                       for ($i = 2; $i <= $left; $i += $step) {\r
-                                               $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page'], $k != 0 && $k % 4 == 0);\r
-                                               $k++;\r
-                                       }\r
-                                       \r
-                                       $html .= "</ul></div></li>\n";\r
-                               }\r
-                       }\r
-                       \r
-                       // visible links\r
-                       for ($i = $left + 1; $i < $right; $i++) {\r
-                               $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page']);\r
-                       }\r
-                       \r
-                       // right ... links\r
-                       if ($right < $tagArgs['pages']) {\r
-                               if ($tagArgs['pages'] - $right < 2) {\r
-                                       $html .= $this->makeLink($tagArgs['link'], $tagArgs['pages'] - 1, $tagArgs['page']);\r
-                               }\r
-                               else {\r
-                                       $html .= '<li class="children"><a onclick="multiPagesLinks.startPageNumberInput(this)">&hellip;<img src="'.self::getIconPath('arrowDown.png').'" alt="" /></a><input type="text" class="inputText" name="page" /><div><ul>'."\n";\r
-                                       \r
-                                       $k = 0;\r
-                                       $step = intval(ceil(($tagArgs['pages'] - $right) / self::SHOW_SUB_LINKS));\r
-                                       for ($i = $right; $i < $tagArgs['pages']; $i += $step) {\r
-                                               $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page'], $k != 0 && $k % 4 == 0);\r
-                                               $k++;\r
-                                       }\r
-                                       \r
-                                       $html .= "</ul></div></li>\n";\r
-                               }\r
-                       }\r
-                       \r
-                       // last page\r
-                       $html .= $this->makeLink($tagArgs['link'], $tagArgs['pages'], $tagArgs['page']);\r
-                       \r
-                       // next page\r
-                       $nextTitle = WCF::getLanguage()->getDynamicVariable('wcf.global.page.next');\r
-                       if ($tagArgs['page'] && $tagArgs['page'] < $tagArgs['pages']) {\r
-                               $html .= '<li class="skip"><a href="'.$this->insertPageNumber($tagArgs['link'], $tagArgs['page'] + 1).'" title="'.$nextTitle.'"><img src="'.self::getIconPath('nextS.png').'" alt="" /></a></li>'."\n";\r
-                       }\r
-                       else {\r
-                               $html .= '<li class="skip"><img src="'.self::getIconPath('nextDisabledS.png').'" alt="" /></li>'."\n";\r
-                       }\r
-                       \r
-                       // close div and ul\r
-                       $html .= "</ul></div>\n";\r
-               }\r
-               \r
-               // assign html output to template var\r
-               if (isset($tagArgs['assign'])) {\r
-                       $tplObj->assign($tagArgs['assign'], $html);\r
-                       if (!isset($tagArgs['print']) || !$tagArgs['print']) return '';\r
-               }\r
-               \r
-               return $html;\r
-       }\r
-       \r
-       private static function getIconPath($filename) {\r
-               if (class_exists('StyleManager')) {\r
-                       return StyleManager::getStyle()->getIconPath($filename);\r
-               }\r
-               else {\r
-                       return RELATIVE_WCF_DIR.'icon/'.$filename;\r
-               }\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\WCF;
+use wcf\system\exception\SystemException;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginFunction;
+use wcf\util\StringUtil;
+
+/**
+ * The 'pages' template function is used to generate sliding pagers.
+ * 
+ * Usage:
+ * {pages pages=10 link='page-%d.html'}
+ * {pages page=8 pages=10 link='page-%d.html'}
+ * 
+ * assign to variable 'output'; do not print: 
+ * {pages page=8 pages=10 link='page-%d.html' assign='output'}
+ * 
+ * assign to variable 'output' and do print also:
+ * {pages page=8 pages=10 link='page-%d.html' assign='output' print=true}
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginFunctionPages implements ITemplatePluginFunction {
+       const SHOW_LINKS = 11;
+       const SHOW_SUB_LINKS = 20;
+       
+       /**
+        * Inserts the page number into the link.
+        * 
+        * @param       string          $link
+        * @param       integer         $pageNo
+        * @return      string          final link
+        */
+       protected static function insertPageNumber($link, $pageNo) {
+               $startPos = StringUtil::indexOf($link, '%d');
+               if ($startPos !== null) $link = StringUtil::substring($link, 0, $startPos) . $pageNo . StringUtil::substring($link, $startPos + 2);
+               return $link;
+       }
+       
+       /**
+        * Generates html code of a link.
+        * 
+        * @param       string          $link
+        * @param       integer         $pageNo
+        * @param       integer         $activePage
+        * @param       boolean         $break
+        * @return      string
+        */
+       protected function makeLink($link, $pageNo, $activePage, $break = false) {
+               // first page
+               if ($activePage != $pageNo) {
+                       return '<li'.($break ? ' class="break"' : '').'><a href="'.$this->insertPageNumber($link, $pageNo).'">'.StringUtil::formatInteger($pageNo).'</a></li>'."\n";
+               }
+               else {
+                       return '<li class="'.($break ? 'break ' : '').'active"><span>'.StringUtil::formatInteger($pageNo).'</span></li>'."\n";
+               }
+       }
+       
+       /**
+        * @see wcf\system\template\ITemplatePluginFunction::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               // needed params: link, page, pages
+               if (!isset($tagArgs['link'])) throw new SystemException("missing 'link' argument in pages tag", 12001);
+               if (!isset($tagArgs['pages'])) {
+                       if (($tagArgs['pages'] = $tplObj->get('pages')) === null) {
+                               throw new SystemException("missing 'pages' argument in pages tag", 12001);
+                       }
+               }
+               
+               $html = '';
+               
+               if ($tagArgs['pages'] > 1) {
+                       // define page link for js function
+                       $html .= "<script type=\"text/javascript\">\n//<![CDATA[\nmultiPagesLinks.setPageLink('".StringUtil::replace("'", "\'", $tagArgs['link'])."');\n//]]>\n</script>";
+                       
+                       // encode link
+                       $tagArgs['link'] = StringUtil::encodeHTML($tagArgs['link']);
+               
+                       if (!isset($tagArgs['page'])) {
+                               if (($tagArgs['page'] = $tplObj->get('pageNo')) === null) {
+                                       $tagArgs['page'] = 0;
+                               }
+                       }
+                       
+                       // open div and ul
+                       $html .= "<div class=\"pageNavigation\">\n<ul>\n";
+                       
+                       // previous page
+                       $previousTitle = WCF::getLanguage()->getDynamicVariable('wcf.global.page.previous');
+                       if ($tagArgs['page'] > 1) {
+                               $html .= '<li class="skip"><a href="'.$this->insertPageNumber($tagArgs['link'], $tagArgs['page'] - 1).'" title="'.$previousTitle.'"><img src="'.self::getIconPath('previousS.png').'" alt="" /></a></li>'."\n";
+                       }
+                       else {
+                               $html .= '<li class="skip"><img src="'.self::getIconPath('previousDisabledS.png').'" alt="" /></li>'."\n";
+                       }
+                       
+                       // first page
+                       $html .= $this->makeLink($tagArgs['link'], 1, $tagArgs['page']);
+                       
+                       // calculate page links
+                       $maxLinks = self::SHOW_LINKS - 4;
+                       $linksBeforePage = $tagArgs['page'] - 2;
+                       if ($linksBeforePage < 0) $linksBeforePage = 0; 
+                       $linksAfterPage = $tagArgs['pages'] - ($tagArgs['page'] + 1);
+                       if ($linksAfterPage < 0) $linksAfterPage = 0; 
+                       if ($tagArgs['page'] > 1 && $tagArgs['page'] < $tagArgs['pages']) {
+                               $maxLinks--;
+                       }
+                       
+                       $half = $maxLinks / 2;
+                       $left = $right = $tagArgs['page'];
+                       if ($left < 1) $left = 1;
+                       if ($right < 1) $right = 1;
+                       if ($right > $tagArgs['pages'] - 1) $right = $tagArgs['pages'] - 1;
+                       
+                       if ($linksBeforePage >= $half) {
+                               $left -= $half;
+                       }
+                       else {
+                               $left -= $linksBeforePage;
+                               $right += $half - $linksBeforePage;
+                       }
+                       
+                       if ($linksAfterPage >= $half) {
+                               $right += $half;
+                       }
+                       else {
+                               $right += $linksAfterPage;
+                               $left -= $half - $linksAfterPage;
+                       }
+                       
+                       $right = intval(ceil($right));
+                       $left = intval(ceil($left));
+                       if ($left < 1) $left = 1;
+                       if ($right > $tagArgs['pages']) $right = $tagArgs['pages'];
+                       
+                       // left ... links
+                       if ($left > 1) {
+                               if ($left - 1 < 2) {
+                                       $html .= $this->makeLink($tagArgs['link'], 2, $tagArgs['page']);
+                               }
+                               else {
+                                       $html .= '<li class="children"><a onclick="multiPagesLinks.startPageNumberInput(this)">&hellip;<img src="'.self::getIconPath('arrowDown.png').'" alt="" /></a><input type="text" class="inputText" name="pageNo" /><div><ul>'."\n";
+                                       
+                                       $k = 0;
+                                       $step = intval(ceil(($left - 2) / self::SHOW_SUB_LINKS));
+                                       for ($i = 2; $i <= $left; $i += $step) {
+                                               $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page'], $k != 0 && $k % 4 == 0);
+                                               $k++;
+                                       }
+                                       
+                                       $html .= "</ul></div></li>\n";
+                               }
+                       }
+                       
+                       // visible links
+                       for ($i = $left + 1; $i < $right; $i++) {
+                               $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page']);
+                       }
+                       
+                       // right ... links
+                       if ($right < $tagArgs['pages']) {
+                               if ($tagArgs['pages'] - $right < 2) {
+                                       $html .= $this->makeLink($tagArgs['link'], $tagArgs['pages'] - 1, $tagArgs['page']);
+                               }
+                               else {
+                                       $html .= '<li class="children"><a onclick="multiPagesLinks.startPageNumberInput(this)">&hellip;<img src="'.self::getIconPath('arrowDown.png').'" alt="" /></a><input type="text" class="inputText" name="page" /><div><ul>'."\n";
+                                       
+                                       $k = 0;
+                                       $step = intval(ceil(($tagArgs['pages'] - $right) / self::SHOW_SUB_LINKS));
+                                       for ($i = $right; $i < $tagArgs['pages']; $i += $step) {
+                                               $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page'], $k != 0 && $k % 4 == 0);
+                                               $k++;
+                                       }
+                                       
+                                       $html .= "</ul></div></li>\n";
+                               }
+                       }
+                       
+                       // last page
+                       $html .= $this->makeLink($tagArgs['link'], $tagArgs['pages'], $tagArgs['page']);
+                       
+                       // next page
+                       $nextTitle = WCF::getLanguage()->getDynamicVariable('wcf.global.page.next');
+                       if ($tagArgs['page'] && $tagArgs['page'] < $tagArgs['pages']) {
+                               $html .= '<li class="skip"><a href="'.$this->insertPageNumber($tagArgs['link'], $tagArgs['page'] + 1).'" title="'.$nextTitle.'"><img src="'.self::getIconPath('nextS.png').'" alt="" /></a></li>'."\n";
+                       }
+                       else {
+                               $html .= '<li class="skip"><img src="'.self::getIconPath('nextDisabledS.png').'" alt="" /></li>'."\n";
+                       }
+                       
+                       // close div and ul
+                       $html .= "</ul></div>\n";
+               }
+               
+               // assign html output to template var
+               if (isset($tagArgs['assign'])) {
+                       $tplObj->assign($tagArgs['assign'], $html);
+                       if (!isset($tagArgs['print']) || !$tagArgs['print']) return '';
+               }
+               
+               return $html;
+       }
+       
+       private static function getIconPath($filename) {
+               if (class_exists('StyleManager')) {
+                       return StyleManager::getStyle()->getIconPath($filename);
+               }
+               else {
+                       return RELATIVE_WCF_DIR.'icon/'.$filename;
+               }
+       }
 }
index 9660387c45b4412fc889972c8a87e1c10c92ea72..80147cf27bcf167d108aa141c239a8525b2c2c3b 100644 (file)
@@ -1,37 +1,37 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-\r
-/**\r
- * The 'concat' modifier returns the string that results from concatenating the arguments.\r
- * May have two or more arguments.\r
- * \r
- * Usage:\r
- * {"left"|concat:$right}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginModifierConcat implements ITemplatePluginModifier {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginModifier::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               if (count($tagArgs) < 2) {\r
-                       throw new SystemException("concat modifier needs two or more arguments", 12001);\r
-               }\r
-               \r
-               $result = '';\r
-               foreach ($tagArgs as $arg) {\r
-                       $result .= $arg;\r
-               }\r
-       \r
-               return $result; \r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\exception\SystemException;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+
+/**
+ * The 'concat' modifier returns the string that results from concatenating the arguments.
+ * May have two or more arguments.
+ * 
+ * Usage:
+ * {"left"|concat:$right}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginModifierConcat implements ITemplatePluginModifier {
+       /**
+        * @see wcf\system\template\ITemplatePluginModifier::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               if (count($tagArgs) < 2) {
+                       throw new SystemException("concat modifier needs two or more arguments", 12001);
+               }
+               
+               $result = '';
+               foreach ($tagArgs as $arg) {
+                       $result .= $arg;
+               }
+       
+               return $result; 
+       }
 }
index 87f71736923900fb45f142aeff1133b144ef667a..6c5c37368ec9fc0656d8ec294201504b0db1bcaf 100644 (file)
@@ -1,29 +1,29 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * The 'date' modifier formats a unix timestamp.\r
- * Default date format contains year, month and day.\r
- * \r
- * Usage:\r
- * {$timestamp|date}\r
- * {"132845333"|date:"Y-m-d"}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginModifierDate implements ITemplatePluginModifier {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginModifier::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               return DateUtil::format(DateUtil::getDateTimeByTimestamp($tagArgs[0]), (!empty($tagArgs[2]) ? $tagArgs[2] : DateUtil::DATE_FORMAT));\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\util\DateUtil;
+
+/**
+ * The 'date' modifier formats a unix timestamp.
+ * Default date format contains year, month and day.
+ * 
+ * Usage:
+ * {$timestamp|date}
+ * {"132845333"|date:"Y-m-d"}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginModifierDate implements ITemplatePluginModifier {
+       /**
+        * @see wcf\system\template\ITemplatePluginModifier::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               return DateUtil::format(DateUtil::getDateTimeByTimestamp($tagArgs[0]), (!empty($tagArgs[2]) ? $tagArgs[2] : DateUtil::DATE_FORMAT));
+       }
 }
index dab9f121db214425ee1b131b5aa780cc79e1a53f..cb1a247265b2deb002739ac678cd861652baff0f 100644 (file)
@@ -1,41 +1,41 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'encodejs' modifier formats a string for usage in a single quoted javascript string. \r
- * Escapes single quotes and new lines.\r
- * \r
- * Usage:\r
- * {$string|encodejs}\r
- * {"bl''ah"|encodejs}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginModifierEncodejs implements ITemplatePluginModifier {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginModifier::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               // escape backslash\r
-               $tagArgs[0] = StringUtil::replace("\\", "\\\\", $tagArgs[0]);\r
-               \r
-               // escape singe quote\r
-               $tagArgs[0] = StringUtil::replace("'", "\'", $tagArgs[0]);\r
-               \r
-               // escape new lines\r
-               $tagArgs[0] = StringUtil::replace("\n", '\n', $tagArgs[0]);\r
-               \r
-               // escape slashes\r
-               $tagArgs[0] = StringUtil::replace("/", '\/', $tagArgs[0]);\r
-               \r
-               return $tagArgs[0];\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\util\StringUtil;
+
+/**
+ * The 'encodejs' modifier formats a string for usage in a single quoted javascript string. 
+ * Escapes single quotes and new lines.
+ * 
+ * Usage:
+ * {$string|encodejs}
+ * {"bl''ah"|encodejs}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginModifierEncodejs implements ITemplatePluginModifier {
+       /**
+        * @see wcf\system\template\ITemplatePluginModifier::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               // escape backslash
+               $tagArgs[0] = StringUtil::replace("\\", "\\\\", $tagArgs[0]);
+               
+               // escape singe quote
+               $tagArgs[0] = StringUtil::replace("'", "\'", $tagArgs[0]);
+               
+               // escape new lines
+               $tagArgs[0] = StringUtil::replace("\n", '\n', $tagArgs[0]);
+               
+               // escape slashes
+               $tagArgs[0] = StringUtil::replace("/", '\/', $tagArgs[0]);
+               
+               return $tagArgs[0];
+       }
 }
index 779424c430262a32266650942193039864fdf0ec..fcd7452f840c286a8f752e7e68dee888da7eac62 100644 (file)
@@ -1,28 +1,28 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\util\FileUtil;\r
-\r
-/**\r
- * The 'filesize' modifier formats a filesize (given in bytes).\r
- * \r
- * Usage:\r
- * {$string|filesize}\r
- * {123456789|filesize}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginModifierFilesize implements ITemplatePluginModifier {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginModifier::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               return FileUtil::formatFilesize($tagArgs[0]);\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\util\FileUtil;
+
+/**
+ * The 'filesize' modifier formats a filesize (given in bytes).
+ * 
+ * Usage:
+ * {$string|filesize}
+ * {123456789|filesize}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginModifierFilesize implements ITemplatePluginModifier {
+       /**
+        * @see wcf\system\template\ITemplatePluginModifier::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               return FileUtil::formatFilesize($tagArgs[0]);
+       }
 }
index ee1a77aecba60a9dd1742209d6b03038866c220e..3337b1e8d22220d075337100b66e152e3a004cec 100644 (file)
@@ -1,31 +1,31 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * The 'plainTime' modifier formats a unix timestamp.\r
- * Default date format contains year, month, day, hour and minute.\r
- * \r
- * Usage:\r
- * {$timestamp|plainTime}\r
- * {"132845333"|plainTime}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginModifierPlainTime implements ITemplatePluginModifier {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginModifier::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               $dateTime = DateUtil::getDateTimeByTimestamp($tagArgs[0]);\r
-               return str_replace('%time%', DateUtil::format($dateTime, DateUtil::TIME_FORMAT), str_replace('%date%', DateUtil::format($dateTime, DateUtil::DATE_FORMAT), WCF::getLanguage()->get('wcf.global.date.dateTimeFormat')));\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+
+/**
+ * The 'plainTime' modifier formats a unix timestamp.
+ * Default date format contains year, month, day, hour and minute.
+ * 
+ * Usage:
+ * {$timestamp|plainTime}
+ * {"132845333"|plainTime}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginModifierPlainTime implements ITemplatePluginModifier {
+       /**
+        * @see wcf\system\template\ITemplatePluginModifier::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               $dateTime = DateUtil::getDateTimeByTimestamp($tagArgs[0]);
+               return str_replace('%time%', DateUtil::format($dateTime, DateUtil::TIME_FORMAT), str_replace('%date%', DateUtil::format($dateTime, DateUtil::DATE_FORMAT), WCF::getLanguage()->get('wcf.global.date.dateTimeFormat')));
+       }
 }
index 1f783557853f2b525a8ca8f9876286e5c16a5263..7fcfec95acefa3e4295e6fcea2e1aaf47d33e5b2 100644 (file)
@@ -1,36 +1,36 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * The 'time' modifier formats a unix timestamp.\r
- * Default date format contains year, month, day, hour and minute.\r
- * \r
- * Usage:\r
- * {$timestamp|time}\r
- * {"132845333"|time}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginModifierTime implements ITemplatePluginModifier {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginModifier::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               $timestamp = intval($tagArgs[0]);\r
-               $dateTimeObject = DateUtil::getDateTimeByTimestamp($timestamp);\r
-               $date = DateUtil::format($dateTimeObject, DateUtil::DATE_FORMAT);\r
-               $time = DateUtil::format($dateTimeObject, DateUtil::TIME_FORMAT);\r
-               $dateTime = str_replace('%time%', $time, str_replace('%date%', $date, WCF::getLanguage()->get('wcf.global.date.dateTimeFormat')));\r
-               \r
-               return '<time datetime="'.DateUtil::format($dateTimeObject, 'c').'" class="datetime" data-timestamp="'.$timestamp.'" data-date="'.$date.'" data-time="'.$time.'" data-offset="'.$dateTimeObject->getOffset().'">'.$dateTime.'</time>';\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+
+/**
+ * The 'time' modifier formats a unix timestamp.
+ * Default date format contains year, month, day, hour and minute.
+ * 
+ * Usage:
+ * {$timestamp|time}
+ * {"132845333"|time}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginModifierTime implements ITemplatePluginModifier {
+       /**
+        * @see wcf\system\template\ITemplatePluginModifier::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               $timestamp = intval($tagArgs[0]);
+               $dateTimeObject = DateUtil::getDateTimeByTimestamp($timestamp);
+               $date = DateUtil::format($dateTimeObject, DateUtil::DATE_FORMAT);
+               $time = DateUtil::format($dateTimeObject, DateUtil::TIME_FORMAT);
+               $dateTime = str_replace('%time%', $time, str_replace('%date%', $date, WCF::getLanguage()->get('wcf.global.date.dateTimeFormat')));
+               
+               return '<time datetime="'.DateUtil::format($dateTimeObject, 'c').'" class="datetime" data-timestamp="'.$timestamp.'" data-date="'.$date.'" data-time="'.$time.'" data-offset="'.$dateTimeObject->getOffset().'">'.$dateTime.'</time>';
+       }
 }
index 0f10a02c842a5bc24fa835e9b9cae81f65500434..b9ff45693481f9253a92840f85fafc877a917eb9 100644 (file)
@@ -1,54 +1,54 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'truncate' modifier truncates a string.\r
- * \r
- * Usage:\r
- * {$foo|truncate:35:'...'}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginModifierTruncate implements ITemplatePluginModifier {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginModifier::execute()\r
-        */\r
-       public function execute($tagArgs, TemplateEngine $tplObj) {\r
-               // default values\r
-               $length = 80;\r
-               $etc = '...';\r
-               $breakWords = false;\r
-               \r
-               // get values\r
-               $string = $tagArgs[0];\r
-               if (isset($tagArgs[1])) $length = intval($tagArgs[1]);\r
-               if (isset($tagArgs[2])) $etc = $tagArgs[2];\r
-               if (isset($tagArgs[3])) $breakWords = $tagArgs[3];\r
-               \r
-               // execute plugin\r
-               if ($length == 0) {\r
-                       return '';\r
-               }\r
-\r
-               if (StringUtil::length($string) > $length) {\r
-                       $length -= StringUtil::length($etc);\r
-                       \r
-                       if (!$breakWords) {\r
-                               $string = preg_replace('/\s+?(\S+)?$/', '', StringUtil::substring($string, 0, $length + 1));\r
-                       }\r
-  \r
-                       return StringUtil::substring($string, 0, $length).$etc;\r
-               }\r
-               else {\r
-                       return $string;\r
-               }\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\util\StringUtil;
+
+/**
+ * The 'truncate' modifier truncates a string.
+ * 
+ * Usage:
+ * {$foo|truncate:35:'...'}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginModifierTruncate implements ITemplatePluginModifier {
+       /**
+        * @see wcf\system\template\ITemplatePluginModifier::execute()
+        */
+       public function execute($tagArgs, TemplateEngine $tplObj) {
+               // default values
+               $length = 80;
+               $etc = '...';
+               $breakWords = false;
+               
+               // get values
+               $string = $tagArgs[0];
+               if (isset($tagArgs[1])) $length = intval($tagArgs[1]);
+               if (isset($tagArgs[2])) $etc = $tagArgs[2];
+               if (isset($tagArgs[3])) $breakWords = $tagArgs[3];
+               
+               // execute plugin
+               if ($length == 0) {
+                       return '';
+               }
+
+               if (StringUtil::length($string) > $length) {
+                       $length -= StringUtil::length($etc);
+                       
+                       if (!$breakWords) {
+                               $string = preg_replace('/\s+?(\S+)?$/', '', StringUtil::substring($string, 0, $length + 1));
+                       }
+  
+                       return StringUtil::substring($string, 0, $length).$etc;
+               }
+               else {
+                       return $string;
+               }
+       }
 }
index 87d38edec9c65352dfdaf3da03ec5c338da7b5e3..4f3847214d86069609268119f857a32f99681d5d 100644 (file)
@@ -1,34 +1,34 @@
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginPrefilter;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * The 'lang' prefilter compiles static language variables.\r
- * Dynamic language variables will catched by the 'lang' compiler function.\r
- * It is recommended to use static language variables.\r
- * \r
- * Usage:\r
- * {lang}foo{/lang}\r
- * {lang}lang.foo.bar{/lang}\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category   Community Framework\r
- */\r
-class TemplatePluginPrefilterLang implements ITemplatePluginPrefilter {\r
-       /**\r
-        * @see wcf\system\template\ITemplatePluginPrefilter::execute()\r
-        */\r
-       public function execute($templateName, $sourceContent, TemplateScriptingCompiler $compiler) {\r
-               $ldq = preg_quote($compiler->getLeftDelimiter(), '~');\r
-               $rdq = preg_quote($compiler->getRightDelimiter(), '~');\r
-               $sourceContent = preg_replace("~{$ldq}lang{$rdq}([\w\.]+){$ldq}/lang{$rdq}~e", 'wcf\system\WCF::getLanguage()->get(\'$1\')', $sourceContent);\r
-\r
-               return $sourceContent;\r
-       }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginPrefilter;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\WCF;
+
+/**
+ * The 'lang' prefilter compiles static language variables.
+ * Dynamic language variables will catched by the 'lang' compiler function.
+ * It is recommended to use static language variables.
+ * 
+ * Usage:
+ * {lang}foo{/lang}
+ * {lang}lang.foo.bar{/lang}
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category   Community Framework
+ */
+class TemplatePluginPrefilterLang implements ITemplatePluginPrefilter {
+       /**
+        * @see wcf\system\template\ITemplatePluginPrefilter::execute()
+        */
+       public function execute($templateName, $sourceContent, TemplateScriptingCompiler $compiler) {
+               $ldq = preg_quote($compiler->getLeftDelimiter(), '~');
+               $rdq = preg_quote($compiler->getRightDelimiter(), '~');
+               $sourceContent = preg_replace("~{$ldq}lang{$rdq}([\w\.]+){$ldq}/lang{$rdq}~e", 'wcf\system\WCF::getLanguage()->get(\'$1\')', $sourceContent);
+
+               return $sourceContent;
+       }
 }
index 03bcdc4c6d0bfcb4c27bf96ca237f75f30f3a585..7ad7ab9d3cf2a25273df6c95dfd2d234f3a6ad1d 100644 (file)
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Contains Array-related functions.\r
- *\r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-class ArrayUtil {\r
-       /**\r
-        * Applies StringUtil::trim() to all elements of an array.\r
-        *\r
-        * @param       array           $array\r
-        * @param       boolean         $removeEmptyElements\r
-        * @return      array           $array\r
-        */\r
-       public static function trim($array, $removeEmptyElements = true) {\r
-               if (!is_array($array)) {\r
-                       return StringUtil::trim($array);\r
-               }\r
-               else {\r
-                       foreach ($array as $key => $val) {\r
-                               $temp = self::trim($val, $removeEmptyElements);\r
-                               if ($removeEmptyElements && empty($temp)) unset($array[$key]);\r
-                               else $array[$key] = $temp;\r
-                       }\r
-                       return $array;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Applies intval() to all elements of an array.\r
-        *\r
-        * @param       array           $array\r
-        * @return      array           $array\r
-        */\r
-       public static function toIntegerArray($array) {\r
-               if (!is_array($array)) {\r
-                       return intval($array);\r
-               }\r
-               else {\r
-                       foreach ($array as $key => $val) {\r
-                               $array[$key] = self::toIntegerArray($val);\r
-                       }\r
-                       return $array;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Converts html special characters in arrays.\r
-        *\r
-        * @param       array           $array\r
-        * @return      array           $array\r
-        */\r
-       public static function encodeHTML($array) {\r
-               if (!is_array($array)) {\r
-                       return StringUtil::encodeHTML($array);\r
-               }\r
-               else {\r
-                       foreach ($array as $key => $val) {\r
-                               $array[$key] = self::encodeHTML($val);\r
-                       }\r
-                       return $array;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Applies stripslashes on all elements of an array.\r
-        *\r
-        * @param       array           $array\r
-        * @return      array           $array\r
-        */\r
-       public static function stripslashes($array) {\r
-               if (!is_array($array)) {\r
-                       return stripslashes($array);\r
-               }\r
-               else {\r
-                       foreach ($array as $key => $val) {\r
-                               $array[$key] = self::stripslashes($val);\r
-                       }\r
-                       return $array;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Appends a suffix to all elements of the given array.\r
-        *\r
-        * @param       array    $array\r
-        * @param       string   $suffix\r
-        * @return      array\r
-        */\r
-       public static function appendSuffix($array, $suffix) {\r
-               foreach ($array as $key => $value) {\r
-                       $array[$key] = $value . $suffix;\r
-               }\r
-               \r
-               return $array;\r
-       }\r
-       \r
-       /**\r
-        * Computes the intersection of arrays using keys for comparison\r
-        * Alias to php array_intersect_key() function\r
-        *\r
-        * @param       array   $array1         The array with master keys to check. \r
-        * @param       array   $array2         An array to compare keys against.\r
-        * @return                              Returns an associative array containing all the values of array1  which have matching keys that are present in all arguments. \r
-        * @see                                 array_intersect_key\r
-        */\r
-       public static function intersectKeys($array1, $array2) {\r
-               if (!function_exists('array_intersect_key')) {\r
-                       $numberOfArguments = func_num_args();\r
-                       for ($i = 1; !empty($array1) && $i < $numberOfArguments; $i++) {\r
-                               $currentArray = func_get_arg($i);\r
-                               foreach (array_keys($array1) as $key) {\r
-                                       if (!isset($currentArray[$key])) {\r
-                                               unset($array1[$key]);\r
-                                       }\r
-                               }\r
-                       }\r
-                       return $array1;\r
-               } \r
-               else {\r
-                       $parameters = func_get_args();\r
-                       return call_user_func_array('array_intersect_key', $parameters);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Converts dos to unix newlines.\r
-        *\r
-        * @param       array           $array\r
-        * @return      array           $array\r
-        */\r
-       public static function unifyNewlines($array) {\r
-               if (!is_array($array)) {\r
-                       return StringUtil::unifyNewlines($array);\r
-               }\r
-               else {\r
-                       foreach ($array as $key => $val) {\r
-                               $array[$key] = self::unifyNewlines($val);\r
-                       }\r
-                       return $array;\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Converts a array of strings to requested character encoding.\r
-        * @see mb_convert_encoding()\r
-        * \r
-        * @param       string          $inCharset\r
-        * @param       string          $outCharset\r
-        * @param       string          $array\r
-        * @return      string          $array\r
-        */\r
-       public static function convertEncoding($inCharset, $outCharset, $array) {\r
-               if (!is_array($array)) {\r
-                       return StringUtil::convertEncoding($inCharset, $outCharset, $array);\r
-               }\r
-               else {\r
-                       foreach ($array as $key => $val) {\r
-                               $array[$key] = self::convertEncoding($inCharset, $outCharset, $val);\r
-                       }\r
-                       return $array;\r
-               }\r
-       }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Contains Array-related functions.
+ *
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage util
+ * @category   Community Framework
+ */
+class ArrayUtil {
+       /**
+        * Applies StringUtil::trim() to all elements of an array.
+        *
+        * @param       array           $array
+        * @param       boolean         $removeEmptyElements
+        * @return      array           $array
+        */
+       public static function trim($array, $removeEmptyElements = true) {
+               if (!is_array($array)) {
+                       return StringUtil::trim($array);
+               }
+               else {
+                       foreach ($array as $key => $val) {
+                               $temp = self::trim($val, $removeEmptyElements);
+                               if ($removeEmptyElements && empty($temp)) unset($array[$key]);
+                               else $array[$key] = $temp;
+                       }
+                       return $array;
+               }
+       }
+       
+       /**
+        * Applies intval() to all elements of an array.
+        *
+        * @param       array           $array
+        * @return      array           $array
+        */
+       public static function toIntegerArray($array) {
+               if (!is_array($array)) {
+                       return intval($array);
+               }
+               else {
+                       foreach ($array as $key => $val) {
+                               $array[$key] = self::toIntegerArray($val);
+                       }
+                       return $array;
+               }
+       }
+       
+       /**
+        * Converts html special characters in arrays.
+        *
+        * @param       array           $array
+        * @return      array           $array
+        */
+       public static function encodeHTML($array) {
+               if (!is_array($array)) {
+                       return StringUtil::encodeHTML($array);
+               }
+               else {
+                       foreach ($array as $key => $val) {
+                               $array[$key] = self::encodeHTML($val);
+                       }
+                       return $array;
+               }
+       }
+       
+       /**
+        * Applies stripslashes on all elements of an array.
+        *
+        * @param       array           $array
+        * @return      array           $array
+        */
+       public static function stripslashes($array) {
+               if (!is_array($array)) {
+                       return stripslashes($array);
+               }
+               else {
+                       foreach ($array as $key => $val) {
+                               $array[$key] = self::stripslashes($val);
+                       }
+                       return $array;
+               }
+       }
+       
+       /**
+        * Appends a suffix to all elements of the given array.
+        *
+        * @param       array    $array
+        * @param       string   $suffix
+        * @return      array
+        */
+       public static function appendSuffix($array, $suffix) {
+               foreach ($array as $key => $value) {
+                       $array[$key] = $value . $suffix;
+               }
+               
+               return $array;
+       }
+       
+       /**
+        * Computes the intersection of arrays using keys for comparison
+        * Alias to php array_intersect_key() function
+        *
+        * @param       array   $array1         The array with master keys to check. 
+        * @param       array   $array2         An array to compare keys against.
+        * @return                              Returns an associative array containing all the values of array1  which have matching keys that are present in all arguments. 
+        * @see                                 array_intersect_key
+        */
+       public static function intersectKeys($array1, $array2) {
+               if (!function_exists('array_intersect_key')) {
+                       $numberOfArguments = func_num_args();
+                       for ($i = 1; !empty($array1) && $i < $numberOfArguments; $i++) {
+                               $currentArray = func_get_arg($i);
+                               foreach (array_keys($array1) as $key) {
+                                       if (!isset($currentArray[$key])) {
+                                               unset($array1[$key]);
+                                       }
+                               }
+                       }
+                       return $array1;
+               } 
+               else {
+                       $parameters = func_get_args();
+                       return call_user_func_array('array_intersect_key', $parameters);
+               }
+       }
+       
+       /**
+        * Converts dos to unix newlines.
+        *
+        * @param       array           $array
+        * @return      array           $array
+        */
+       public static function unifyNewlines($array) {
+               if (!is_array($array)) {
+                       return StringUtil::unifyNewlines($array);
+               }
+               else {
+                       foreach ($array as $key => $val) {
+                               $array[$key] = self::unifyNewlines($val);
+                       }
+                       return $array;
+               }
+       }
+       
+       /**
+        * Converts a array of strings to requested character encoding.
+        * @see mb_convert_encoding()
+        * 
+        * @param       string          $inCharset
+        * @param       string          $outCharset
+        * @param       string          $array
+        * @return      string          $array
+        */
+       public static function convertEncoding($inCharset, $outCharset, $array) {
+               if (!is_array($array)) {
+                       return StringUtil::convertEncoding($inCharset, $outCharset, $array);
+               }
+               else {
+                       foreach ($array as $key => $val) {
+                               $array[$key] = self::convertEncoding($inCharset, $outCharset, $val);
+                       }
+                       return $array;
+               }
+       }
 }
index f3817e696fb07d8e2136f21825d3725f3b128ebf..33424a659ce78ab0a902cc3186badedda1a5a19a 100644 (file)
@@ -1,69 +1,69 @@
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Contains file-related functions.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-class BasicFileUtil {\r
-       /**\r
-        * Tries to find the temp folder.\r
-        * \r
-        * @return      string\r
-        */\r
-       public static function getTempFolder() {\r
-               // use tmp folder in document root by default\r
-               if (!empty($_SERVER['DOCUMENT_ROOT'])) {\r
-                       if (strpos($_SERVER['DOCUMENT_ROOT'], 'strato') !== false) {\r
-                               // strato bugfix\r
-                               // create tmp folder in document root automatically\r
-                               if (!@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp')) { \r
-                                       @mkdir($_SERVER['DOCUMENT_ROOT'].'/tmp/', 0777);\r
-                                       @chmod($_SERVER['DOCUMENT_ROOT'].'/tmp/', 0777);\r
-                               }\r
-                       }\r
-                       if (@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp') && @is_writable($_SERVER['DOCUMENT_ROOT'].'/tmp')) {\r
-                               return $_SERVER['DOCUMENT_ROOT'].'/tmp/';\r
-                       }\r
-               }\r
-               \r
-               if (isset($_ENV['TMP']) && @is_writable($_ENV['TMP'])) {\r
-                       return $_ENV['TMP'] . '/';\r
-               }\r
-               if (isset($_ENV['TEMP']) && @is_writable($_ENV['TEMP'])) {\r
-                       return $_ENV['TEMP'] . '/';\r
-               }\r
-               if (isset($_ENV['TMPDIR']) && @is_writable($_ENV['TMPDIR'])) {\r
-                       return $_ENV['TMPDIR'] . '/';\r
-               }\r
-               \r
-               // workaround for a bug in php 5.1.2 that returns true for is_writable('/tmp/') with safe_mode = on\r
-               if (!preg_match('/^5\.1\.2(?![.0-9])/', phpversion())) {\r
-                       if (($path = ini_get('upload_tmp_dir')) && @is_writable($path)) {\r
-                               return $path . '/';\r
-                       }\r
-                       if (@file_exists('/tmp/') && @is_writable('/tmp/')) {\r
-                               return '/tmp/';\r
-                       }\r
-                       if (function_exists('session_save_path') && ($path = session_save_path()) && @is_writable($path)) {\r
-                               return $path . '/';\r
-                       }\r
-               }\r
-               \r
-               $path = WCF_DIR.'tmp/';\r
-               if (@file_exists($path) && @is_writable($path)) {\r
-                       return $path;\r
-               }\r
-               else {\r
-                       if (ini_get('safe_mode')) $reason = "due to php safe_mode restrictions";\r
-                       else $reason = "due to an unknown reason";\r
-                       throw new SystemException('There is no access to the system temporary folder '.$reason.' and no user specific temporary folder exists in '.WCF_DIR.'! This is a misconfiguration of your webserver software! Please create a folder called '.$path.' using your favorite ftp program, make it writable and then retry this installation.', 10000);\r
-               }\r
-       }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Contains file-related functions.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage util
+ * @category   Community Framework
+ */
+class BasicFileUtil {
+       /**
+        * Tries to find the temp folder.
+        * 
+        * @return      string
+        */
+       public static function getTempFolder() {
+               // use tmp folder in document root by default
+               if (!empty($_SERVER['DOCUMENT_ROOT'])) {
+                       if (strpos($_SERVER['DOCUMENT_ROOT'], 'strato') !== false) {
+                               // strato bugfix
+                               // create tmp folder in document root automatically
+                               if (!@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp')) { 
+                                       @mkdir($_SERVER['DOCUMENT_ROOT'].'/tmp/', 0777);
+                                       @chmod($_SERVER['DOCUMENT_ROOT'].'/tmp/', 0777);
+                               }
+                       }
+                       if (@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp') && @is_writable($_SERVER['DOCUMENT_ROOT'].'/tmp')) {
+                               return $_SERVER['DOCUMENT_ROOT'].'/tmp/';
+                       }
+               }
+               
+               if (isset($_ENV['TMP']) && @is_writable($_ENV['TMP'])) {
+                       return $_ENV['TMP'] . '/';
+               }
+               if (isset($_ENV['TEMP']) && @is_writable($_ENV['TEMP'])) {
+                       return $_ENV['TEMP'] . '/';
+               }
+               if (isset($_ENV['TMPDIR']) && @is_writable($_ENV['TMPDIR'])) {
+                       return $_ENV['TMPDIR'] . '/';
+               }
+               
+               // workaround for a bug in php 5.1.2 that returns true for is_writable('/tmp/') with safe_mode = on
+               if (!preg_match('/^5\.1\.2(?![.0-9])/', phpversion())) {
+                       if (($path = ini_get('upload_tmp_dir')) && @is_writable($path)) {
+                               return $path . '/';
+                       }
+                       if (@file_exists('/tmp/') && @is_writable('/tmp/')) {
+                               return '/tmp/';
+                       }
+                       if (function_exists('session_save_path') && ($path = session_save_path()) && @is_writable($path)) {
+                               return $path . '/';
+                       }
+               }
+               
+               $path = WCF_DIR.'tmp/';
+               if (@file_exists($path) && @is_writable($path)) {
+                       return $path;
+               }
+               else {
+                       if (ini_get('safe_mode')) $reason = "due to php safe_mode restrictions";
+                       else $reason = "due to an unknown reason";
+                       throw new SystemException('There is no access to the system temporary folder '.$reason.' and no user specific temporary folder exists in '.WCF_DIR.'! This is a misconfiguration of your webserver software! Please create a folder called '.$path.' using your favorite ftp program, make it writable and then retry this installation.', 10000);
+               }
+       }
 }
index 0dfdb594becabab9ae7008b9063910a99599aa15..bb39deda74ac2ff8b301d39b91b6af63423fc54c 100644 (file)
@@ -1,36 +1,36 @@
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Provides methods for class interactions.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-class ClassUtil {\r
-       /**\r
-        * Checks wether given class extends or implements the target class or interface.\r
-        * You SHOULD NOT call this method if 'instanceof' satisfies your request!\r
-        *\r
-        * @param       string          $className\r
-        * @param       string          $targetClass\r
-        * @return      boolean\r
-        */\r
-       public static function isInstanceOf($className, $targetClass) {\r
-               if (!is_string($className)) return false;\r
-               \r
-               if (class_exists($targetClass)) {\r
-                       return is_subclass_of($className, $targetClass);\r
-               }\r
-               else if (interface_exists($targetClass)) {\r
-                       $reflectionClass = new \ReflectionClass($className);\r
-                       return $reflectionClass->implementsInterface($targetClass);\r
-               }\r
-               \r
-               return false;\r
-       }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Provides methods for class interactions.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage util
+ * @category   Community Framework
+ */
+class ClassUtil {
+       /**
+        * Checks wether given class extends or implements the target class or interface.
+        * You SHOULD NOT call this method if 'instanceof' satisfies your request!
+        *
+        * @param       string          $className
+        * @param       string          $targetClass
+        * @return      boolean
+        */
+       public static function isInstanceOf($className, $targetClass) {
+               if (!is_string($className)) return false;
+               
+               if (class_exists($targetClass)) {
+                       return is_subclass_of($className, $targetClass);
+               }
+               else if (interface_exists($targetClass)) {
+                       $reflectionClass = new \ReflectionClass($className);
+                       return $reflectionClass->implementsInterface($targetClass);
+               }
+               
+               return false;
+       }
 }
\ No newline at end of file
index 1503c6f267cef1034996c3ee18a67f21729211b6..197ea8ad091e2151cb14fc86dd05740f18859769 100644 (file)
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Provides methods used for cron-like time calculations.\r
- * As against the official cron-documentation, this implementation\r
- * does not support using nicknames (prefixed by the '@' character).\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-abstract class CronjobUtil {\r
-       /**\r
-        * Set to true if day of month is '*'\r
-        * \r
-        * @var boolean\r
-        */\r
-       protected static $domRestricted = false;\r
-       \r
-       /**\r
-        * Set to true if day of week is '*'\r
-        * \r
-        * @var boolean\r
-        */\r
-       protected static $dowRestricted = false;\r
-       \r
-       /**\r
-        * Result date\r
-        * \r
-        * @var array<integer>\r
-        */\r
-       protected static $result = array();\r
-       \r
-       /**\r
-        * Time based used as reference for finding the next time of execution\r
-        * \r
-        * @var integer\r
-        */\r
-       protected static $timeBase = 0;\r
-       \r
-       /**\r
-        * Valid ranges for each known field. Note that the range for\r
-        * 'day of month' is missing, since it varies on each month.\r
-        * \r
-        * @var array<array>\r
-        */\r
-       public static $ranges = array(\r
-               'minute' => array(0, 59),\r
-               'hour' => array(0, 23),\r
-               'dom' => array(1, 31),\r
-               'month' => array(1, 12),\r
-               'dow' => array(0, 6)\r
-       );\r
-       \r
-       /**\r
-        * Calculates timestamp for next execution based on cron-like expressions and a given time base.\r
-        * \r
-        * @param       string          $minute\r
-        * @param       string          $hour\r
-        * @param       string          $dom\r
-        * @param       string          $month\r
-        * @param       string          $dow\r
-        * @param       integer         $timeBase\r
-        * @return      integer\r
-        */\r
-       public static function calculateNextExec($minute, $hour, $dom, $month, $dow, $timeBase = TIME_NOW) {\r
-               // initialize fields\r
-               self::$timeBase = $timeBase;\r
-               self::$result = array(\r
-                       'minute' => 0,\r
-                       'hour' => 0,\r
-                       'day' => 0,\r
-                       'month' => 0,\r
-                       'year' => 0\r
-               );\r
-               \r
-               $fields = array(\r
-                       'minute' => $minute,\r
-                       'hour' => $hour,\r
-                       'dom' => $dom,\r
-                       'month' => $month,\r
-                       'dow' => $dow\r
-               );\r
-               \r
-               self::$domRestricted = ($dom != '*') ? true : false;\r
-               self::$dowRestricted = ($dow != '*') ? true : false;\r
-               \r
-               // calculate values based upon each expression\r
-               foreach ($fields as $fieldName => $fieldValue) {\r
-                       $fieldValue = StringUtil::toLowerCase($fieldValue);\r
-                       \r
-                       // Names can also be used for the "month" and "day of week" fields.\r
-                       // Use the first three letters of the particular day or month (case\r
-                       // doesn't matter). Ranges or lists of names are not allowed.\r
-                       // -- crontab (5)\r
-                       \r
-                       switch ($fieldName) {\r
-                               case 'dow':\r
-                                       $dayNames = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');\r
-                                       \r
-                                       if (strlen($fieldValue) == 3 && in_array($fieldName, $dayNames)) {\r
-                                               $fieldValue = $monthNames[$fieldValue];\r
-                                       }\r
-                                       // When specifying day of week, both day 0 and day 7\r
-                                       // will be considered Sunday. -- crontab(5) \r
-                                       else if ($fieldValue == 7) {\r
-                                               $fieldValue = 0;\r
-                                       }\r
-                               break;\r
-                               \r
-                               case 'month':\r
-                                       $monthNames = array('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec');\r
-                                       \r
-                                       if (strlen($fieldValue) == 3 && in_array($fieldValue, $monthNames)) {\r
-                                               $fieldValue = $monthNames[$fieldValue] + 1;\r
-                                       }\r
-                               break;\r
-                       }\r
-                       \r
-                       $values[$fieldName] = self::calculateValue($fieldName, $fieldValue);\r
-               }\r
-               \r
-               // calculate date of next execution\r
-               self::calculateTime($values);\r
-               \r
-               // return timestamp\r
-               return mktime(\r
-                       self::$result['hour'],\r
-                       self::$result['minute'],\r
-                       1,\r
-                       self::$result['month'],\r
-                       self::$result['day'],\r
-                       self::$result['year']\r
-               );\r
-       }\r
-       \r
-       /**\r
-        * Calculates the date of next execution.\r
-        * \r
-        * @param       array           $values\r
-        */\r
-       protected static function calculateTime(array &$values) {\r
-               $timestamp = false;\r
-               \r
-               // calculation starts with month, thus start with\r
-               // month of $time (if within values)\r
-               $currentMonth = date('n', self::$timeBase);\r
-               $currentYear = date('Y', self::$timeBase);\r
-               $index = self::findKey($currentMonth, $values['month']);\r
-               \r
-               self::calculateDay($values);\r
-       }\r
-       \r
-       /**\r
-        * Calculates the day while adjusting month and year to match given criteria.\r
-        * \r
-        * Note: The day of a command's execution can be specified by two fields - day\r
-        * of month, and day of week. If both fields are restricted (ie, aren't *), the\r
-        * command will be run when either field matches the current time. -- crontab(5)\r
-        * \r
-        * @param       array           $values\r
-        * @see         CronjobUtil::getDom()\r
-        */\r
-       protected static function calculateDay(array &$values) {\r
-               $addAnDay = self::calculateHour($values, self::$timeBase);\r
-               $timeBase = self::$timeBase;\r
-               \r
-               if ($addAnDay) {\r
-                       $date = getdate($timeBase);\r
-                       $timeBase = mktime(0, 0, 1, $date['mon'], $date['mday'] + 1, $date['year']);\r
-               }\r
-               \r
-               $day = date('j', $timeBase);\r
-               $month = date('n', $timeBase);\r
-               $year = date('Y', $timeBase);\r
-               \r
-               // calculate date of next execution based upon day of week\r
-               $dateDow = self::calculateDow($month, $year, $values, $day);\r
-               $dateDowTimestamp = mktime(0, 0, 1, $dateDow['month'], $dateDow['day'], $dateDow['year']);\r
-               \r
-               // calculate date of next execution based upon day of month\r
-               $dateDom = self::calculateDom($month, $year, $values, $day);\r
-               $dateDomTimestamp = mktime(0, 0, 1, $dateDom['month'], $dateDom['day'], $dateDom['year']);\r
-               \r
-               // pick the earlier date if both dom and dow are restricted\r
-               if (self::$domRestricted && self::$dowRestricted) {\r
-                       if ($dateDowTimestamp < $dateDomTimestamp) {\r
-                               self::$result['day'] = $dateDow['day'];\r
-                               self::$result['month'] = $dateDow['month'];\r
-                               self::$result['year'] = $dateDow['year'];\r
-                       }\r
-                       else {\r
-                               self::$result['day'] = $dateDom['day'];\r
-                               self::$result['month'] = $dateDom['month'];\r
-                               self::$result['year'] = $dateDom['year'];\r
-                       }\r
-               }\r
-               else {\r
-                       if (self::$domRestricted) {\r
-                               self::$result['day'] = $dateDom['day'];\r
-                               self::$result['month'] = $dateDom['month'];\r
-                               self::$result['year'] = $dateDom['year'];\r
-                       }\r
-                       else if (self::$dowRestricted) {\r
-                               self::$result['day'] = $dateDow['day'];\r
-                               self::$result['month'] = $dateDow['month'];\r
-                               self::$result['year'] = $dateDow['year'];\r
-                       }\r
-                       // neither dom nor dow are restricted, thus pick the date given by time base\r
-                       else {\r
-                               self::$result['day'] = $day;\r
-                               self::$result['month'] = $month;\r
-                               self::$result['year'] = $year;\r
-                       }\r
-                       \r
-               }\r
-               \r
-               // compare day, month and year wether we have to recalculate hour and minute\r
-               if (($day != self::$result['day']) || ($month != self::$result['month']) || ($year != self::$result['year'])) {\r
-                       // calculate new time base\r
-                       $timeBase = mktime(0, 0, 1, self::$result['month'], self::$result['day'], self::$result['year']);\r
-                       \r
-                       self::calculateHour($values, $timeBase);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Calculates the date of next execution based upon a given set for day of week.\r
-        * \r
-        * @param       integer         $month\r
-        * @param       integer         $year\r
-        * @param       array           $values\r
-        * @param       integer         $day\r
-        * @return      array\r
-        */\r
-       protected static function calculateDow($month, $year, array &$values, $day = 1) {\r
-               $days = date('t', mktime(0, 0, 1, $month, $day, $year));\r
-               \r
-               for ($i = $day; $i <= $days; $i++) {\r
-                       // get dow\r
-                       $dow = date('w', mktime(0, 0, 1, $month, $i, $year));\r
-                       \r
-                       if (in_array($dow, $values['dow'])) {\r
-                               return array(\r
-                                       'day' => $i,\r
-                                       'month' => $month,\r
-                                       'year' => $year\r
-                               );\r
-                       }\r
-               }\r
-               \r
-               // try next month\r
-               return self::calculateDow(++$month, $year, $values);\r
-       }\r
-       \r
-       /**\r
-        * Calculates the date of next execution based upon a given set for day of month.\r
-        * \r
-        * @param       integer         $month\r
-        * @param       integer         $year\r
-        * @param       array           $values\r
-        * @param       integer         $day\r
-        * @return      array\r
-        */\r
-       protected static function calculateDom($month, $year, array &$values, $day = 1) {\r
-               $days = date('t', mktime(0, 0, 1, $month, $day, $year));\r
-               \r
-               for ($i = $day; $i <= $days; $i++) {\r
-                       if (in_array($i, $values['dom'])) {\r
-                               return array(\r
-                                       'day' => $i,\r
-                                       'month' => $month,\r
-                                       'year' => $year\r
-                               );\r
-                       }\r
-               }\r
-               \r
-               // try next month\r
-               return self::calculateDom(++$month, $year, $values);\r
-       }\r
-       \r
-       /**\r
-        * Calculates hour of next execution. Returns number of days which\r
-        * had been added in order to match expression for hour and minutes.\r
-        * \r
-        * @param       array           $values\r
-        * @param       integer         $timeBase\r
-        * @return      integer\r
-        */\r
-       protected static function calculateHour(array &$values, &$timeBase) {\r
-               $addAnDay = false;\r
-               \r
-               // compare hour\r
-               $hour = intval(date('G', $timeBase));\r
-               $index = self::findKey($hour, $values['hour'], false);\r
-               if ($index === false) {\r
-                       $index = self::findKey($hour, $values['hour']);\r
-                       $addAnDay = true;\r
-               }\r
-               $hour = $values['hour'][$index];\r
-               \r
-               // calculate minutes\r
-               $addAnHour = self::calculateMinute($values, $timeBase, $addAnDay);\r
-               \r
-               if ($addAnHour) {\r
-                       $hour++;\r
-                       $index = self::findKey($hour, $values['hour'], false);\r
-                       \r
-                       if ($index === false) {\r
-                               if ($index === false) {\r
-                                       $index = self::findKey($hour, $values['hour']);\r
-                                       $addAnDay = true;\r
-                               }\r
-                               $hour = $values['hour'][$index];\r
-                       }\r
-               }\r
-               \r
-               self::$result['hour'] = $hour;\r
-               \r
-               return $addAnDay;\r
-       }\r
-       \r
-       /**\r
-        * Calculates minutes of next execution. Returns false if minute-declaration\r
-        * is past the current hour, thus requires to add at least one hour.\r
-        * \r
-        * @param       array           $values\r
-        * @param       integer         $timeBase\r
-        * @return      boolean\r
-        */\r
-       protected static function calculateMinute(array &$values, &$timeBase, $addAnDay) {\r
-               $returnValue = false;\r
-               \r
-               if ($addAnDay) {\r
-                       $minute = 0;\r
-               }\r
-               else {\r
-                       $minute = date('i', $timeBase);\r
-               }\r
-               \r
-               $index = self::findKey($minute, $values['minute'], false);\r
-               \r
-               // if index was out of bounds, pick the first item but\r
-               // notify calling method that we had to increase the hour\r
-               if ($index === false) {\r
-                       $index = self::findKey($minute, $values['minute']);\r
-                       $returnValue = true;\r
-               }\r
-               \r
-               self::$result['minute'] = $values['minute'][$index];\r
-               \r
-               return $returnValue;\r
-       }\r
-       \r
-       /**\r
-        * Tries to find index of an array element which is bigger or equal the current\r
-        * needle. If $continue is not set to false and foreach-loop is out of bounds,\r
-        * then the array-index '0' is returned, referring the first item.\r
-        * \r
-        * @param       integer         $needle\r
-        * @param       array           $haystack\r
-        * @param       boolean         $continue\r
-        * @return      mixed\r
-        */\r
-       protected static function findKey($needle, array &$haystack, $continue = true) {\r
-               $index = array_search($needle, $haystack);\r
-               \r
-               if ($index === false) {\r
-                       foreach ($haystack as $key => $value) {\r
-                               if ($needle < $value) {\r
-                                       $index = $key;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       \r
-                       if ($continue && $index === false) {\r
-                               $index = 0;\r
-                       }\r
-               }\r
-               \r
-               return $index;\r
-       }\r
-       \r
-       /**\r
-        * Calculates all values matching possible expressions.\r
-        * \r
-        * @param       string          $fieldName\r
-        * @param       string          $fieldValue\r
-        * @return      array\r
-        */\r
-       protected static function calculateValue($fieldName, $fieldValue) {\r
-               $values = array();\r
-               \r
-               // examinate first char\r
-               $char = StringUtil::substring($fieldValue, 0, 1);\r
-               \r
-               // could be a single value, range or list\r
-               if (is_numeric($char)) {\r
-                       $items = self::getListItems($fieldValue);\r
-                       \r
-                       foreach ($items as $item) {\r
-                               $values = array_merge($values, self::getRanges($item));\r
-                       }\r
-               }\r
-               // asterisk may be followed by a step value\r
-               else if ($char == '*') {\r
-                       $step = 1;\r
-                       \r
-                       if (StringUtil::indexOf($fieldValue, '/') !== false) {\r
-                               $rangeData = explode('/', $fieldValue);\r
-                               $step = $rangeData[1];\r
-                       }\r
-                       \r
-                       $values = self::calculateRange(self::$ranges[$fieldName][0], self::$ranges[$fieldName][1], $step);\r
-               }\r
-               \r
-               sort($values, SORT_NUMERIC);\r
-               \r
-               return $values;\r
-       }\r
-       \r
-       /**\r
-        * Tries to parse list items separated by a comma.\r
-        * \r
-        * @param       string          $fieldValue\r
-        * @return      array\r
-        */\r
-       protected static function getListItems($fieldValue) {\r
-               if (StringUtil::indexOf($fieldValue, ',') !== false) {\r
-                       return explode(',', $fieldValue);\r
-               }\r
-               \r
-               return array($fieldValue);\r
-       }\r
-       \r
-       /**\r
-        * Parses a possible range of values including a step value.\r
-        * \r
-        * @param       string          $value\r
-        * @return      array\r
-        */\r
-       protected static function getRanges($value) {\r
-               // this is a single value\r
-               if (StringUtil::indexOf($value, '-') === false) {\r
-                       return array($value);\r
-               }\r
-               \r
-               $step = 1;\r
-               if (StringUtil::indexOf($value, '/') !== false) {\r
-                       $data = explode('/', $value);\r
-                       $step = $data[1];\r
-                       $value = $data[0];\r
-               }\r
-               \r
-               $data = explode('-', $value);\r
-               \r
-               return self::calculateRange($data[0], $data[1], $step);\r
-       }\r
-       \r
-       /**\r
-        * Calculates all values for a given range.\r
-        * \r
-        * @param       integer         $startValue\r
-        * @param       integer         $endValue\r
-        * @param       integer         $step\r
-        * @return      array\r
-        */\r
-       protected static function calculateRange($startValue, $endValue, $step = 1) {\r
-               $values = array();\r
-               \r
-               for ($i = $startValue; $i <= $endValue; $i = $i + $step) {\r
-                       $values[] = $i;\r
-               }\r
-               \r
-               return $values;\r
-       }\r
-       \r
-       /**\r
-        * Validates all cronjob attributes.\r
-        * \r
-        * @param       string          $startMinute\r
-        * @param       string          $startHour\r
-        * @param       string          $startDom\r
-        * @param       string          $startMonth\r
-        * @param       string          $startDow\r
-        * \r
-        * @todo        Move code to seperate class, e.g. CronjobUtil\r
-        */\r
-       public static function validate($startMinute, $startHour, $startDom, $startMonth, $startDow) {\r
-               self::validateAttribute('startMinute', $startMinute);\r
-               self::validateAttribute('startHour', $startHour);\r
-               self::validateAttribute('startDom', $startDom);\r
-               self::validateAttribute('startMonth', $startMonth);\r
-               self::validateAttribute('startDow', $startDow);\r
-       }\r
-       \r
-       /**\r
-        * Validates a cronjob attribute.\r
-        * \r
-        * @param       string          $name\r
-        * @param       string          $value\r
-        * @todo        Move code to seperate class, e.g. CronjobUtil\r
-        */\r
-       protected static function validateAttribute($name, $value) {\r
-               if ($value === '') {\r
-                       throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");\r
-               }\r
-               \r
-               $pattern = '';\r
-               $step = '[1-9]?[0-9]';\r
-               $months = 'jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec';\r
-               $days = 'mon|tue|wed|thu|fri|sat|sun';\r
-               $namesArr = array();\r
-               \r
-               switch ($name) {\r
-                       // check if startMinute is a valid minute or a list of valid minutes.\r
-                       case 'startMinute':\r
-                               $pattern = '[ ]*(\b[0-5]?[0-9]\b)[ ]*';\r
-                               break;\r
-                               \r
-                       // check if startHour is a valid hour or a list of valid hours.\r
-                       case 'startHour':\r
-                               $pattern = '[ ]*(\b[01]?[0-9]\b|\b2[0-3]\b)[ ]*';\r
-                               break;\r
-                               \r
-                       // check if startDom is a valid day of month or a list of valid days of month.\r
-                       case 'startDom':\r
-                               $pattern = '[ ]*(\b[01]?[1-9]\b|\b2[0-9]\b|\b3[01]\b)[ ]*';\r
-                               break;\r
-                               \r
-                       // check if startMonth is a valid month or a list of valid months.\r
-                       case 'startMonth':\r
-                               $digits = '[ ]*(\b[0-1]?[0-9]\b)[ ]*';\r
-                               $namesArr = explode('|', $months);\r
-                               $pattern = '('.$digits.')|([ ]*('.$months.')[ ]*)';\r
-                               break;\r
-                               \r
-                       // check if startDow is a valid day of week or a list of valid days of week.\r
-                       case 'startDow':\r
-                               $digits = '[ ]*(\b[0]?[0-7]\b)[ ]*';\r
-                               $namesArr = explode('|', $days);\r
-                               $pattern = '('.$digits.')|([ ]*('.$days.')[ ]*)';\r
-                               break;\r
-               }\r
-               \r
-               // perform the actual regex pattern matching.\r
-               $range = '((('.$pattern.')|(\*\/'.$step.')?)|((('.$pattern.')-('.$pattern.'))(\/'.$step.')?))';\r
-               \r
-               // $longPattern prototype: ^\d+(,\d)*$\r
-               // $longPattern = '/^(?<!,)'.$range.'+(,'.$range.')*$/i'; // with assertions?\r
-               // $longPattern = '/^'.$range.'+(,'.$range.')*$/i'; / does not work on some php installations\r
-               $longPattern = '/^'.$range.'(,'.$range.')*$/i';\r
-               \r
-               preg_match($longPattern, $value);\r
-               if ($value != '*' && !preg_match($longPattern, $value)) {\r
-                       throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");\r
-               }\r
-               // test whether the user provided a meaningful order inside a range.\r
-               else {\r
-                       $testArr = explode(',', $value);\r
-                       foreach ($testArr as $testField) {\r
-                               if ($pattern && preg_match('/^((('.$pattern.')-('.$pattern.'))(\/'.$step.')?)+$/', $testField)) {\r
-                                       $compare = explode('-', $testField);\r
-                                       $compareSlash = explode('/', $compare['1']);\r
-                                       if (count($compareSlash) == 2) $compare['1'] = $compareSlash['0'];\r
-                                       \r
-                                       // see if digits or names are being given.\r
-                                       $left = array_search(StringUtil::toLowerCase($compare['0']), $namesArr);\r
-                                       $right = array_search(StringUtil::toLowerCase($compare['1']), $namesArr);\r
-                                       if (!$left) $left = $compare['0'];\r
-                                       if (!$right) $right = $compare['1'];\r
-                                       // now check the values.\r
-                                       if (intval($left) > intval($right)) {\r
-                                               throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Provides methods used for cron-like time calculations.
+ * As against the official cron-documentation, this implementation
+ * does not support using nicknames (prefixed by the '@' character).
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage util
+ * @category   Community Framework
+ */
+abstract class CronjobUtil {
+       /**
+        * Set to true if day of month is '*'
+        * 
+        * @var boolean
+        */
+       protected static $domRestricted = false;
+       
+       /**
+        * Set to true if day of week is '*'
+        * 
+        * @var boolean
+        */
+       protected static $dowRestricted = false;
+       
+       /**
+        * Result date
+        * 
+        * @var array<integer>
+        */
+       protected static $result = array();
+       
+       /**
+        * Time based used as reference for finding the next time of execution
+        * 
+        * @var integer
+        */
+       protected static $timeBase = 0;
+       
+       /**
+        * Valid ranges for each known field. Note that the range for
+        * 'day of month' is missing, since it varies on each month.
+        * 
+        * @var array<array>
+        */
+       public static $ranges = array(
+               'minute' => array(0, 59),
+               'hour' => array(0, 23),
+               'dom' => array(1, 31),
+               'month' => array(1, 12),
+               'dow' => array(0, 6)
+       );
+       
+       /**
+        * Calculates timestamp for next execution based on cron-like expressions and a given time base.
+        * 
+        * @param       string          $minute
+        * @param       string          $hour
+        * @param       string          $dom
+        * @param       string          $month
+        * @param       string          $dow
+        * @param       integer         $timeBase
+        * @return      integer
+        */
+       public static function calculateNextExec($minute, $hour, $dom, $month, $dow, $timeBase = TIME_NOW) {
+               // initialize fields
+               self::$timeBase = $timeBase;
+               self::$result = array(
+                       'minute' => 0,
+                       'hour' => 0,
+                       'day' => 0,
+                       'month' => 0,
+                       'year' => 0
+               );
+               
+               $fields = array(
+                       'minute' => $minute,
+                       'hour' => $hour,
+                       'dom' => $dom,
+                       'month' => $month,
+                       'dow' => $dow
+               );
+               
+               self::$domRestricted = ($dom != '*') ? true : false;
+               self::$dowRestricted = ($dow != '*') ? true : false;
+               
+               // calculate values based upon each expression
+               foreach ($fields as $fieldName => $fieldValue) {
+                       $fieldValue = StringUtil::toLowerCase($fieldValue);
+                       
+                       // Names can also be used for the "month" and "day of week" fields.
+                       // Use the first three letters of the particular day or month (case
+                       // doesn't matter). Ranges or lists of names are not allowed.
+                       // -- crontab (5)
+                       
+                       switch ($fieldName) {
+                               case 'dow':
+                                       $dayNames = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
+                                       
+                                       if (strlen($fieldValue) == 3 && in_array($fieldName, $dayNames)) {
+                                               $fieldValue = $monthNames[$fieldValue];
+                                       }
+                                       // When specifying day of week, both day 0 and day 7
+                                       // will be considered Sunday. -- crontab(5) 
+                                       else if ($fieldValue == 7) {
+                                               $fieldValue = 0;
+                                       }
+                               break;
+                               
+                               case 'month':
+                                       $monthNames = array('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec');
+                                       
+                                       if (strlen($fieldValue) == 3 && in_array($fieldValue, $monthNames)) {
+                                               $fieldValue = $monthNames[$fieldValue] + 1;
+                                       }
+                               break;
+                       }
+                       
+                       $values[$fieldName] = self::calculateValue($fieldName, $fieldValue);
+               }
+               
+               // calculate date of next execution
+               self::calculateTime($values);
+               
+               // return timestamp
+               return mktime(
+                       self::$result['hour'],
+                       self::$result['minute'],
+                       1,
+                       self::$result['month'],
+                       self::$result['day'],
+                       self::$result['year']
+               );
+       }
+       
+       /**
+        * Calculates the date of next execution.
+        * 
+        * @param       array           $values
+        */
+       protected static function calculateTime(array &$values) {
+               $timestamp = false;
+               
+               // calculation starts with month, thus start with
+               // month of $time (if within values)
+               $currentMonth = date('n', self::$timeBase);
+               $currentYear = date('Y', self::$timeBase);
+               $index = self::findKey($currentMonth, $values['month']);
+               
+               self::calculateDay($values);
+       }
+       
+       /**
+        * Calculates the day while adjusting month and year to match given criteria.
+        * 
+        * Note: The day of a command's execution can be specified by two fields - day
+        * of month, and day of week. If both fields are restricted (ie, aren't *), the
+        * command will be run when either field matches the current time. -- crontab(5)
+        * 
+        * @param       array           $values
+        * @see         CronjobUtil::getDom()
+        */
+       protected static function calculateDay(array &$values) {
+               $addAnDay = self::calculateHour($values, self::$timeBase);
+               $timeBase = self::$timeBase;
+               
+               if ($addAnDay) {
+                       $date = getdate($timeBase);
+                       $timeBase = mktime(0, 0, 1, $date['mon'], $date['mday'] + 1, $date['year']);
+               }
+               
+               $day = date('j', $timeBase);
+               $month = date('n', $timeBase);
+               $year = date('Y', $timeBase);
+               
+               // calculate date of next execution based upon day of week
+               $dateDow = self::calculateDow($month, $year, $values, $day);
+               $dateDowTimestamp = mktime(0, 0, 1, $dateDow['month'], $dateDow['day'], $dateDow['year']);
+               
+               // calculate date of next execution based upon day of month
+               $dateDom = self::calculateDom($month, $year, $values, $day);
+               $dateDomTimestamp = mktime(0, 0, 1, $dateDom['month'], $dateDom['day'], $dateDom['year']);
+               
+               // pick the earlier date if both dom and dow are restricted
+               if (self::$domRestricted && self::$dowRestricted) {
+                       if ($dateDowTimestamp < $dateDomTimestamp) {
+                               self::$result['day'] = $dateDow['day'];
+                               self::$result['month'] = $dateDow['month'];
+                               self::$result['year'] = $dateDow['year'];
+                       }
+                       else {
+                               self::$result['day'] = $dateDom['day'];
+                               self::$result['month'] = $dateDom['month'];
+                               self::$result['year'] = $dateDom['year'];
+                       }
+               }
+               else {
+                       if (self::$domRestricted) {
+                               self::$result['day'] = $dateDom['day'];
+                               self::$result['month'] = $dateDom['month'];
+                               self::$result['year'] = $dateDom['year'];
+                       }
+                       else if (self::$dowRestricted) {
+                               self::$result['day'] = $dateDow['day'];
+                               self::$result['month'] = $dateDow['month'];
+                               self::$result['year'] = $dateDow['year'];
+                       }
+                       // neither dom nor dow are restricted, thus pick the date given by time base
+                       else {
+                               self::$result['day'] = $day;
+                               self::$result['month'] = $month;
+                               self::$result['year'] = $year;
+                       }
+                       
+               }
+               
+               // compare day, month and year wether we have to recalculate hour and minute
+               if (($day != self::$result['day']) || ($month != self::$result['month']) || ($year != self::$result['year'])) {
+                       // calculate new time base
+                       $timeBase = mktime(0, 0, 1, self::$result['month'], self::$result['day'], self::$result['year']);
+                       
+                       self::calculateHour($values, $timeBase);
+               }
+       }
+       
+       /**
+        * Calculates the date of next execution based upon a given set for day of week.
+        * 
+        * @param       integer         $month
+        * @param       integer         $year
+        * @param       array           $values
+        * @param       integer         $day
+        * @return      array
+        */
+       protected static function calculateDow($month, $year, array &$values, $day = 1) {
+               $days = date('t', mktime(0, 0, 1, $month, $day, $year));
+               
+               for ($i = $day; $i <= $days; $i++) {
+                       // get dow
+                       $dow = date('w', mktime(0, 0, 1, $month, $i, $year));
+                       
+                       if (in_array($dow, $values['dow'])) {
+                               return array(
+                                       'day' => $i,
+                                       'month' => $month,
+                                       'year' => $year
+                               );
+                       }
+               }
+               
+               // try next month
+               return self::calculateDow(++$month, $year, $values);
+       }
+       
+       /**
+        * Calculates the date of next execution based upon a given set for day of month.
+        * 
+        * @param       integer         $month
+        * @param       integer         $year
+        * @param       array           $values
+        * @param       integer         $day
+        * @return      array
+        */
+       protected static function calculateDom($month, $year, array &$values, $day = 1) {
+               $days = date('t', mktime(0, 0, 1, $month, $day, $year));
+               
+               for ($i = $day; $i <= $days; $i++) {
+                       if (in_array($i, $values['dom'])) {
+                               return array(
+                                       'day' => $i,
+                                       'month' => $month,
+                                       'year' => $year
+                               );
+                       }
+               }
+               
+               // try next month
+               return self::calculateDom(++$month, $year, $values);
+       }
+       
+       /**
+        * Calculates hour of next execution. Returns number of days which
+        * had been added in order to match expression for hour and minutes.
+        * 
+        * @param       array           $values
+        * @param       integer         $timeBase
+        * @return      integer
+        */
+       protected static function calculateHour(array &$values, &$timeBase) {
+               $addAnDay = false;
+               
+               // compare hour
+               $hour = intval(date('G', $timeBase));
+               $index = self::findKey($hour, $values['hour'], false);
+               if ($index === false) {
+                       $index = self::findKey($hour, $values['hour']);
+                       $addAnDay = true;
+               }
+               $hour = $values['hour'][$index];
+               
+               // calculate minutes
+               $addAnHour = self::calculateMinute($values, $timeBase, $addAnDay);
+               
+               if ($addAnHour) {
+                       $hour++;
+                       $index = self::findKey($hour, $values['hour'], false);
+                       
+                       if ($index === false) {
+                               if ($index === false) {
+                                       $index = self::findKey($hour, $values['hour']);
+                                       $addAnDay = true;
+                               }
+                               $hour = $values['hour'][$index];
+                       }
+               }
+               
+               self::$result['hour'] = $hour;
+               
+               return $addAnDay;
+       }
+       
+       /**
+        * Calculates minutes of next execution. Returns false if minute-declaration
+        * is past the current hour, thus requires to add at least one hour.
+        * 
+        * @param       array           $values
+        * @param       integer         $timeBase
+        * @return      boolean
+        */
+       protected static function calculateMinute(array &$values, &$timeBase, $addAnDay) {
+               $returnValue = false;
+               
+               if ($addAnDay) {
+                       $minute = 0;
+               }
+               else {
+                       $minute = date('i', $timeBase);
+               }
+               
+               $index = self::findKey($minute, $values['minute'], false);
+               
+               // if index was out of bounds, pick the first item but
+               // notify calling method that we had to increase the hour
+               if ($index === false) {
+                       $index = self::findKey($minute, $values['minute']);
+                       $returnValue = true;
+               }
+               
+               self::$result['minute'] = $values['minute'][$index];
+               
+               return $returnValue;
+       }
+       
+       /**
+        * Tries to find index of an array element which is bigger or equal the current
+        * needle. If $continue is not set to false and foreach-loop is out of bounds,
+        * then the array-index '0' is returned, referring the first item.
+        * 
+        * @param       integer         $needle
+        * @param       array           $haystack
+        * @param       boolean         $continue
+        * @return      mixed
+        */
+       protected static function findKey($needle, array &$haystack, $continue = true) {
+               $index = array_search($needle, $haystack);
+               
+               if ($index === false) {
+                       foreach ($haystack as $key => $value) {
+                               if ($needle < $value) {
+                                       $index = $key;
+                                       break;
+                               }
+                       }
+                       
+                       if ($continue && $index === false) {
+                               $index = 0;
+                       }
+               }
+               
+               return $index;
+       }
+       
+       /**
+        * Calculates all values matching possible expressions.
+        * 
+        * @param       string          $fieldName
+        * @param       string          $fieldValue
+        * @return      array
+        */
+       protected static function calculateValue($fieldName, $fieldValue) {
+               $values = array();
+               
+               // examinate first char
+               $char = StringUtil::substring($fieldValue, 0, 1);
+               
+               // could be a single value, range or list
+               if (is_numeric($char)) {
+                       $items = self::getListItems($fieldValue);
+                       
+                       foreach ($items as $item) {
+                               $values = array_merge($values, self::getRanges($item));
+                       }
+               }
+               // asterisk may be followed by a step value
+               else if ($char == '*') {
+                       $step = 1;
+                       
+                       if (StringUtil::indexOf($fieldValue, '/') !== false) {
+                               $rangeData = explode('/', $fieldValue);
+                               $step = $rangeData[1];
+                       }
+                       
+                       $values = self::calculateRange(self::$ranges[$fieldName][0], self::$ranges[$fieldName][1], $step);
+               }
+               
+               sort($values, SORT_NUMERIC);
+               
+               return $values;
+       }
+       
+       /**
+        * Tries to parse list items separated by a comma.
+        * 
+        * @param       string          $fieldValue
+        * @return      array
+        */
+       protected static function getListItems($fieldValue) {
+               if (StringUtil::indexOf($fieldValue, ',') !== false) {
+                       return explode(',', $fieldValue);
+               }
+               
+               return array($fieldValue);
+       }
+       
+       /**
+        * Parses a possible range of values including a step value.
+        * 
+        * @param       string          $value
+        * @return      array
+        */
+       protected static function getRanges($value) {
+               // this is a single value
+               if (StringUtil::indexOf($value, '-') === false) {
+                       return array($value);
+               }
+               
+               $step = 1;
+               if (StringUtil::indexOf($value, '/') !== false) {
+                       $data = explode('/', $value);
+                       $step = $data[1];
+                       $value = $data[0];
+               }
+               
+               $data = explode('-', $value);
+               
+               return self::calculateRange($data[0], $data[1], $step);
+       }
+       
+       /**
+        * Calculates all values for a given range.
+        * 
+        * @param       integer         $startValue
+        * @param       integer         $endValue
+        * @param       integer         $step
+        * @return      array
+        */
+       protected static function calculateRange($startValue, $endValue, $step = 1) {
+               $values = array();
+               
+               for ($i = $startValue; $i <= $endValue; $i = $i + $step) {
+                       $values[] = $i;
+               }
+               
+               return $values;
+       }
+       
+       /**
+        * Validates all cronjob attributes.
+        * 
+        * @param       string          $startMinute
+        * @param       string          $startHour
+        * @param       string          $startDom
+        * @param       string          $startMonth
+        * @param       string          $startDow
+        * 
+        * @todo        Move code to seperate class, e.g. CronjobUtil
+        */
+       public static function validate($startMinute, $startHour, $startDom, $startMonth, $startDow) {
+               self::validateAttribute('startMinute', $startMinute);
+               self::validateAttribute('startHour', $startHour);
+               self::validateAttribute('startDom', $startDom);
+               self::validateAttribute('startMonth', $startMonth);
+               self::validateAttribute('startDow', $startDow);
+       }
+       
+       /**
+        * Validates a cronjob attribute.
+        * 
+        * @param       string          $name
+        * @param       string          $value
+        * @todo        Move code to seperate class, e.g. CronjobUtil
+        */
+       protected static function validateAttribute($name, $value) {
+               if ($value === '') {
+                       throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");
+               }
+               
+               $pattern = '';
+               $step = '[1-9]?[0-9]';
+               $months = 'jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec';
+               $days = 'mon|tue|wed|thu|fri|sat|sun';
+               $namesArr = array();
+               
+               switch ($name) {
+                       // check if startMinute is a valid minute or a list of valid minutes.
+                       case 'startMinute':
+                               $pattern = '[ ]*(\b[0-5]?[0-9]\b)[ ]*';
+                               break;
+                               
+                       // check if startHour is a valid hour or a list of valid hours.
+                       case 'startHour':
+                               $pattern = '[ ]*(\b[01]?[0-9]\b|\b2[0-3]\b)[ ]*';
+                               break;
+                               
+                       // check if startDom is a valid day of month or a list of valid days of month.
+                       case 'startDom':
+                               $pattern = '[ ]*(\b[01]?[1-9]\b|\b2[0-9]\b|\b3[01]\b)[ ]*';
+                               break;
+                               
+                       // check if startMonth is a valid month or a list of valid months.
+                       case 'startMonth':
+                               $digits = '[ ]*(\b[0-1]?[0-9]\b)[ ]*';
+                               $namesArr = explode('|', $months);
+                               $pattern = '('.$digits.')|([ ]*('.$months.')[ ]*)';
+                               break;
+                               
+                       // check if startDow is a valid day of week or a list of valid days of week.
+                       case 'startDow':
+                               $digits = '[ ]*(\b[0]?[0-7]\b)[ ]*';
+                               $namesArr = explode('|', $days);
+                               $pattern = '('.$digits.')|([ ]*('.$days.')[ ]*)';
+                               break;
+               }
+               
+               // perform the actual regex pattern matching.
+               $range = '((('.$pattern.')|(\*\/'.$step.')?)|((('.$pattern.')-('.$pattern.'))(\/'.$step.')?))';
+               
+               // $longPattern prototype: ^\d+(,\d)*$
+               // $longPattern = '/^(?<!,)'.$range.'+(,'.$range.')*$/i'; // with assertions?
+               // $longPattern = '/^'.$range.'+(,'.$range.')*$/i'; / does not work on some php installations
+               $longPattern = '/^'.$range.'(,'.$range.')*$/i';
+               
+               preg_match($longPattern, $value);
+               if ($value != '*' && !preg_match($longPattern, $value)) {
+                       throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");
+               }
+               // test whether the user provided a meaningful order inside a range.
+               else {
+                       $testArr = explode(',', $value);
+                       foreach ($testArr as $testField) {
+                               if ($pattern && preg_match('/^((('.$pattern.')-('.$pattern.'))(\/'.$step.')?)+$/', $testField)) {
+                                       $compare = explode('-', $testField);
+                                       $compareSlash = explode('/', $compare['1']);
+                                       if (count($compareSlash) == 2) $compare['1'] = $compareSlash['0'];
+                                       
+                                       // see if digits or names are being given.
+                                       $left = array_search(StringUtil::toLowerCase($compare['0']), $namesArr);
+                                       $right = array_search(StringUtil::toLowerCase($compare['1']), $namesArr);
+                                       if (!$left) $left = $compare['0'];
+                                       if (!$right) $right = $compare['1'];
+                                       // now check the values.
+                                       if (intval($left) > intval($right)) {
+                                               throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");
+                                       }
+                               }
+                       }
+               }
+       }
 }
index db2772c5552ddad780c1fdafa1439862dbf13e4b..045291e1a85b9fbbe33472291dac6d23966e8888 100644 (file)
@@ -1,56 +1,56 @@
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Contains image-related functions.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf.data.image\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-class ImageUtil {\r
-       /**\r
-        * Checks the content of an image for bad sections. \r
-        * e.g. the use of javascript.\r
-        * Returns false, if any bad stuff was found.\r
-        * \r
-        * @return      boolean \r
-        */\r
-       public static function checkImageContent($file) {\r
-               // get file content\r
-               $content = file_get_contents($file);\r
-               \r
-               // remove some characters\r
-               $content = strtolower(preg_replace('/[^a-z0-9<\(]+/i', '', $content));\r
-               $content = str_replace('description', '', $content);\r
-               \r
-               // search for javascript\r
-               if (strstr($content, 'script') || strstr($content, 'javascript') || strstr($content, 'expression(')) return false;\r
-               \r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Examines the right file extension for an image by the given mime type.\r
-        * @see http://www.php.net/manual/en/function.image-type-to-mime-type.php\r
-        * \r
-        * @param       string          $mimeType\r
-        * @return      string          file extension\r
-        */\r
-       public static function getExtensionByMimeType($mimeType) {\r
-               switch ($mimeType) {\r
-                       case 'image/gif':                       return 'gif';\r
-                       case 'image/jpeg':                      return 'jpg';\r
-                       case 'image/png':                       return 'png';\r
-                       case 'application/x-shockwave-flash':   return 'swf';\r
-                       case 'image/psd':                       return 'psd';\r
-                       case 'image/bmp':\r
-                       case 'image/x-ms-bmp':                  return 'bmp';\r
-                       case 'image/tiff':                      return 'tiff';\r
-                       default:                                return '';\r
-               }\r
-       }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Contains image-related functions.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf.data.image
+ * @subpackage util
+ * @category   Community Framework
+ */
+class ImageUtil {
+       /**
+        * Checks the content of an image for bad sections. 
+        * e.g. the use of javascript.
+        * Returns false, if any bad stuff was found.
+        * 
+        * @return      boolean 
+        */
+       public static function checkImageContent($file) {
+               // get file content
+               $content = file_get_contents($file);
+               
+               // remove some characters
+               $content = strtolower(preg_replace('/[^a-z0-9<\(]+/i', '', $content));
+               $content = str_replace('description', '', $content);
+               
+               // search for javascript
+               if (strstr($content, 'script') || strstr($content, 'javascript') || strstr($content, 'expression(')) return false;
+               
+               return true;
+       }
+       
+       /**
+        * Examines the right file extension for an image by the given mime type.
+        * @see http://www.php.net/manual/en/function.image-type-to-mime-type.php
+        * 
+        * @param       string          $mimeType
+        * @return      string          file extension
+        */
+       public static function getExtensionByMimeType($mimeType) {
+               switch ($mimeType) {
+                       case 'image/gif':                       return 'gif';
+                       case 'image/jpeg':                      return 'jpg';
+                       case 'image/png':                       return 'png';
+                       case 'application/x-shockwave-flash':   return 'swf';
+                       case 'image/psd':                       return 'psd';
+                       case 'image/bmp':
+                       case 'image/x-ms-bmp':                  return 'bmp';
+                       case 'image/tiff':                      return 'tiff';
+                       default:                                return '';
+               }
+       }
 }
index ae5a122a09e583f172b9b3d38a3041482251dd7a..4b7f5db5a37b97b0737f9eeabb6151a09c3d8b25 100644 (file)
@@ -1,47 +1,47 @@
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Provides methods for JSON.\r
- *\r
- * @author     Alexander Ebert\r
- * @copyright  2001-2010 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-class JSON {\r
-       /**\r
-        * Returns the JSON representation of a value.\r
-        * \r
-        * @param       mixed           $data\r
-        * @return      string\r
-        */\r
-       public static function encode($data) {\r
-               return json_encode($data);\r
-       }\r
-       \r
-       /**\r
-        * Decodes a JSON string.\r
-        * \r
-        * @param       string          $json\r
-        * @param       boolean         $asArray\r
-        * @return      array\r
-        */\r
-       public static function decode($json, $asArray = true) {\r
-               // decodes JSON\r
-               $data = json_decode($json, $asArray);\r
-               \r
-               return $data;\r
-       }\r
-       \r
-       /**\r
-        * Returns the last error occurred.\r
-        * \r
-        * @return      integer\r
-        */\r
-       public static function getLastError() {\r
-               return json_last_error();\r
-       }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Provides methods for JSON.
+ *
+ * @author     Alexander Ebert
+ * @copyright  2001-2010 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage util
+ * @category   Community Framework
+ */
+class JSON {
+       /**
+        * Returns the JSON representation of a value.
+        * 
+        * @param       mixed           $data
+        * @return      string
+        */
+       public static function encode($data) {
+               return json_encode($data);
+       }
+       
+       /**
+        * Decodes a JSON string.
+        * 
+        * @param       string          $json
+        * @param       boolean         $asArray
+        * @return      array
+        */
+       public static function decode($json, $asArray = true) {
+               // decodes JSON
+               $data = json_decode($json, $asArray);
+               
+               return $data;
+       }
+       
+       /**
+        * Returns the last error occurred.
+        * 
+        * @return      integer
+        */
+       public static function getLastError() {
+               return json_last_error();
+       }
 }
\ No newline at end of file
index ccc2d3c02c53e0c1cf0bfcdc069a4f7084d8f8b5..dee985cd61b6a75fdc20e41306b83f876dc26ccc 100644 (file)
@@ -1,69 +1,69 @@
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Replaces quoted strings in a text.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-class StringStack {\r
-       protected static $stringStack = array();\r
-       \r
-       /**\r
-        * Replaces a string with an unique hash value.\r
-        *\r
-        * @param       string          $string\r
-        * @param       string          $type\r
-        * @return      string          $hash\r
-        */\r
-       public static function pushToStringStack($string, $type = 'default') {\r
-               $hash = '@@'.StringUtil::getHash(uniqid(microtime()).$string).'@@';\r
-               \r
-               if (!isset(self::$stringStack[$type])) {\r
-                       self::$stringStack[$type] = array();\r
-               }\r
-               \r
-               self::$stringStack[$type][$hash] = $string;\r
-               \r
-               return $hash;\r
-       }\r
-       \r
-       /**\r
-        * Reinserts Strings that have been replaced by unique hash values.\r
-        *\r
-        * @param       string          $string\r
-        * @param       string          $type\r
-        * @return      string          $string\r
-        */\r
-       public static function reinsertStrings($string, $type = 'default') {\r
-               if (isset(self::$stringStack[$type])) {\r
-                       foreach (self::$stringStack[$type] as $hash => $value) {\r
-                               if (StringUtil::indexOf($string, $hash) !== false) {\r
-                                       $string = StringUtil::replace($hash, $value, $string);\r
-                                       unset(self::$stringStack[$type][$hash]);\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               return $string;\r
-       }\r
-       \r
-       /**\r
-        * Returns the stack.\r
-        *\r
-        * @param       string          $type\r
-        * @return      array\r
-        */\r
-       public static function getStack($type = 'default') {\r
-               if (isset(self::$stringStack[$type])) {\r
-                       return self::$stringStack[$type];\r
-               }\r
-               \r
-               return array();\r
-       }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Replaces quoted strings in a text.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage util
+ * @category   Community Framework
+ */
+class StringStack {
+       protected static $stringStack = array();
+       
+       /**
+        * Replaces a string with an unique hash value.
+        *
+        * @param       string          $string
+        * @param       string          $type
+        * @return      string          $hash
+        */
+       public static function pushToStringStack($string, $type = 'default') {
+               $hash = '@@'.StringUtil::getHash(uniqid(microtime()).$string).'@@';
+               
+               if (!isset(self::$stringStack[$type])) {
+                       self::$stringStack[$type] = array();
+               }
+               
+               self::$stringStack[$type][$hash] = $string;
+               
+               return $hash;
+       }
+       
+       /**
+        * Reinserts Strings that have been replaced by unique hash values.
+        *
+        * @param       string          $string
+        * @param       string          $type
+        * @return      string          $string
+        */
+       public static function reinsertStrings($string, $type = 'default') {
+               if (isset(self::$stringStack[$type])) {
+                       foreach (self::$stringStack[$type] as $hash => $value) {
+                               if (StringUtil::indexOf($string, $hash) !== false) {
+                                       $string = StringUtil::replace($hash, $value, $string);
+                                       unset(self::$stringStack[$type][$hash]);
+                               }
+                       }
+               }
+               
+               return $string;
+       }
+       
+       /**
+        * Returns the stack.
+        *
+        * @param       string          $type
+        * @return      array
+        */
+       public static function getStack($type = 'default') {
+               if (isset(self::$stringStack[$type])) {
+                       return self::$stringStack[$type];
+               }
+               
+               return array();
+       }
 }
index 14228d10596353d7e8741d3b00ba28e1110d8fcf..0bf5998a43c7ff60f4c52e48e597d73272ec6994 100644 (file)
-<?php\r
-namespace wcf\util;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Contains user-related functions.\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2009 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-class UserUtil {\r
-       protected static $privateIpList = array("/^0\./", "/^127\.0\.0\.1/", "/^192\.168\..*/", "/^172\.16\..*/", "/^10..*/", "/^224..*/", "/^240..*/");\r
-       \r
-       /**\r
-        * Returns true, if the given name is a valid username.\r
-        * \r
-        * @param       string          $name           username\r
-        * @return      boolean\r
-        */\r
-       public static function isValidUsername($name) {\r
-               // check illegal characters\r
-               if (!preg_match('!^[^,\n]+$!', $name)) {\r
-                       return false;\r
-               }\r
-               // check long words\r
-               $words = preg_split('!\s+!', $name, -1, PREG_SPLIT_NO_EMPTY);\r
-               foreach ($words as $word) {\r
-                       if (StringUtil::length($word) > 20) {\r
-                               return false;\r
-                       }\r
-               }\r
-               return true;\r
-       }\r
-       \r
-       /**\r
-        * Returns true, if the given username is available.\r
-        * \r
-        * @param       string          $name           username\r
-        * @return      boolean\r
-        */\r
-       public static function isAvailableUsername($name) {\r
-               $sql = "SELECT  COUNT(username) AS count\r
-                       FROM    wcf".WCF_N."_user\r
-                       WHERE   username = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($name));\r
-               $row = $statement->fetchArray();\r
-               return $row['count'] == 0;\r
-       }\r
-               \r
-       /**\r
-        * Returns true, if the given e-mail is a valid address.\r
-        * @see http://www.faqs.org/rfcs/rfc821.html\r
-        * \r
-        * @param       string          $email\r
-        * @return      boolean\r
-        */\r
-       public static function isValidEmail($email) {\r
-               // local-part\r
-               $c = '!#\$%&\'\*\+\-\/0-9=\?a-z\^_`\{\}\|~';\r
-               $string = '['.$c.']*(?:\\\\[\x00-\x7F]['.$c.']*)*';\r
-               $localPart = $string.'(?:\.'.$string.')*';\r
-               \r
-               // domain\r
-               $name = '[a-z0-9](?:[a-z0-9-]*[a-z0-9])?';\r
-               $domain = $name.'(?:\.'.$name.')*\.[a-z]{2,}';\r
-               \r
-               // mailbox\r
-               $mailbox = $localPart.'@'.$domain;\r
-               \r
-               return preg_match('/^'.$mailbox.'$/i', $email);\r
-       }\r
-       \r
-       /**\r
-        * Returns true, if the given email address is available.\r
-        * \r
-        * @param       string          $email          email address\r
-        * @return      boolean\r
-        */\r
-       public static function isAvailableEmail($email) {\r
-               $sql = "SELECT  COUNT(email) AS count\r
-                       FROM    wcf".WCF_N."_user\r
-                       WHERE   email = ?";\r
-               $statement = WCF::getDB()->prepareStatement($sql);\r
-               $statement->execute(array($email));\r
-               $row = $statement->fetchArray();\r
-               return $row['count'] == 0;\r
-       }\r
-       \r
-       /**\r
-        * Returns the user agent of the client.\r
-        * \r
-        * @return      string\r
-        */\r
-       public static function getUserAgent() {\r
-               if (isset($_SERVER['HTTP_USER_AGENT'])) return substr($_SERVER['HTTP_USER_AGENT'], 0, 255);\r
-               return '';\r
-       }\r
-       \r
-       /**\r
-        * Returns the ip address of the client.\r
-        *\r
-        * @return      string          ip address\r
-        */\r
-       public static function getIpAddress() {\r
-               $REMOTE_ADDR = '';\r
-               if (isset($_SERVER['REMOTE_ADDR'])) $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];\r
-               if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];\r
-               else $HTTP_X_FORWARDED_FOR = '';\r
-       \r
-               if (!empty($HTTP_X_FORWARDED_FOR)) {\r
-                       $match = array();\r
-                       if (preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $HTTP_X_FORWARDED_FOR, $match)) {\r
-                               $REMOTE_ADDR = preg_replace(self::$privateIpList, $REMOTE_ADDR, $match[1]);     \r
-                       }\r
-               }\r
-       \r
-               // darwin fix\r
-               if ($REMOTE_ADDR == '::1' || $REMOTE_ADDR == 'fe80::1') {\r
-                       $REMOTE_ADDR = '127.0.0.1'; \r
-               }\r
-               \r
-               return $REMOTE_ADDR;\r
-       }\r
-       \r
-       /**\r
-        * Returns the request uri of the active request.\r
-        * \r
-        * @return      string\r
-        */\r
-       public static function getRequestURI() {\r
-               $REQUEST_URI = '';\r
-               /*if (!empty($_SERVER['REQUEST_URI'])) {\r
-                       $REQUEST_URI = $_SERVER['REQUEST_URI'];\r
-               }\r
-               else {*/\r
-                       if (!empty($_SERVER['ORIG_PATH_INFO']) && strpos($_SERVER['ORIG_PATH_INFO'], '.php') !== false) {\r
-                               $REQUEST_URI = $_SERVER['ORIG_PATH_INFO'];\r
-                       }\r
-                       else if (!empty($_SERVER['ORIG_SCRIPT_NAME'])) {\r
-                               $REQUEST_URI = $_SERVER['ORIG_SCRIPT_NAME'];\r
-                       }\r
-                       else if (!empty($_SERVER['SCRIPT_NAME'])) {\r
-                               $REQUEST_URI = $_SERVER['SCRIPT_NAME'];\r
-                       }\r
-                       else if (!empty($_SERVER['PHP_SELF'])) {\r
-                               $REQUEST_URI = $_SERVER['PHP_SELF'];\r
-                       }\r
-                       else if (!empty($_SERVER['PATH_INFO'])) {\r
-                               $REQUEST_URI = $_SERVER['PATH_INFO'];\r
-                       }\r
-                       if (!empty($_SERVER['QUERY_STRING'])) {\r
-                               $REQUEST_URI .= '?'.$_SERVER['QUERY_STRING'];\r
-                       }\r
-               //}\r
-               \r
-               //if (!strstr($REQUEST_URI, '.')) $REQUEST_URI = 'index.php';\r
-               \r
-               return substr(FileUtil::unifyDirSeperator($REQUEST_URI), 0, 255);\r
-       }\r
+<?php
+namespace wcf\util;
+use wcf\system\WCF;
+
+/**
+ * Contains user-related functions.
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2009 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage util
+ * @category   Community Framework
+ */
+class UserUtil {
+       protected static $privateIpList = array("/^0\./", "/^127\.0\.0\.1/", "/^192\.168\..*/", "/^172\.16\..*/", "/^10..*/", "/^224..*/", "/^240..*/");
+       
+       /**
+        * Returns true, if the given name is a valid username.
+        * 
+        * @param       string          $name           username
+        * @return      boolean
+        */
+       public static function isValidUsername($name) {
+               // check illegal characters
+               if (!preg_match('!^[^,\n]+$!', $name)) {
+                       return false;
+               }
+               // check long words
+               $words = preg_split('!\s+!', $name, -1, PREG_SPLIT_NO_EMPTY);
+               foreach ($words as $word) {
+                       if (StringUtil::length($word) > 20) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+       
+       /**
+        * Returns true, if the given username is available.
+        * 
+        * @param       string          $name           username
+        * @return      boolean
+        */
+       public static function isAvailableUsername($name) {
+               $sql = "SELECT  COUNT(username) AS count
+                       FROM    wcf".WCF_N."_user
+                       WHERE   username = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($name));
+               $row = $statement->fetchArray();
+               return $row['count'] == 0;
+       }
+               
+       /**
+        * Returns true, if the given e-mail is a valid address.
+        * @see http://www.faqs.org/rfcs/rfc821.html
+        * 
+        * @param       string          $email
+        * @return      boolean
+        */
+       public static function isValidEmail($email) {
+               // local-part
+               $c = '!#\$%&\'\*\+\-\/0-9=\?a-z\^_`\{\}\|~';
+               $string = '['.$c.']*(?:\\\\[\x00-\x7F]['.$c.']*)*';
+               $localPart = $string.'(?:\.'.$string.')*';
+               
+               // domain
+               $name = '[a-z0-9](?:[a-z0-9-]*[a-z0-9])?';
+               $domain = $name.'(?:\.'.$name.')*\.[a-z]{2,}';
+               
+               // mailbox
+               $mailbox = $localPart.'@'.$domain;
+               
+               return preg_match('/^'.$mailbox.'$/i', $email);
+       }
+       
+       /**
+        * Returns true, if the given email address is available.
+        * 
+        * @param       string          $email          email address
+        * @return      boolean
+        */
+       public static function isAvailableEmail($email) {
+               $sql = "SELECT  COUNT(email) AS count
+                       FROM    wcf".WCF_N."_user
+                       WHERE   email = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($email));
+               $row = $statement->fetchArray();
+               return $row['count'] == 0;
+       }
+       
+       /**
+        * Returns the user agent of the client.
+        * 
+        * @return      string
+        */
+       public static function getUserAgent() {
+               if (isset($_SERVER['HTTP_USER_AGENT'])) return substr($_SERVER['HTTP_USER_AGENT'], 0, 255);
+               return '';
+       }
+       
+       /**
+        * Returns the ip address of the client.
+        *
+        * @return      string          ip address
+        */
+       public static function getIpAddress() {
+               $REMOTE_ADDR = '';
+               if (isset($_SERVER['REMOTE_ADDR'])) $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
+               if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];
+               else $HTTP_X_FORWARDED_FOR = '';
+       
+               if (!empty($HTTP_X_FORWARDED_FOR)) {
+                       $match = array();
+                       if (preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $HTTP_X_FORWARDED_FOR, $match)) {
+                               $REMOTE_ADDR = preg_replace(self::$privateIpList, $REMOTE_ADDR, $match[1]);     
+                       }
+               }
+       
+               // darwin fix
+               if ($REMOTE_ADDR == '::1' || $REMOTE_ADDR == 'fe80::1') {
+                       $REMOTE_ADDR = '127.0.0.1'; 
+               }
+               
+               return $REMOTE_ADDR;
+       }
+       
+       /**
+        * Returns the request uri of the active request.
+        * 
+        * @return      string
+        */
+       public static function getRequestURI() {
+               $REQUEST_URI = '';
+               /*if (!empty($_SERVER['REQUEST_URI'])) {
+                       $REQUEST_URI = $_SERVER['REQUEST_URI'];
+               }
+               else {*/
+                       if (!empty($_SERVER['ORIG_PATH_INFO']) && strpos($_SERVER['ORIG_PATH_INFO'], '.php') !== false) {
+                               $REQUEST_URI = $_SERVER['ORIG_PATH_INFO'];
+                       }
+                       else if (!empty($_SERVER['ORIG_SCRIPT_NAME'])) {
+                               $REQUEST_URI = $_SERVER['ORIG_SCRIPT_NAME'];
+                       }
+                       else if (!empty($_SERVER['SCRIPT_NAME'])) {
+                               $REQUEST_URI = $_SERVER['SCRIPT_NAME'];
+                       }
+                       else if (!empty($_SERVER['PHP_SELF'])) {
+                               $REQUEST_URI = $_SERVER['PHP_SELF'];
+                       }
+                       else if (!empty($_SERVER['PATH_INFO'])) {
+                               $REQUEST_URI = $_SERVER['PATH_INFO'];
+                       }
+                       if (!empty($_SERVER['QUERY_STRING'])) {
+                               $REQUEST_URI .= '?'.$_SERVER['QUERY_STRING'];
+                       }
+               //}
+               
+               //if (!strstr($REQUEST_URI, '.')) $REQUEST_URI = 'index.php';
+               
+               return substr(FileUtil::unifyDirSeperator($REQUEST_URI), 0, 255);
+       }
 }
index 4559fec47ad4b2990a0ee1d3d897bc40cea09cbd..e2dfb690df2c3e0eb44dd35e64170e6ada343f8b 100644 (file)
-<?php\r
-namespace wcf\util;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * Reads and validates xml documents.\r
- * \r
- * @author     Alexander Ebert\r
- * @copyright  2001-2011 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package    com.woltlab.wcf\r
- * @subpackage util\r
- * @category   Community Framework\r
- */\r
-class XML {\r
-       /**\r
-        * DOMDocument object\r
-        * \r
-        * @var DOMDocument\r
-        */\r
-       protected $document = null;\r
-       \r
-       /**\r
-        * document path\r
-        * \r
-        * @var string\r
-        */\r
-       protected $path = '';\r
-       \r
-       /**\r
-        * schema file path\r
-        * \r
-        * @var string\r
-        */\r
-       protected $schema = '';\r
-       \r
-       /**\r
-        * DOMXPath object\r
-        * \r
-        * @var DOMXPath\r
-        */\r
-       protected $xpath = null;\r
-       \r
-       /**\r
-        * Prepares a new instance of DOMDocument and enables own error handler for libxml.\r
-        */     \r
-       public function __construct() {\r
-               libxml_use_internal_errors(true);\r
-               $this->document = new \DOMDocument('1.0', 'UTF-8');\r
-               $this->document->preserveWhiteSpace = false;\r
-       }\r
-       \r
-       /**\r
-        * Loads a xml file for processing.\r
-        * \r
-        * @param       string          $path\r
-        */\r
-       public function load($path) {\r
-               $this->path = $path;\r
-               \r
-               // ensure file exists and is readable\r
-               if (!file_exists($this->path) || !is_readable($this->path)) {\r
-                       throw new SystemException("Could not read xml document located at '".$this->path."'.");\r
-               }\r
-               \r
-               // load xml document\r
-               $this->document->load($path);\r
-               \r
-               // check for errors occured in libxml\r
-               $errors = $this->pollErrors();\r
-               if (count($errors)) {\r
-                       $this->throwException("XML document '".$this->path."' is not valid XML.", $errors);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Loads a xml string, specifying $path is mandatory to provide detailied error handling.\r
-        * \r
-        * @param       string          $path\r
-        * @param       string          $xml\r
-        */\r
-       public function loadXML($path, $xml) {\r
-               $this->path = $path;\r
-               \r
-               // load xml document\r
-               $this->document->loadXML($xml);\r
-               \r
-               // check for errors occured in libxml\r
-               $errors = $this->pollErrors();\r
-               if (count($errors)) {\r
-                       $this->throwException("XML document '".$this->path."' is not valid XML.", $errors);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Validate the loaded document against the specified xml schema definition.\r
-        */\r
-       public function validate() {\r
-               // determine schema\r
-               $this->getSchema();\r
-               \r
-               // validate document against schema\r
-               $this->document->schemaValidate($this->schema);\r
-               \r
-               // check for errors occured in libxml\r
-               $errors = $this->pollErrors();\r
-               if (count($errors)) {\r
-                       $this->throwException("XML document '".$this->path."' violates XML schema definition.", $errors);\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Determines schema for given document.\r
-        */\r
-       protected function getSchema() {\r
-               // determine schema by looking for xsi:schemaLocation\r
-               $this->schema = $this->document->documentElement->getAttributeNS($this->document->documentElement->lookupNamespaceURI('xsi'), 'schemaLocation');\r
-               \r
-               // no valid schema found or it's lacking a valid namespace\r
-               if (strpos($this->schema, ' ') === false) {\r
-                       throw new SystemException("XML document '".$this->path."' does not provide a valid schema.");\r
-               }\r
-               \r
-               // build file path upon namespace and filename\r
-               $tmp = explode(' ', $this->schema);\r
-               $this->schema = WCF_DIR.'xsd/'.StringUtil::substring(sha1($tmp[0]), 0, 8) . '_' . basename($tmp[1]);\r
-               \r
-               if (!file_exists($this->schema) || !is_readable($this->schema)) {\r
-                       throw new SystemException("Could not read XML schema definition located at '".$this->schema."'.");\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Returns a DOMXPath object bound to current DOMDocument object. Default\r
-        * namespace will be bound to prefix 'ns'.\r
-        * \r
-        * @return      DOMXPath\r
-        */\r
-       public function xpath() {\r
-               if ($this->xpath === null) {\r
-                       $this->xpath = new \DOMXPath($this->document);\r
-                       \r
-                       // register default namespace with prefix 'ns'\r
-                       $namespace = $this->document->documentElement->getAttribute('xmlns');\r
-                       $this->xpath->registerNamespace('ns', $namespace);\r
-               }\r
-               \r
-               return $this->xpath;\r
-       }\r
-       \r
-       /**\r
-        * Reads errors from libxml since be bypassed built-in error handler.\r
-        * \r
-        * @see         XML::__construct()\r
-        * @return      array<array>\r
-        */\r
-       protected function pollErrors() {\r
-               $errors = array();\r
-               $errorList = libxml_get_errors();\r
-               \r
-               foreach ($errorList as $error) {\r
-                       $errors[] = array(\r
-                               'message' => $error->message,\r
-                               'line' => $error->line,\r
-                               'file' => $this->path\r
-                       );\r
-               }\r
-               \r
-               libxml_clear_errors();\r
-               \r
-               return $errors;\r
-       }\r
-       \r
-       /**\r
-        * Throws a SystemException providing details on xml errors if applicable.\r
-        * \r
-        * @param       string          $message\r
-        * @param       array           $errors\r
-        */\r
-       protected function throwException($message, array $errors = array()) {\r
-               if (count($errors)) {\r
-                       $description = '<b>LibXML output:</b><pre>';\r
-                       foreach ($errors as $error) {\r
-                               $description .= "#".$error['line']."\t".$error['message'];\r
-                       }\r
-                       $description .= '</pre>';\r
-                       \r
-                       throw new SystemException($message, 0, $description);\r
-               }\r
-               else {\r
-                       throw new SystemException($message);\r
-               }\r
-       }\r
+<?php
+namespace wcf\util;
+use wcf\system\exception\SystemException;
+
+/**
+ * Reads and validates xml documents.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2011 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf
+ * @subpackage util
+ * @category   Community Framework
+ */
+class XML {
+       /**
+        * DOMDocument object
+        * 
+        * @var DOMDocument
+        */
+       protected $document = null;
+       
+       /**
+        * document path
+        * 
+        * @var string
+        */
+       protected $path = '';
+       
+       /**
+        * schema file path
+        * 
+        * @var string
+        */
+       protected $schema = '';
+       
+       /**
+        * DOMXPath object
+        * 
+        * @var DOMXPath
+        */
+       protected $xpath = null;
+       
+       /**
+        * Prepares a new instance of DOMDocument and enables own error handler for libxml.
+        */     
+       public function __construct() {
+               libxml_use_internal_errors(true);
+               $this->document = new \DOMDocument('1.0', 'UTF-8');
+               $this->document->preserveWhiteSpace = false;
+       }
+       
+       /**
+        * Loads a xml file for processing.
+        * 
+        * @param       string          $path
+        */
+       public function load($path) {
+               $this->path = $path;
+               
+               // ensure file exists and is readable
+               if (!file_exists($this->path) || !is_readable($this->path)) {
+                       throw new SystemException("Could not read xml document located at '".$this->path."'.");
+               }
+               
+               // load xml document
+               $this->document->load($path);
+               
+               // check for errors occured in libxml
+               $errors = $this->pollErrors();
+               if (count($errors)) {
+                       $this->throwException("XML document '".$this->path."' is not valid XML.", $errors);
+               }
+       }
+       
+       /**
+        * Loads a xml string, specifying $path is mandatory to provide detailied error handling.
+        * 
+        * @param       string          $path
+        * @param       string          $xml
+        */
+       public function loadXML($path, $xml) {
+               $this->path = $path;
+               
+               // load xml document
+               $this->document->loadXML($xml);
+               
+               // check for errors occured in libxml
+               $errors = $this->pollErrors();
+               if (count($errors)) {
+                       $this->throwException("XML document '".$this->path."' is not valid XML.", $errors);
+               }
+       }
+       
+       /**
+        * Validate the loaded document against the specified xml schema definition.
+        */
+       public function validate() {
+               // determine schema
+               $this->getSchema();
+               
+               // validate document against schema
+               $this->document->schemaValidate($this->schema);
+               
+               // check for errors occured in libxml
+               $errors = $this->pollErrors();
+               if (count($errors)) {
+                       $this->throwException("XML document '".$this->path."' violates XML schema definition.", $errors);
+               }
+       }
+       
+       /**
+        * Determines schema for given document.
+        */
+       protected function getSchema() {
+               // determine schema by looking for xsi:schemaLocation
+               $this->schema = $this->document->documentElement->getAttributeNS($this->document->documentElement->lookupNamespaceURI('xsi'), 'schemaLocation');
+               
+               // no valid schema found or it's lacking a valid namespace
+               if (strpos($this->schema, ' ') === false) {
+                       throw new SystemException("XML document '".$this->path."' does not provide a valid schema.");
+               }
+               
+               // build file path upon namespace and filename
+               $tmp = explode(' ', $this->schema);
+               $this->schema = WCF_DIR.'xsd/'.StringUtil::substring(sha1($tmp[0]), 0, 8) . '_' . basename($tmp[1]);
+               
+               if (!file_exists($this->schema) || !is_readable($this->schema)) {
+                       throw new SystemException("Could not read XML schema definition located at '".$this->schema."'.");
+               }
+       }
+       
+       /**
+        * Returns a DOMXPath object bound to current DOMDocument object. Default
+        * namespace will be bound to prefix 'ns'.
+        * 
+        * @return      DOMXPath
+        */
+       public function xpath() {
+               if ($this->xpath === null) {
+                       $this->xpath = new \DOMXPath($this->document);
+                       
+                       // register default namespace with prefix 'ns'
+                       $namespace = $this->document->documentElement->getAttribute('xmlns');
+                       $this->xpath->registerNamespace('ns', $namespace);
+               }
+               
+               return $this->xpath;
+       }
+       
+       /**
+        * Reads errors from libxml since be bypassed built-in error handler.
+        * 
+        * @see         XML::__construct()
+        * @return      array<array>
+        */
+       protected function pollErrors() {
+               $errors = array();
+               $errorList = libxml_get_errors();
+               
+               foreach ($errorList as $error) {
+                       $errors[] = array(
+                               'message' => $error->message,
+                               'line' => $error->line,
+                               'file' => $this->path
+                       );
+               }
+               
+               libxml_clear_errors();
+               
+               return $errors;
+       }
+       
+       /**
+        * Throws a SystemException providing details on xml errors if applicable.
+        * 
+        * @param       string          $message
+        * @param       array           $errors
+        */
+       protected function throwException($message, array $errors = array()) {
+               if (count($errors)) {
+                       $description = '<b>LibXML output:</b><pre>';
+                       foreach ($errors as $error) {
+                               $description .= "#".$error['line']."\t".$error['message'];
+                       }
+                       $description .= '</pre>';
+                       
+                       throw new SystemException($message, 0, $description);
+               }
+               else {
+                       throw new SystemException($message);
+               }
+       }
 }
index 65f385838de65077f766c9aa4ef59cda33e19fc5..ecb4949dc7bc992aee9ca4ce25c23c172aeacb85 100644 (file)
@@ -1,25 +1,25 @@
-<?php\r
-/**\r
- * default options.inc.php for package installation of package com.woltlab.wcf.\r
- *\r
- * @author     Marcel Werk \r
- * @copyright  2001-2007 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-define('COOKIE_PREFIX', 'wcf_');\r
-define('COOKIE_PATH', '');\r
-define('COOKIE_DOMAIN', '');\r
-\r
-define('HTTP_ENABLE_NO_CACHE_HEADERS', 0);\r
-define('HTTP_ENABLE_GZIP', 0);\r
-define('HTTP_GZIP_LEVEL', 1);\r
-\r
-define('BLACKLIST_IP_ADDRESSES', '');\r
-define('BLACKLIST_USER_AGENTS', '');\r
-define('BLACKLIST_HOSTNAMES', '');\r
-\r
-define('SESSION_TIMEOUT', 3600);\r
-\r
-define('CACHE_SOURCE_TYPE', 'disk');\r
-define('ENABLE_SESSION_DATA_CACHE', 0);\r
+<?php
+/**
+ * default options.inc.php for package installation of package com.woltlab.wcf.
+ *
+ * @author     Marcel Werk 
+ * @copyright  2001-2007 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+define('COOKIE_PREFIX', 'wcf_');
+define('COOKIE_PATH', '');
+define('COOKIE_DOMAIN', '');
+
+define('HTTP_ENABLE_NO_CACHE_HEADERS', 0);
+define('HTTP_ENABLE_GZIP', 0);
+define('HTTP_GZIP_LEVEL', 1);
+
+define('BLACKLIST_IP_ADDRESSES', '');
+define('BLACKLIST_USER_AGENTS', '');
+define('BLACKLIST_HOSTNAMES', '');
+
+define('SESSION_TIMEOUT', 3600);
+
+define('CACHE_SOURCE_TYPE', 'disk');
+define('ENABLE_SESSION_DATA_CACHE', 0);
 define('MODULE_MASTER_PASSWORD', 1);
index b73b1576c5f549ff3ec9d3f1720d17d1ab39a4cd..75bfe4b6a2c376bf37013027fcca118baa1ca0bc 100644 (file)
-/**\r
- * Container Styles\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2006-2011 WoltLab GmbH\r
- */\r
\r
-/* -- -- -- -- -- Border -- -- -- -- -- */\r
-\r
-.border {\r
-       border-width: 1px;\r
-       margin-bottom: 7px;\r
-       padding: 1px 0 0 1px;\r
-}\r
-\r
-/* Special */\r
-\r
-.borderMarginRemove {\r
-       margin-top: -8px;\r
-}\r
-\r
-/* -- -- -- -- -- Container Globals -- -- -- -- -- */\r
-\r
-.container-1, .container-2, .container-3, .containerHead {\r
-       margin: 0 1px 1px 0;\r
-}\r
-\r
-.containerHead {\r
-       padding: 2px 5px;\r
-}\r
-\r
-.content > div {\r
-       padding: 7px 25px;\r
-}\r
-\r
-.contentStyler p {\r
-       margin: 5px 0;  \r
-}\r
-\r
-/* -- -- -- -- -- Info Box -- -- -- -- -- */\r
-\r
-.infoBox .container-1, .infoBox .container-2 {\r
-       padding: 4px;\r
-       clear: both;\r
-}\r
-\r
-.infoBox h3 {\r
-       margin: 0 !important;\r
-       font-weight: bold;\r
-}\r
-\r
-/* -- -- -- -- -- Containers with Icons -- -- -- -- -- */\r
-\r
-/* Small (16px Icon) */\r
-\r
-.containerIconSmall {\r
-       text-align: center;\r
-       float: left;\r
-       width: 30px;\r
-}\r
-\r
-.containerContentSmall {\r
-       margin-left: 30px;\r
-}\r
-\r
-/* Standard (24px Icon) */\r
-\r
-.containerIcon {\r
-       text-align: center;\r
-       float: left;\r
-       width: 30px;\r
-}\r
-\r
-.containerContent {\r
-       margin-left: 35px;\r
-}\r
-\r
-/* Large (48px Icon) */\r
-\r
-.containerIconLarge {\r
-       text-align: center;\r
-       float: left;\r
-       width: 50px;\r
-}\r
-\r
-.containerContentLarge {\r
-       margin-left: 60px;\r
-}\r
-\r
-/* -- -- -- -- -- Main Headline -- -- -- -- -- */\r
-\r
-.mainHeadline {\r
-       margin: 3px 0 7px 0;\r
-       padding: 0;\r
-       clear: both;\r
-       display: block;\r
-       min-height: 50px;\r
-       width: 100%;\r
-}\r
-\r
-.mainHeadline img {\r
-       float: left;\r
-}\r
-\r
-.mainHeadline .headlineContainer img {\r
-       float: none;\r
-}\r
-\r
-.mainHeadline .headlineContainer {\r
-       margin: 7px 0 7px 60px;\r
-       min-height: 48px;\r
-}\r
-\r
-.mainHeadline .headlineContainer h2 {\r
-       margin: 0;\r
-       padding: 0;\r
-       overflow: hidden;\r
-}\r
-\r
-.mainHeadline .headlineContainer h2 a {\r
-       text-decoration: none;\r
-}\r
-\r
-.mainHeadline .headlineContainer p {\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-/* -- -- -- -- -- Sub Headline -- -- -- -- -- */\r
-\r
-.subHeadline {\r
-       font-size: 1.5em;\r
-       font-weight: normal;\r
-       border-left-width: 0 !important;\r
-       border-right-width: 0 !important;\r
-       border-top-width: 0 !important;\r
-       margin-top: 7px;\r
-       margin-bottom: 10px !important;\r
-       padding-bottom: 7px;\r
-}\r
-\r
-.subHeadline a {\r
-       text-decoration: none;\r
-}\r
-\r
-.subHeadline span {\r
-       font-size: 75%;\r
-}\r
-\r
-.subHeadline .inputText {\r
-       width: 95%;\r
-}\r
-\r
-/* -- -- -- -- -- Fieldset -- -- -- -- -- */\r
-\r
-fieldset {\r
-       border-width: 1px;\r
-       margin: 10px 0;\r
-       padding: 5px 13px 10px 13px;\r
-       display: block;\r
-}\r
-\r
-fieldset:after {\r
-       content: "";\r
-       display: block;\r
-       clear: both;\r
-       height: 0;\r
-}\r
-\r
-fieldset legend {\r
-       margin: 0 0 0 -5px;\r
-       padding: 0 5px;\r
-}\r
-\r
-fieldset fieldset {\r
-       margin-bottom: 5px;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Container Styles
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2006-2011 WoltLab GmbH
+ */
+/* -- -- -- -- -- Border -- -- -- -- -- */
+
+.border {
+       border-width: 1px;
+       margin-bottom: 7px;
+       padding: 1px 0 0 1px;
+}
+
+/* Special */
+
+.borderMarginRemove {
+       margin-top: -8px;
+}
+
+/* -- -- -- -- -- Container Globals -- -- -- -- -- */
+
+.container-1, .container-2, .container-3, .containerHead {
+       margin: 0 1px 1px 0;
+}
+
+.containerHead {
+       padding: 2px 5px;
+}
+
+.content > div {
+       padding: 7px 25px;
+}
+
+.contentStyler p {
+       margin: 5px 0;  
+}
+
+/* -- -- -- -- -- Info Box -- -- -- -- -- */
+
+.infoBox .container-1, .infoBox .container-2 {
+       padding: 4px;
+       clear: both;
+}
+
+.infoBox h3 {
+       margin: 0 !important;
+       font-weight: bold;
+}
+
+/* -- -- -- -- -- Containers with Icons -- -- -- -- -- */
+
+/* Small (16px Icon) */
+
+.containerIconSmall {
+       text-align: center;
+       float: left;
+       width: 30px;
+}
+
+.containerContentSmall {
+       margin-left: 30px;
+}
+
+/* Standard (24px Icon) */
+
+.containerIcon {
+       text-align: center;
+       float: left;
+       width: 30px;
+}
+
+.containerContent {
+       margin-left: 35px;
+}
+
+/* Large (48px Icon) */
+
+.containerIconLarge {
+       text-align: center;
+       float: left;
+       width: 50px;
+}
+
+.containerContentLarge {
+       margin-left: 60px;
+}
+
+/* -- -- -- -- -- Main Headline -- -- -- -- -- */
+
+.mainHeadline {
+       margin: 3px 0 7px 0;
+       padding: 0;
+       clear: both;
+       display: block;
+       min-height: 50px;
+       width: 100%;
+}
+
+.mainHeadline img {
+       float: left;
+}
+
+.mainHeadline .headlineContainer img {
+       float: none;
+}
+
+.mainHeadline .headlineContainer {
+       margin: 7px 0 7px 60px;
+       min-height: 48px;
+}
+
+.mainHeadline .headlineContainer h2 {
+       margin: 0;
+       padding: 0;
+       overflow: hidden;
+}
+
+.mainHeadline .headlineContainer h2 a {
+       text-decoration: none;
+}
+
+.mainHeadline .headlineContainer p {
+       margin: 0;
+       padding: 0;
+}
+
+/* -- -- -- -- -- Sub Headline -- -- -- -- -- */
+
+.subHeadline {
+       font-size: 1.5em;
+       font-weight: normal;
+       border-left-width: 0 !important;
+       border-right-width: 0 !important;
+       border-top-width: 0 !important;
+       margin-top: 7px;
+       margin-bottom: 10px !important;
+       padding-bottom: 7px;
+}
+
+.subHeadline a {
+       text-decoration: none;
+}
+
+.subHeadline span {
+       font-size: 75%;
+}
+
+.subHeadline .inputText {
+       width: 95%;
+}
+
+/* -- -- -- -- -- Fieldset -- -- -- -- -- */
+
+fieldset {
+       border-width: 1px;
+       margin: 10px 0;
+       padding: 5px 13px 10px 13px;
+       display: block;
+}
+
+fieldset:after {
+       content: "";
+       display: block;
+       clear: both;
+       height: 0;
+}
+
+fieldset legend {
+       margin: 0 0 0 -5px;
+       padding: 0 5px;
+}
+
+fieldset fieldset {
+       margin-bottom: 5px;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index ea5722a75ccbc4fed3d5eba6f94cf5c89798569b..7f7495430c76f92086a547209f4f5bbae831b0bf 100644 (file)
-/**\r
- * Print Styles (RTL)\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- General -- -- -- -- -- */\r
-\r
-a {\r
-       color: black;\r
-}\r
-\r
-.copyright {\r
-       font-size: .7em;\r
-       text-align: center;\r
-       padding-top: 20px;\r
-       clear: both;\r
-       display: block;\r
-}\r
-\r
-#page {\r
-       width: auto !important;\r
-}\r
-\r
-/* -- -- -- -- -- Hidden Elements -- -- -- -- -- */\r
-\r
-.hidden, #header, #userPanel, .tabMenu, .subTabMenu, .signature, .pmView, th img, .messageNumber, .editNote, .pmFolders, .infoBox, .largeButtons, .smallButtons, .optionButtons, .pageNavigation, .pageOptions, .quickJump,  .userExtras, .scrollUp, .userMessenger, .mainHeadline img, .userAvatar, .userAvatarFramed, .columnUsername img, .userProfileBox, .containerIcon, .userPosts, .userName img, .boardlistLastPost, .boardlistCounter,.boardlistStats, .boardlistUsersOnline, .moderators, .smallPages, .columnIcon img, .columnMarkTopics, .columnMark, .columnReplies, .columnAvatar, .columnViews, .columnLastPost, .breadCrumbs img, legend img, .columnHomepage a img, .columnEmail a img, .columnPosts, .columnRegistrationDate, .userRank, .userTitle, .messageCount, .footerMenu, .footerOptions, .mainMenu, .quickReply, .userSymbols, .userCredits, .statusDisplay, .info, #userCard, #tplUserGalleryPhoto form, .thumbnailButtons, .quoteHeader img, #tplCalendarEvent form, #tplCalendarEvent #participation img, .monthJump {\r
-       display: none;\r
-}\r
-\r
-/* -- -- -- -- -- Tables -- -- -- -- -- */\r
-\r
-table {\r
-       border-collapse: collapse;\r
-       width: 100%;\r
-}\r
-\r
-td, th {\r
-       border: 1px solid black;\r
-}\r
-\r
-th, th a {\r
-       color: #fff;\r
-       text-align: right;\r
-       white-space: nowrap;\r
-       background-color: #000;\r
+/**
+ * Print Styles (RTL)
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- General -- -- -- -- -- */
+
+a {
+       color: black;
+}
+
+.copyright {
+       font-size: .7em;
+       text-align: center;
+       padding-top: 20px;
+       clear: both;
+       display: block;
+}
+
+#page {
+       width: auto !important;
+}
+
+/* -- -- -- -- -- Hidden Elements -- -- -- -- -- */
+
+.hidden, #header, #userPanel, .tabMenu, .subTabMenu, .signature, .pmView, th img, .messageNumber, .editNote, .pmFolders, .infoBox, .largeButtons, .smallButtons, .optionButtons, .pageNavigation, .pageOptions, .quickJump,  .userExtras, .scrollUp, .userMessenger, .mainHeadline img, .userAvatar, .userAvatarFramed, .columnUsername img, .userProfileBox, .containerIcon, .userPosts, .userName img, .boardlistLastPost, .boardlistCounter,.boardlistStats, .boardlistUsersOnline, .moderators, .smallPages, .columnIcon img, .columnMarkTopics, .columnMark, .columnReplies, .columnAvatar, .columnViews, .columnLastPost, .breadCrumbs img, legend img, .columnHomepage a img, .columnEmail a img, .columnPosts, .columnRegistrationDate, .userRank, .userTitle, .messageCount, .footerMenu, .footerOptions, .mainMenu, .quickReply, .userSymbols, .userCredits, .statusDisplay, .info, #userCard, #tplUserGalleryPhoto form, .thumbnailButtons, .quoteHeader img, #tplCalendarEvent form, #tplCalendarEvent #participation img, .monthJump {
+       display: none;
+}
+
+/* -- -- -- -- -- Tables -- -- -- -- -- */
+
+table {
+       border-collapse: collapse;
+       width: 100%;
+}
+
+td, th {
+       border: 1px solid black;
+}
+
+th, th a {
+       color: #fff;
+       text-align: right;
+       white-space: nowrap;
+       background-color: #000;
 }
 
 td {
        vertical-align: top;    
-}\r
-\r
-.mainHeadline .headlineContainer h1 {\r
-       font-size: 1.5em;\r
-}\r
-\r
-.columnIcon {\r
-       width: 0;\r
-}\r
-\r
-td p, th p {\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.columnRating {\r
-       text-align: center;\r
-       width: 0;\r
-}\r
-\r
-.columnTopic {\r
-       width: 80%;\r
-}\r
-\r
-.columnTitle p {\r
-       overflow: hidden;\r
-}\r
-\r
-.columnDate {\r
-       white-space: nowrap;\r
-}\r
-\r
-td.columnHomepage a:after {\r
-       content: ""attr(href)"";\r
-}\r
-\r
-td.columnEmail a[href^="mailto:"]:after {\r
-       content: ""attr(href)"";\r
-}\r
-\r
-/* -- -- -- -- -- Breadcrumb Style Navigation -- -- -- -- -- */\r
-\r
-.breadCrumbs {\r
-       list-style: none;\r
-       padding: 0;\r
-       margin: 0;\r
-}\r
-\r
-.breadCrumbs li {\r
-       font-style: italic;\r
-       margin-left: 5px;\r
-       display: inline;\r
-}\r
-\r
-/* -- -- -- -- -- Message Layout -- -- -- -- -- */\r
-\r
-.message {\r
-       border: 1px solid black;\r
-       margin: 7px 3px;\r
-       padding: 13px;\r
-}\r
-\r
-.message hr {\r
-       display: none;\r
-}\r
-\r
-.messageHeader {\r
-       font-style: italic;\r
-       margin: -1em 0 0 0;\r
-       padding: 0;\r
-       text-align: left;\r
-}\r
-\r
-.messageHeader p {\r
-       margin: 0;\r
-}\r
-\r
-.messageContent h3 {\r
-       font-size: 1em;\r
-       margin: 0;\r
-       padding: 7px;\r
-       clear: both;\r
-}\r
-\r
-.messageBody {\r
-       border-top: 1px solid black;\r
-       padding-top: 7px;\r
-       clear: both;\r
-}\r
-\r
-.messageInner {\r
-       margin: -10px 0;\r
-       padding: 0;\r
-}\r
-\r
-.messageText {\r
-       margin: 7px 0;\r
-}\r
-\r
-.messageAuthor, .messageAuthor .userName {\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.messageAuthor .userName {\r
-       font-style: italic;\r
-       font-weight: bold;\r
-       display: inline;\r
-}\r
-\r
-.messageAuthor .userCredits .userTitle {\r
-       font-size: .8em;\r
-       margin: 0 0 -10px 0;\r
-       padding: 0;\r
-}\r
-\r
-blockquote {\r
-       margin: 5px;\r
-}\r
-\r
-.quoteBox {\r
-       border: 1px solid black;\r
-       margin-bottom: 5px;\r
-       padding: 10px;\r
-}\r
-\r
-.quoteBox h3 {\r
-       font-style: italic;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.codeBox h3 {\r
-       font-style: italic;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.poll .containerContent h3 {\r
-       font-style: italic;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.attachmentPreview fieldset {\r
-       margin-top: 13px;\r
-}\r
-\r
-.attachmentPreview ul {\r
-       margin: 0;\r
-       list-style: none;\r
-       padding: 0;\r
-}\r
-\r
-.attachmentPreview li {\r
-       margin-left: 10px;\r
-       float: right;\r
-}\r
-\r
-.attachmentPreview li img {\r
-       margin: 0 !important;\r
-}\r
-\r
-.attachmentFile img {\r
-       display: none;\r
-}\r
-\r
-
-/* -- -- -- -- -- calendar.css -- -- -- -- -- */\r
-\r
-#tplCalendarEvent #participation .messageHeader {\r
-       text-align: right;\r
-}\r
-\r
-/* -- -- -- -- -- Form Element -- -- -- -- -- */\r
-\r
-.formElement {\r
-       margin: 5px 0 3px 0;\r
-       min-height: 0;\r
-}\r
-\r
-.formElement:after {\r
-       content: "";\r
-       height: 0;\r
-       display: block;\r
-       clear: both;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field -- -- -- -- -- */\r
-\r
-.formField {\r
-       padding: 0;\r
-       min-height: 1em;\r
-       border-bottom: 1px solid black;\r
-}\r
-\r
-.formElement .formField {\r
-       margin-right: 216px;\r
-       }\r
-\r
-/* -- -- -- -- -- Form Field Label -- -- -- -- -- */\r
-\r
-.formFieldLabel {\r
-       text-align: left;\r
-       float: right;\r
-       width: 200px;\r
-       margin: 0;\r
-}\r
-\r
-fieldset {\r
-       margin: 20px 1px 0 1px !important;\r
-}\r
-\r
-.formSubmit {\r
-       display: none;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+}
+
+.mainHeadline .headlineContainer h1 {
+       font-size: 1.5em;
+}
+
+.columnIcon {
+       width: 0;
+}
+
+td p, th p {
+       margin: 0;
+       padding: 0;
+}
+
+.columnRating {
+       text-align: center;
+       width: 0;
+}
+
+.columnTopic {
+       width: 80%;
+}
+
+.columnTitle p {
+       overflow: hidden;
+}
+
+.columnDate {
+       white-space: nowrap;
+}
+
+td.columnHomepage a:after {
+       content: ""attr(href)"";
+}
+
+td.columnEmail a[href^="mailto:"]:after {
+       content: ""attr(href)"";
+}
+
+/* -- -- -- -- -- Breadcrumb Style Navigation -- -- -- -- -- */
+
+.breadCrumbs {
+       list-style: none;
+       padding: 0;
+       margin: 0;
+}
+
+.breadCrumbs li {
+       font-style: italic;
+       margin-left: 5px;
+       display: inline;
+}
+
+/* -- -- -- -- -- Message Layout -- -- -- -- -- */
+
+.message {
+       border: 1px solid black;
+       margin: 7px 3px;
+       padding: 13px;
+}
+
+.message hr {
+       display: none;
+}
+
+.messageHeader {
+       font-style: italic;
+       margin: -1em 0 0 0;
+       padding: 0;
+       text-align: left;
+}
+
+.messageHeader p {
+       margin: 0;
+}
+
+.messageContent h3 {
+       font-size: 1em;
+       margin: 0;
+       padding: 7px;
+       clear: both;
+}
+
+.messageBody {
+       border-top: 1px solid black;
+       padding-top: 7px;
+       clear: both;
+}
+
+.messageInner {
+       margin: -10px 0;
+       padding: 0;
+}
+
+.messageText {
+       margin: 7px 0;
+}
+
+.messageAuthor, .messageAuthor .userName {
+       margin: 0;
+       padding: 0;
+}
+
+.messageAuthor .userName {
+       font-style: italic;
+       font-weight: bold;
+       display: inline;
+}
+
+.messageAuthor .userCredits .userTitle {
+       font-size: .8em;
+       margin: 0 0 -10px 0;
+       padding: 0;
+}
+
+blockquote {
+       margin: 5px;
+}
+
+.quoteBox {
+       border: 1px solid black;
+       margin-bottom: 5px;
+       padding: 10px;
+}
+
+.quoteBox h3 {
+       font-style: italic;
+       margin: 0;
+       padding: 0;
+}
+
+.codeBox h3 {
+       font-style: italic;
+       margin: 0;
+       padding: 0;
+}
+
+.poll .containerContent h3 {
+       font-style: italic;
+       margin: 0;
+       padding: 0;
+}
+
+.attachmentPreview fieldset {
+       margin-top: 13px;
+}
+
+.attachmentPreview ul {
+       margin: 0;
+       list-style: none;
+       padding: 0;
+}
+
+.attachmentPreview li {
+       margin-left: 10px;
+       float: right;
+}
+
+.attachmentPreview li img {
+       margin: 0 !important;
+}
+
+.attachmentFile img {
+       display: none;
+}
+
+
+/* -- -- -- -- -- calendar.css -- -- -- -- -- */
+
+#tplCalendarEvent #participation .messageHeader {
+       text-align: right;
+}
+
+/* -- -- -- -- -- Form Element -- -- -- -- -- */
+
+.formElement {
+       margin: 5px 0 3px 0;
+       min-height: 0;
+}
+
+.formElement:after {
+       content: "";
+       height: 0;
+       display: block;
+       clear: both;
+}
+
+/* -- -- -- -- -- Form Field -- -- -- -- -- */
+
+.formField {
+       padding: 0;
+       min-height: 1em;
+       border-bottom: 1px solid black;
+}
+
+.formElement .formField {
+       margin-right: 216px;
+       }
+
+/* -- -- -- -- -- Form Field Label -- -- -- -- -- */
+
+.formFieldLabel {
+       text-align: left;
+       float: right;
+       width: 200px;
+       margin: 0;
+}
+
+fieldset {
+       margin: 20px 1px 0 1px !important;
+}
+
+.formSubmit {
+       display: none;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index 54ad99ab774dbf31d8d728b250afed6d2d58185c..41cbcaa93c076e7c2b42024b1808da7c47b92400 100644 (file)
-/**\r
- * Print Styles (LTR)\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- General -- -- -- -- -- */\r
-\r
-a {\r
-       color: black;\r
-}\r
-\r
-.copyright {\r
-       font-size: .7em;\r
-       text-align: center;\r
-       padding-top: 20px;\r
-       clear: both;\r
-       display: block;\r
-}\r
-\r
-#page {\r
-       width: auto !important;\r
-}\r
-\r
-/* -- -- -- -- -- Hidden Elements -- -- -- -- -- */\r
-\r
-.hidden, #header, #userPanel, .tabMenu, .subTabMenu, .signature, .pmView, th img, .messageNumber, .editNote, .pmFolders, .infoBox, .largeButtons, .smallButtons, .optionButtons, .pageNavigation, .pageOptions, .quickJump,  .userExtras, .scrollUp, .userMessenger, .mainHeadline img, .userAvatar, .userAvatarFramed, .columnUsername img, .userProfileBox, .containerIcon, .userPosts, .userName img, .boardlistLastPost, .boardlistCounter,.boardlistStats, .boardlistUsersOnline, .moderators, .smallPages, .columnIcon img, .columnMarkTopics, .columnMark, .columnReplies, .columnAvatar, .columnViews, .columnLastPost, .breadCrumbs img, legend img, .columnHomepage a img, .columnEmail a img, .columnPosts, .columnRegistrationDate, .userRank, .userTitle, .messageCount, .footerMenu, .footerOptions, .mainMenu, .quickReply, .userSymbols, .userCredits, .statusDisplay, .info, #userCard, #tplUserGalleryPhoto form, .thumbnailButtons, .quoteHeader img, #tplCalendarEvent form, #tplCalendarEvent #participation img, .monthJump {\r
-       display: none;\r
-}\r
-\r
-/* -- -- -- -- -- Tables -- -- -- -- -- */\r
-\r
-table {\r
-       border-collapse: collapse;\r
-       width: 100%;\r
-}\r
-\r
-td, th {\r
-       border: 1px solid black;\r
-}\r
-\r
-th, th a {\r
-       color: #fff;\r
-       text-align: left;\r
-       white-space: nowrap;\r
-       background-color: #000;\r
+/**
+ * Print Styles (LTR)
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- General -- -- -- -- -- */
+
+a {
+       color: black;
+}
+
+.copyright {
+       font-size: .7em;
+       text-align: center;
+       padding-top: 20px;
+       clear: both;
+       display: block;
+}
+
+#page {
+       width: auto !important;
+}
+
+/* -- -- -- -- -- Hidden Elements -- -- -- -- -- */
+
+.hidden, #header, #userPanel, .tabMenu, .subTabMenu, .signature, .pmView, th img, .messageNumber, .editNote, .pmFolders, .infoBox, .largeButtons, .smallButtons, .optionButtons, .pageNavigation, .pageOptions, .quickJump,  .userExtras, .scrollUp, .userMessenger, .mainHeadline img, .userAvatar, .userAvatarFramed, .columnUsername img, .userProfileBox, .containerIcon, .userPosts, .userName img, .boardlistLastPost, .boardlistCounter,.boardlistStats, .boardlistUsersOnline, .moderators, .smallPages, .columnIcon img, .columnMarkTopics, .columnMark, .columnReplies, .columnAvatar, .columnViews, .columnLastPost, .breadCrumbs img, legend img, .columnHomepage a img, .columnEmail a img, .columnPosts, .columnRegistrationDate, .userRank, .userTitle, .messageCount, .footerMenu, .footerOptions, .mainMenu, .quickReply, .userSymbols, .userCredits, .statusDisplay, .info, #userCard, #tplUserGalleryPhoto form, .thumbnailButtons, .quoteHeader img, #tplCalendarEvent form, #tplCalendarEvent #participation img, .monthJump {
+       display: none;
+}
+
+/* -- -- -- -- -- Tables -- -- -- -- -- */
+
+table {
+       border-collapse: collapse;
+       width: 100%;
+}
+
+td, th {
+       border: 1px solid black;
+}
+
+th, th a {
+       color: #fff;
+       text-align: left;
+       white-space: nowrap;
+       background-color: #000;
 }
 
 td {
        vertical-align: top;    
-}\r
-\r
-.mainHeadline .headlineContainer h1 {\r
-       font-size: 1.5em;\r
-}\r
-\r
-.columnIcon {\r
-       width: 0;\r
-}\r
-\r
-td p, th p {\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.columnRating {\r
-       text-align: center;\r
-       width: 0;\r
-}\r
-\r
-.columnTopic {\r
-       width: 80%;\r
-}\r
-\r
-.columnTitle p {\r
-       overflow: hidden;\r
-}\r
-\r
-.columnDate {\r
-       white-space: nowrap;\r
-}\r
-\r
-td.columnHomepage a:after {\r
-       content: ""attr(href)"";\r
-}\r
-\r
-td.columnEmail a[href^="mailto:"]:after {\r
-       content: ""attr(href)"";\r
-}\r
-\r
-/* -- -- -- -- -- Breadcrumb Style Navigation -- -- -- -- -- */\r
-\r
-.breadCrumbs {\r
-       list-style: none;\r
-       padding: 0;\r
-       margin: 0;\r
-}\r
-\r
-.breadCrumbs li {\r
-       font-style: italic;\r
-       margin-right: 5px;\r
-       display: inline;\r
-}\r
-\r
-/* -- -- -- -- -- Message Layout -- -- -- -- -- */\r
-\r
-.message {\r
-       border: 1px solid black;\r
-       margin: 7px 3px;\r
-       padding: 13px;\r
-}\r
-\r
-.message hr {\r
-       display: none;\r
-}\r
-\r
-.messageHeader {\r
-       font-style: italic;\r
-       margin: -1em 0 0 0;\r
-       padding: 0;\r
-       text-align: right;\r
-}\r
-\r
-.messageHeader p {\r
-       margin: 0;\r
-}\r
-\r
-.messageContent h3 {\r
-       font-size: 1em;\r
-       margin: 0;\r
-       padding: 7px;\r
-       clear: both;\r
-}\r
-\r
-.messageBody {\r
-       border-top: 1px solid black;\r
-       padding-top: 7px;\r
-       clear: both;\r
-}\r
-\r
-.messageInner {\r
-       margin: -10px 0;\r
-       padding: 0;\r
-}\r
-\r
-.messageText {\r
-       margin: 7px 0;\r
-}\r
-\r
-.messageAuthor, .messageAuthor .userName {\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.messageAuthor .userName {\r
-       font-style: italic;\r
-       font-weight: bold;\r
-       display: inline;\r
-}\r
-\r
-.messageAuthor .userCredits .userTitle {\r
-       font-size: .8em;\r
-       margin: 0 0 -10px 0;\r
-       padding: 0;\r
-}\r
-\r
-blockquote {\r
-       margin: 5px;\r
-}\r
-\r
-.quoteBox {\r
-       border: 1px solid black;\r
-       margin-bottom: 5px;\r
-       padding: 10px;\r
-}\r
-\r
-.quoteBox h3 {\r
-       font-style: italic;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.codeBox h3 {\r
-       font-style: italic;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.poll .containerContent h3 {\r
-       font-style: italic;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.attachmentPreview fieldset {\r
-       margin-top: 13px;\r
-}\r
-\r
-.attachmentPreview ul {\r
-       margin: 0;\r
-       list-style: none;\r
-       padding: 0;\r
-}\r
-\r
-.attachmentPreview li {\r
-       margin-right: 10px;\r
-       float: left;\r
-}\r
-\r
-.attachmentPreview li img {\r
-       margin: 0 !important;\r
-}\r
-\r
-.attachmentFile img {\r
-       display: none;\r
-}\r
-\r
-
-/* -- -- -- -- -- calendar.css -- -- -- -- -- */\r
-\r
-#tplCalendarEvent #participation .messageHeader {\r
-       text-align: left;\r
-}\r
-\r
-/* -- -- -- -- -- Form Element -- -- -- -- -- */\r
-\r
-.formElement {\r
-       margin: 5px 0 3px 0;\r
-       min-height: 0;\r
-}\r
-\r
-.formElement:after {\r
-       content: "";\r
-       height: 0;\r
-       display: block;\r
-       clear: both;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field -- -- -- -- -- */\r
-\r
-.formField {\r
-       padding: 0;\r
-       min-height: 1em;\r
-       border-bottom: 1px solid black;\r
-}\r
-\r
-.formElement .formField {\r
-       margin-left: 216px;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field Label -- -- -- -- -- */\r
-\r
-.formFieldLabel {\r
-       text-align: right;\r
-       float: left;\r
-       width: 200px;\r
-       margin: 0;\r
-}\r
-\r
-fieldset {\r
-       margin: 20px 1px 0 1px !important;\r
-}\r
-\r
-.formSubmit {\r
-       display: none;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+}
+
+.mainHeadline .headlineContainer h1 {
+       font-size: 1.5em;
+}
+
+.columnIcon {
+       width: 0;
+}
+
+td p, th p {
+       margin: 0;
+       padding: 0;
+}
+
+.columnRating {
+       text-align: center;
+       width: 0;
+}
+
+.columnTopic {
+       width: 80%;
+}
+
+.columnTitle p {
+       overflow: hidden;
+}
+
+.columnDate {
+       white-space: nowrap;
+}
+
+td.columnHomepage a:after {
+       content: ""attr(href)"";
+}
+
+td.columnEmail a[href^="mailto:"]:after {
+       content: ""attr(href)"";
+}
+
+/* -- -- -- -- -- Breadcrumb Style Navigation -- -- -- -- -- */
+
+.breadCrumbs {
+       list-style: none;
+       padding: 0;
+       margin: 0;
+}
+
+.breadCrumbs li {
+       font-style: italic;
+       margin-right: 5px;
+       display: inline;
+}
+
+/* -- -- -- -- -- Message Layout -- -- -- -- -- */
+
+.message {
+       border: 1px solid black;
+       margin: 7px 3px;
+       padding: 13px;
+}
+
+.message hr {
+       display: none;
+}
+
+.messageHeader {
+       font-style: italic;
+       margin: -1em 0 0 0;
+       padding: 0;
+       text-align: right;
+}
+
+.messageHeader p {
+       margin: 0;
+}
+
+.messageContent h3 {
+       font-size: 1em;
+       margin: 0;
+       padding: 7px;
+       clear: both;
+}
+
+.messageBody {
+       border-top: 1px solid black;
+       padding-top: 7px;
+       clear: both;
+}
+
+.messageInner {
+       margin: -10px 0;
+       padding: 0;
+}
+
+.messageText {
+       margin: 7px 0;
+}
+
+.messageAuthor, .messageAuthor .userName {
+       margin: 0;
+       padding: 0;
+}
+
+.messageAuthor .userName {
+       font-style: italic;
+       font-weight: bold;
+       display: inline;
+}
+
+.messageAuthor .userCredits .userTitle {
+       font-size: .8em;
+       margin: 0 0 -10px 0;
+       padding: 0;
+}
+
+blockquote {
+       margin: 5px;
+}
+
+.quoteBox {
+       border: 1px solid black;
+       margin-bottom: 5px;
+       padding: 10px;
+}
+
+.quoteBox h3 {
+       font-style: italic;
+       margin: 0;
+       padding: 0;
+}
+
+.codeBox h3 {
+       font-style: italic;
+       margin: 0;
+       padding: 0;
+}
+
+.poll .containerContent h3 {
+       font-style: italic;
+       margin: 0;
+       padding: 0;
+}
+
+.attachmentPreview fieldset {
+       margin-top: 13px;
+}
+
+.attachmentPreview ul {
+       margin: 0;
+       list-style: none;
+       padding: 0;
+}
+
+.attachmentPreview li {
+       margin-right: 10px;
+       float: left;
+}
+
+.attachmentPreview li img {
+       margin: 0 !important;
+}
+
+.attachmentFile img {
+       display: none;
+}
+
+
+/* -- -- -- -- -- calendar.css -- -- -- -- -- */
+
+#tplCalendarEvent #participation .messageHeader {
+       text-align: left;
+}
+
+/* -- -- -- -- -- Form Element -- -- -- -- -- */
+
+.formElement {
+       margin: 5px 0 3px 0;
+       min-height: 0;
+}
+
+.formElement:after {
+       content: "";
+       height: 0;
+       display: block;
+       clear: both;
+}
+
+/* -- -- -- -- -- Form Field -- -- -- -- -- */
+
+.formField {
+       padding: 0;
+       min-height: 1em;
+       border-bottom: 1px solid black;
+}
+
+.formElement .formField {
+       margin-left: 216px;
+}
+
+/* -- -- -- -- -- Form Field Label -- -- -- -- -- */
+
+.formFieldLabel {
+       text-align: right;
+       float: left;
+       width: 200px;
+       margin: 0;
+}
+
+fieldset {
+       margin: 20px 1px 0 1px !important;
+}
+
+.formSubmit {
+       display: none;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index f3cb00c0e81376a3eb24f35675e5b00984414e82..47f3f2ef8d79b2e257972303f7962c3786a4b59a 100644 (file)
-/**\r
- * Footer Styles\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2008-2011 WoltLab GmbH\r
- */\r
\r
-/* -- -- -- -- -- Footer -- -- -- -- -- */\r
-\r
-#footer {\r
-       border-width: 1px 0 0 0;\r
-       border-style: solid;\r
-       padding: 10px 0;\r
-}\r
-\r
-#footerContainer {\r
-       border-top-width: 0;\r
-}\r
-\r
-/* -- -- -- -- -- Footer Menu -- -- -- -- -- */\r
-\r
-.footerMenu {\r
-       margin-bottom: 10px;\r
-       float: left;\r
-}\r
-\r
-.footerMenu ul {\r
-       list-style: none;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.footerMenu li {\r
-       white-space: nowrap;\r
-       border-width: 0 0 0 1px;\r
-       border-style: solid;\r
-       margin-top: 5px;\r
-       padding: 0 10px;\r
-       display: inline-block;\r
-}\r
-\r
-.footerMenu li.first, .footerMenu li.firstActive {\r
-       border-width: 0;\r
-       padding-left: 0;\r
-}\r
-\r
-.footerMenu a {\r
-       text-decoration: none;\r
-       display: block;\r
-}\r
-\r
-.footerMenu span {\r
-       padding: 3px 0 2px 0;   \r
-}\r
-\r
-.footerMenu a span {\r
-       text-decoration: underline;\r
-}\r
-\r
-.footerMenu a:hover span {\r
-       text-decoration: none;\r
-}\r
-\r
-.footerMenu div.popupMenu {\r
-       font-size: 1em;\r
-}\r
-\r
-/* -- -- -- -- -- Footer Options -- -- -- -- -- */\r
-\r
-.footerOptions {\r
-       margin-bottom: 10px;\r
-       float: right;\r
-}\r
-\r
-.footerOptions ul {\r
-       list-style: none;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.footerOptionsInner > ul > li {\r
-       display: inline-block;\r
-}\r
-       \r
-.footerOptions li {\r
-       border-width: 0 1px 0 0;\r
-       border-style: solid;\r
-       margin-top: 5px;\r
-       padding: 0 10px 0 7px;\r
-}\r
-\r
-.footerOptions li.last {\r
-       border-width: 0;\r
-}\r
-\r
-.footerOptions a, .footerOptions em {\r
-       font-style: normal;\r
-       text-decoration: none;\r
-       display: block;\r
-}\r
-\r
-.footerOptionsInner > ul > li > a {\r
-       min-height: 16px;\r
-}\r
-\r
-.footerOptions span {\r
-       padding: 3px 0 2px 0;   \r
-}\r
-\r
-.footerOptions a span {\r
-       text-decoration: underline;\r
-}\r
-\r
-.footerOptions a:hover span {\r
-       text-decoration: none;\r
-}\r
-\r
-.footerOptions div.popupMenu {\r
-       font-size: 1em;\r
-}\r
-\r
-/* -- -- -- -- -- Extra Button -- -- -- -- -- */\r
-\r
-.footerOptions li.extraButton {\r
-       border-width: 1px;\r
-       margin-top: 0 !important;\r
-       padding: 0;\r
-}\r
-\r
-.footerOptions li.extraButton a {\r
-       margin: 0;\r
-       padding: 1px 2px 0 2px;\r
-}\r
-\r
-/* -- -- -- -- -- Copyright -- -- -- -- -- */\r
-\r
-.copyright {\r
-       text-align: center;\r
-       white-space: nowrap;\r
-       padding: 10px 0 7px 0;\r
-       clear: both;\r
-}\r
-\r
-.copyright a {\r
-       text-decoration: none;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Footer Styles
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2008-2011 WoltLab GmbH
+ */
+/* -- -- -- -- -- Footer -- -- -- -- -- */
+
+#footer {
+       border-width: 1px 0 0 0;
+       border-style: solid;
+       padding: 10px 0;
+}
+
+#footerContainer {
+       border-top-width: 0;
+}
+
+/* -- -- -- -- -- Footer Menu -- -- -- -- -- */
+
+.footerMenu {
+       margin-bottom: 10px;
+       float: left;
+}
+
+.footerMenu ul {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+}
+
+.footerMenu li {
+       white-space: nowrap;
+       border-width: 0 0 0 1px;
+       border-style: solid;
+       margin-top: 5px;
+       padding: 0 10px;
+       display: inline-block;
+}
+
+.footerMenu li.first, .footerMenu li.firstActive {
+       border-width: 0;
+       padding-left: 0;
+}
+
+.footerMenu a {
+       text-decoration: none;
+       display: block;
+}
+
+.footerMenu span {
+       padding: 3px 0 2px 0;   
+}
+
+.footerMenu a span {
+       text-decoration: underline;
+}
+
+.footerMenu a:hover span {
+       text-decoration: none;
+}
+
+.footerMenu div.popupMenu {
+       font-size: 1em;
+}
+
+/* -- -- -- -- -- Footer Options -- -- -- -- -- */
+
+.footerOptions {
+       margin-bottom: 10px;
+       float: right;
+}
+
+.footerOptions ul {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+}
+
+.footerOptionsInner > ul > li {
+       display: inline-block;
+}
+       
+.footerOptions li {
+       border-width: 0 1px 0 0;
+       border-style: solid;
+       margin-top: 5px;
+       padding: 0 10px 0 7px;
+}
+
+.footerOptions li.last {
+       border-width: 0;
+}
+
+.footerOptions a, .footerOptions em {
+       font-style: normal;
+       text-decoration: none;
+       display: block;
+}
+
+.footerOptionsInner > ul > li > a {
+       min-height: 16px;
+}
+
+.footerOptions span {
+       padding: 3px 0 2px 0;   
+}
+
+.footerOptions a span {
+       text-decoration: underline;
+}
+
+.footerOptions a:hover span {
+       text-decoration: none;
+}
+
+.footerOptions div.popupMenu {
+       font-size: 1em;
+}
+
+/* -- -- -- -- -- Extra Button -- -- -- -- -- */
+
+.footerOptions li.extraButton {
+       border-width: 1px;
+       margin-top: 0 !important;
+       padding: 0;
+}
+
+.footerOptions li.extraButton a {
+       margin: 0;
+       padding: 1px 2px 0 2px;
+}
+
+/* -- -- -- -- -- Copyright -- -- -- -- -- */
+
+.copyright {
+       text-align: center;
+       white-space: nowrap;
+       padding: 10px 0 7px 0;
+       clear: both;
+}
+
+.copyright a {
+       text-decoration: none;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index d4adb5c28b49feb0f093ac9a4f1e282e591a7c74..9a630e43a180c3a6803925297acba8202827604a 100644 (file)
-/**\r
- * Form Styles\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */\r
-\r
-form {\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-textarea, input, select {\r
-       font-size: .95em;\r
-}\r
-\r
-input[type="submit"], input[type="reset"], input[type="button"], input[type="file"] {\r
-       font-size: 1em;\r
-}\r
-\r
-.formSubmit { /* holds submit-buttons "preview, draft, submit" */\r
-       text-align: center;\r
-       margin-top: 10px;\r
-       margin-bottom: 15px;\r
-}\r
-\r
-textarea, .inputText {\r
-       border-width: 1px;\r
-       width: 99.5%;\r
-}\r
-\r
-select {\r
-       border-width: 1px;\r
-       padding: 2px;\r
-}\r
-\r
-input[type="text"], input[type="password"] {\r
-       padding: 3px 0 3px 2px;\r
-}\r
-\r
-input[type="file"] {\r
-       padding: 2px 3px;\r
-}\r
-\r
-select[multiple="multiple"] {\r
-       padding: 0 !important;\r
-}\r
-\r
-textarea {\r
-       padding-left: 3px;\r
-}\r
-\r
-input[type="radio"] {\r
-       margin-left: 0;\r
-}\r
-\r
-select[multiple="multiple"] {\r
-       width: 100%;\r
-}\r
-\r
-input[type="image"] {\r
-       margin: 0 3px -3px 0;\r
-}\r
-\r
-.searchInput > input[type="image"] {\r
-       margin: 0;\r
-}\r
-\r
-.fourDigitInput {\r
-       width: 40px !important;\r
-}\r
-\r
-.textareaSmall {\r
-       height: 1.9em; \r
-       line-height: 2;\r
-}\r
-\r
-/* -- -- -- -- -- Form Element -- -- -- -- -- */\r
-\r
-.formElement {\r
-       margin: 5px 0 3px 0;\r
-       min-height: 0;\r
-}\r
-\r
-.formElement:after {\r
-       content: "";\r
-       height: 0;\r
-       display: block;\r
-       clear: both;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field -- -- -- -- -- */\r
-\r
-.formField {\r
-       padding: 0;\r
-}\r
-\r
-.formElement .formField {\r
-       margin-left: 216px;\r
-}\r
-\r
-fieldset .formElement .formField {\r
-       margin-left: 202px;\r
-}\r
-\r
-.formField input, .formField select, .formField textarea {\r
-       margin: 2px 0;\r
-}\r
-\r
-.formField label {\r
-       font-size: 1em !important;\r
-       display: block;\r
-}\r
-\r
-.containerContent .formField {\r
-       margin-top: -5px;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field Label -- -- -- -- -- */\r
-\r
-.formFieldLabel {\r
-       text-align: right;\r
-       float: left;\r
-       width: 200px;\r
-}\r
-\r
-fieldset .formFieldLabel {\r
-       width: 187px;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field Description -- -- -- -- -- */\r
-\r
-.formFieldDesc {\r
-       padding: 0 0 2px 0;\r
-}\r
-\r
-.formElement .formFieldDesc {\r
-       margin-left: 216px;\r
-}\r
-\r
-fieldset .formElement .formFieldDesc {\r
-       margin-left: 202px;\r
-}\r
-\r
-.formCheckBox .formFieldDesc {\r
-       padding: 0 0 2px 18px;\r
-}\r
-\r
-.formFieldDesc code {\r
-       font-size: 1.3em;\r
-}\r
-\r
-.formFieldDesc > p {\r
-       clear: both;\r
-}\r
-\r
-/* -- -- -- -- -- Form Group -- -- -- -- -- */\r
-\r
-/* A form group contains serveral sub form elements within a fieldset */\r
-\r
-.formGroup {\r
-       min-height: 0;\r
-       margin: 5px 0 3px 0;\r
-}\r
-\r
-.formGroup .formGroupLabel {\r
-       text-align: right;\r
-       float: left;\r
-       width: 200px;\r
-}\r
-\r
-fieldset .formGroup .formGroupLabel {\r
-       width: 187px;\r
-}\r
-\r
-.formGroup .formGroupField {\r
-       margin-left: 216px;\r
-}\r
-\r
-fieldset .formGroup .formGroupField {\r
-       margin-left: 203px;\r
-}\r
-\r
-.formGroup .formGroupField legend {\r
-       display: none;\r
-}\r
-\r
-/* ToDo: Find a better solution for that! Impossible to build long inputs as long as this is active! */\r
-.formGroup .formGroupField .formElement input {\r
-       width: auto !important;\r
-}\r
-\r
-/* -- -- -- -- -- Form Prefix -- -- -- -- -- */\r
-\r
-.formPrefix select {\r
-       float: left;\r
-       width: 150px;\r
-}\r
-\r
-.formPrefix div {\r
-       margin-left: 155px;\r
-}\r
-\r
-.formPrefix {\r
-       min-height: 0;\r
-}\r
-\r
-/* -- -- -- -- -- Form Options -- -- -- -- -- */\r
-\r
-.formOptions {\r
-       list-style: none;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.formOptions li {\r
-       margin-top: 3px;\r
-       padding-right: 2%;\r
-       width: 23%;\r
-       float: left;\r
-}\r
-\r
-.formOptions li span {\r
-       float: none;\r
-       padding-left: 12px;\r
-}\r
-\r
-/* -- -- -- -- -- Form Options Long -- -- -- -- -- */\r
-\r
-.formOptionsLong {\r
-       list-style: none;\r
-       margin: 0 0 7px 0;\r
-       padding: 0;\r
-}\r
-\r
-.formOptionsLong li {\r
-       margin: 3px 0 0 0;\r
-       padding: 0;\r
-}\r
-\r
-.formOptionsLong span, .formOptionsLong label {\r
-       display: inline;\r
-}\r
-\r
-/* -- -- -- -- -- Form Error -- -- -- -- -- */\r
-\r
-.formError, .formError a {\r
-       color: #c00;\r
-}\r
-\r
-.formError .inputText, .formError textarea, .formError select {\r
-       border-color: #c00;\r
-       background-color: #fee;\r
-}\r
-\r
-.formError .mceToolbar select {\r
-       /* prevents error with dropdown borders within the editor toolbar */\r
-       border-color: transparent !important;\r
-}\r
-\r
-/* -- -- -- -- Long Select -- -- -- -- */\r
-\r
-.longSelect select {\r
-       width: 100%;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Form Styles
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */
+
+form {
+       margin: 0;
+       padding: 0;
+}
+
+textarea, input, select {
+       font-size: .95em;
+}
+
+input[type="submit"], input[type="reset"], input[type="button"], input[type="file"] {
+       font-size: 1em;
+}
+
+.formSubmit { /* holds submit-buttons "preview, draft, submit" */
+       text-align: center;
+       margin-top: 10px;
+       margin-bottom: 15px;
+}
+
+textarea, .inputText {
+       border-width: 1px;
+       width: 99.5%;
+}
+
+select {
+       border-width: 1px;
+       padding: 2px;
+}
+
+input[type="text"], input[type="password"] {
+       padding: 3px 0 3px 2px;
+}
+
+input[type="file"] {
+       padding: 2px 3px;
+}
+
+select[multiple="multiple"] {
+       padding: 0 !important;
+}
+
+textarea {
+       padding-left: 3px;
+}
+
+input[type="radio"] {
+       margin-left: 0;
+}
+
+select[multiple="multiple"] {
+       width: 100%;
+}
+
+input[type="image"] {
+       margin: 0 3px -3px 0;
+}
+
+.searchInput > input[type="image"] {
+       margin: 0;
+}
+
+.fourDigitInput {
+       width: 40px !important;
+}
+
+.textareaSmall {
+       height: 1.9em; 
+       line-height: 2;
+}
+
+/* -- -- -- -- -- Form Element -- -- -- -- -- */
+
+.formElement {
+       margin: 5px 0 3px 0;
+       min-height: 0;
+}
+
+.formElement:after {
+       content: "";
+       height: 0;
+       display: block;
+       clear: both;
+}
+
+/* -- -- -- -- -- Form Field -- -- -- -- -- */
+
+.formField {
+       padding: 0;
+}
+
+.formElement .formField {
+       margin-left: 216px;
+}
+
+fieldset .formElement .formField {
+       margin-left: 202px;
+}
+
+.formField input, .formField select, .formField textarea {
+       margin: 2px 0;
+}
+
+.formField label {
+       font-size: 1em !important;
+       display: block;
+}
+
+.containerContent .formField {
+       margin-top: -5px;
+}
+
+/* -- -- -- -- -- Form Field Label -- -- -- -- -- */
+
+.formFieldLabel {
+       text-align: right;
+       float: left;
+       width: 200px;
+}
+
+fieldset .formFieldLabel {
+       width: 187px;
+}
+
+/* -- -- -- -- -- Form Field Description -- -- -- -- -- */
+
+.formFieldDesc {
+       padding: 0 0 2px 0;
+}
+
+.formElement .formFieldDesc {
+       margin-left: 216px;
+}
+
+fieldset .formElement .formFieldDesc {
+       margin-left: 202px;
+}
+
+.formCheckBox .formFieldDesc {
+       padding: 0 0 2px 18px;
+}
+
+.formFieldDesc code {
+       font-size: 1.3em;
+}
+
+.formFieldDesc > p {
+       clear: both;
+}
+
+/* -- -- -- -- -- Form Group -- -- -- -- -- */
+
+/* A form group contains serveral sub form elements within a fieldset */
+
+.formGroup {
+       min-height: 0;
+       margin: 5px 0 3px 0;
+}
+
+.formGroup .formGroupLabel {
+       text-align: right;
+       float: left;
+       width: 200px;
+}
+
+fieldset .formGroup .formGroupLabel {
+       width: 187px;
+}
+
+.formGroup .formGroupField {
+       margin-left: 216px;
+}
+
+fieldset .formGroup .formGroupField {
+       margin-left: 203px;
+}
+
+.formGroup .formGroupField legend {
+       display: none;
+}
+
+/* ToDo: Find a better solution for that! Impossible to build long inputs as long as this is active! */
+.formGroup .formGroupField .formElement input {
+       width: auto !important;
+}
+
+/* -- -- -- -- -- Form Prefix -- -- -- -- -- */
+
+.formPrefix select {
+       float: left;
+       width: 150px;
+}
+
+.formPrefix div {
+       margin-left: 155px;
+}
+
+.formPrefix {
+       min-height: 0;
+}
+
+/* -- -- -- -- -- Form Options -- -- -- -- -- */
+
+.formOptions {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+}
+
+.formOptions li {
+       margin-top: 3px;
+       padding-right: 2%;
+       width: 23%;
+       float: left;
+}
+
+.formOptions li span {
+       float: none;
+       padding-left: 12px;
+}
+
+/* -- -- -- -- -- Form Options Long -- -- -- -- -- */
+
+.formOptionsLong {
+       list-style: none;
+       margin: 0 0 7px 0;
+       padding: 0;
+}
+
+.formOptionsLong li {
+       margin: 3px 0 0 0;
+       padding: 0;
+}
+
+.formOptionsLong span, .formOptionsLong label {
+       display: inline;
+}
+
+/* -- -- -- -- -- Form Error -- -- -- -- -- */
+
+.formError, .formError a {
+       color: #c00;
+}
+
+.formError .inputText, .formError textarea, .formError select {
+       border-color: #c00;
+       background-color: #fee;
+}
+
+.formError .mceToolbar select {
+       /* prevents error with dropdown borders within the editor toolbar */
+       border-color: transparent !important;
+}
+
+/* -- -- -- -- Long Select -- -- -- -- */
+
+.longSelect select {
+       width: 100%;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index 11c52b8b3e4db1f467e51d01652fd281135c7b5e..7f9a06259986387d2b438f6537eeeded123c0af6 100644 (file)
@@ -1,84 +1,84 @@
-/**\r
- * Inline Calendar Styles\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Inline Calendar -- -- -- -- -- */\r
-\r
-.inlineCalendar {\r
-       position: absolute; \r
-       display: none; \r
-       z-index: 100;\r
-       width: 170px;\r
-}\r
-\r
-.inlineCalendarHeader, .inlineCalendarFooter {\r
-       color: #fff;\r
-       width: 100%;\r
-       border-collapse: collapse;\r
-       border-spacing: 0;\r
-       table-layout: fixed;\r
-       border-width: 1px;\r
-}\r
-\r
-.inlineCalendarHeader td, .inlineCalendarFooter td {\r
-       text-align: center;\r
-       font-weight: bold;\r
-       padding: 0;\r
-}\r
-\r
-.inlineCalendarHeader td a, .inlineCalendarFooter td a {\r
-       text-decoration: none;\r
-       border-width: 1px;\r
-       border-style: solid;\r
-       padding: 1px;\r
-       display: block;\r
-}\r
-\r
-.inlineCalendarHeader td span, .inlineCalendarFooter td span {\r
-       border-width: 1px 0;\r
-       border-style: solid;\r
-       padding: 1px;\r
-       display: block;\r
-}\r
-\r
-.inlineCalendarHeader td a:hover, .inlineCalendarFooter td a:hover {\r
-       text-decoration: none;\r
-}\r
-\r
-.changeElement {\r
-       width: 1.5em;\r
-}\r
-\r
-.inlineCalendarTable {\r
-       border-width: 0 1px !important;\r
-       border-collapse: collapse;\r
-       border-spacing: 0;\r
-       border-top: 0;\r
-       border-bottom: 0;\r
-       table-layout: fixed;\r
-       width: 100%; \r
-}\r
-\r
-.inlineCalendarTable td {\r
-       padding: 0;\r
-       margin: 0;\r
-}\r
-\r
-.inlineCalendarTable a {\r
-       text-align: center;\r
-       text-decoration: none;\r
-       border-width: 1px;\r
-       border-style: solid;\r
-       margin: 1px;\r
-       padding: 1px;\r
-       display: block;\r
-}\r
-\r
-.weekDays {\r
-       text-align: center;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Inline Calendar Styles
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Inline Calendar -- -- -- -- -- */
+
+.inlineCalendar {
+       position: absolute; 
+       display: none; 
+       z-index: 100;
+       width: 170px;
+}
+
+.inlineCalendarHeader, .inlineCalendarFooter {
+       color: #fff;
+       width: 100%;
+       border-collapse: collapse;
+       border-spacing: 0;
+       table-layout: fixed;
+       border-width: 1px;
+}
+
+.inlineCalendarHeader td, .inlineCalendarFooter td {
+       text-align: center;
+       font-weight: bold;
+       padding: 0;
+}
+
+.inlineCalendarHeader td a, .inlineCalendarFooter td a {
+       text-decoration: none;
+       border-width: 1px;
+       border-style: solid;
+       padding: 1px;
+       display: block;
+}
+
+.inlineCalendarHeader td span, .inlineCalendarFooter td span {
+       border-width: 1px 0;
+       border-style: solid;
+       padding: 1px;
+       display: block;
+}
+
+.inlineCalendarHeader td a:hover, .inlineCalendarFooter td a:hover {
+       text-decoration: none;
+}
+
+.changeElement {
+       width: 1.5em;
+}
+
+.inlineCalendarTable {
+       border-width: 0 1px !important;
+       border-collapse: collapse;
+       border-spacing: 0;
+       border-top: 0;
+       border-bottom: 0;
+       table-layout: fixed;
+       width: 100%; 
+}
+
+.inlineCalendarTable td {
+       padding: 0;
+       margin: 0;
+}
+
+.inlineCalendarTable a {
+       text-align: center;
+       text-decoration: none;
+       border-width: 1px;
+       border-style: solid;
+       margin: 1px;
+       padding: 1px;
+       display: block;
+}
+
+.weekDays {
+       text-align: center;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index c525a345e147094751abcb1a7ec0facfabeaf70b..a7689ceff6f59effe0954767fa61b2ef408fa88d 100644 (file)
-/**\r
- * Page Navigation Styles\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Page Navigation -- -- -- -- -- */\r
-\r
-.pageNavigation {\r
-       margin-top: .5em;\r
-       margin-right: 20px;\r
-       margin-bottom: 5px;\r
-       float: left;\r
-       clear: left;\r
-}\r
-\r
-.pageNavigation ul {\r
-       list-style: none;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.pageNavigation li {\r
-       border-width: 1px;\r
-       border-style: solid;\r
-       margin-right: 3px;\r
-       float: left;\r
-       position: relative;\r
-}\r
-\r
-.pageNavigation li.active, .pageNavigation li:active {\r
-       border-width: 1px;\r
-       border-style: solid;\r
-}\r
-\r
-.pageNavigation a, .pageNavigation li span {\r
-       text-align: center;\r
-       text-decoration: none;\r
-       border-width: 1px;\r
-       border-style: solid;\r
-       padding: 0 4px;\r
-       display: block;\r
-}\r
-\r
-.pageNavigation li div {\r
-       text-align: center;\r
-       margin-left: -1px;\r
-       padding: 0 0 .4em 0;\r
-       position: absolute;\r
-       bottom: 1.6em;\r
-       width: 12em; /* opera fix */\r
-       z-index: 200;\r
-       display: none;\r
-       opacity: .9;\r
-}\r
-\r
-.pageNavigation li:hover div {\r
-       display: block;\r
-}\r
-\r
-.pageNavigation li ul {\r
-       border: 1px;\r
-       padding: 0 0 2px 2px;\r
-       float: left;\r
-       clear: left;\r
-}\r
-\r
-.pageNavigation li ul li {\r
-       text-align: right !important;\r
-       margin-top: 2px;\r
-}\r
-\r
-.pageNavigation .skip, .pageNavigation .skip:hover, .pageNavigation .skip:active {\r
-       border: none;\r
-}\r
-\r
-.pageNavigation .skip a, .pageNavigation .skip a:hover, .pageNavigation .skip a:active, .pageNavigation .skip span {\r
-       background-color: transparent;\r
-       background-image: none !important;\r
-       border: none;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.pageNavigation .skip {\r
-       padding: 1px 1px !important;\r
-       width: 16px;\r
-}\r
-\r
-.pageNavigation .skip img {\r
-       vertical-align: middle;\r
-}\r
-\r
-.pageNavigation input {\r
-       text-align: center;\r
-       background-color: transparent;\r
-       border: none;\r
-       margin: 0;\r
-       padding: 2px 0;\r
-       width: 2.5em;\r
-       min-height: 1.84em;\r
-       display: none;\r
-}\r
-\r
-.pageNavigation .children {\r
-       padding: 0;\r
-}\r
-\r
-/* Drop Down Menus (also see pageMenu.css) */\r
-.pageNavigation a, .pageNavigation li ul, .pageNavigation li {\r
-       border-width: 1px;\r
-}\r
-\r
-/* Drop Down Menus (also see pageMenu.css) */\r
-.pageNavigation a, .pageNavigation li.children span {\r
-       border-color: #fff;\r
-       border-style: solid;\r
-}\r
-\r
-.statusDisplay .pageNavigation {\r
-       margin: 0;\r
-       padding: 0 0 2px 0;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Page Navigation Styles
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Page Navigation -- -- -- -- -- */
+
+.pageNavigation {
+       margin-top: .5em;
+       margin-right: 20px;
+       margin-bottom: 5px;
+       float: left;
+       clear: left;
+}
+
+.pageNavigation ul {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+}
+
+.pageNavigation li {
+       border-width: 1px;
+       border-style: solid;
+       margin-right: 3px;
+       float: left;
+       position: relative;
+}
+
+.pageNavigation li.active, .pageNavigation li:active {
+       border-width: 1px;
+       border-style: solid;
+}
+
+.pageNavigation a, .pageNavigation li span {
+       text-align: center;
+       text-decoration: none;
+       border-width: 1px;
+       border-style: solid;
+       padding: 0 4px;
+       display: block;
+}
+
+.pageNavigation li div {
+       text-align: center;
+       margin-left: -1px;
+       padding: 0 0 .4em 0;
+       position: absolute;
+       bottom: 1.6em;
+       width: 12em; /* opera fix */
+       z-index: 200;
+       display: none;
+       opacity: .9;
+}
+
+.pageNavigation li:hover div {
+       display: block;
+}
+
+.pageNavigation li ul {
+       border: 1px;
+       padding: 0 0 2px 2px;
+       float: left;
+       clear: left;
+}
+
+.pageNavigation li ul li {
+       text-align: right !important;
+       margin-top: 2px;
+}
+
+.pageNavigation .skip, .pageNavigation .skip:hover, .pageNavigation .skip:active {
+       border: none;
+}
+
+.pageNavigation .skip a, .pageNavigation .skip a:hover, .pageNavigation .skip a:active, .pageNavigation .skip span {
+       background-color: transparent;
+       background-image: none !important;
+       border: none;
+       margin: 0;
+       padding: 0;
+}
+
+.pageNavigation .skip {
+       padding: 1px 1px !important;
+       width: 16px;
+}
+
+.pageNavigation .skip img {
+       vertical-align: middle;
+}
+
+.pageNavigation input {
+       text-align: center;
+       background-color: transparent;
+       border: none;
+       margin: 0;
+       padding: 2px 0;
+       width: 2.5em;
+       min-height: 1.84em;
+       display: none;
+}
+
+.pageNavigation .children {
+       padding: 0;
+}
+
+/* Drop Down Menus (also see pageMenu.css) */
+.pageNavigation a, .pageNavigation li ul, .pageNavigation li {
+       border-width: 1px;
+}
+
+/* Drop Down Menus (also see pageMenu.css) */
+.pageNavigation a, .pageNavigation li.children span {
+       border-color: #fff;
+       border-style: solid;
+}
+
+.statusDisplay .pageNavigation {
+       margin: 0;
+       padding: 0 0 2px 0;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index 0df44e0135eca683a8b78e48841e4666aaa1815f..c1b527a36300f9915ca5b5c5aa56eb2fadbe344a 100644 (file)
-/**\r
- * Tabbed Menu Styles\r
- *\r
- * @author             Arian Glander, Harald Szekely\r
- * @copyright  2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Tabs -- -- -- -- -- */\r
-\r
-.tabMenu {\r
-       margin-top: 5px;\r
-       clear: both;\r
-       width: 100%;\r
-}\r
-\r
-.tabMenu:after {\r
-       content: "";\r
-       clear: both;\r
-       display: block;\r
-       height: 0;\r
-}\r
-\r
-.tabMenu ul {\r
-       margin: 0; \r
-       padding: 0 0 0 10px;  \r
-}\r
-\r
-.tabMenu li {\r
-       list-style: none;\r
-       border-width: 1px 1px 0 1px;\r
-       margin-right: 3px;\r
-       float: left;\r
-}\r
-\r
-.tabMenu li a {\r
-       text-decoration: none;\r
-       white-space: nowrap;\r
-       border-width: 1px;\r
-       border-style: solid;\r
-       padding: 2px 5px 0 5px;\r
-       display: block;\r
-       position: relative;\r
-       z-index: 10;\r
-}\r
-\r
-.tabMenu li.activeTabMenu a {\r
-       border-bottom: none;\r
-       padding-bottom: 3px;\r
-       position: relative;\r
-       z-index: 20;\r
-}\r
-\r
-.tabMenu li a, .tabMenu li.activeTabMenu a {\r
-       min-height: 24px;\r
-}\r
-\r
-/* -- -- -- -- -- Sub Tab Menu -- -- -- -- -- */\r
\r
-/* Elements inside the bar below the tabs */\r
\r
-.subTabMenu {\r
-       border: 1px;\r
-       margin-bottom: -1px;\r
-       margin-top: -2px;\r
-       padding: 1px;\r
-       position: relative;\r
-       z-index: 0;\r
-}\r
-\r
-.subTabMenu:after {\r
-       content: "";\r
-       clear: both;\r
-       display: block;\r
-       height: 0;\r
-}\r
-\r
-.subTabMenu .containerHead {\r
-       margin: 0;\r
-       padding: 2px;\r
-       min-height: 5px;\r
-}\r
-\r
-.subTabMenu .containerHead h2, .subTabMenu .containerHead h3 {\r
-       padding: 2px 5px;\r
-}\r
-\r
-.subTabMenu .containerHead:after {\r
-       content: "";\r
-       clear: both;\r
-       display: block;\r
-       height: 0;\r
-}\r
-\r
-.subTabMenu ul {\r
-       list-style: none;\r
-       margin: 0;\r
-       padding: 0;\r
-}\r
-\r
-.subTabMenu li {\r
-       float: left;\r
-}\r
-\r
-.subTabMenu li a {\r
-       text-decoration: none;\r
-       white-space: nowrap;\r
-       margin: 1px 2px;\r
-       padding: 2px 7px;\r
-       display: block;\r
-}\r
-\r
-.subTabMenu li.activeSubTabMenu a, .subTabMenu li a:hover {\r
-       border-width: 1px;\r
-       padding: 1px 6px;\r
-}\r
-\r
-.subTabMenu .containerHead div {\r
-       font-size: 5px;\r
-       height: 5px;\r
-}\r
-\r
-/* -- -- -- -- -- Sub Container Menu -- -- -- -- -- */\r
-\r
-/* ToDo: Find a more flexible solution */\r
-\r
-.contentBox .border .subTabMenu {\r
-       border: none;\r
-       margin: 0 0 1px 0;\r
-       padding: 0;\r
-}\r
-\r
-.contentBox .border .subTabMenu .containerHead {\r
-       border: none;\r
-       margin: 0 1px 0 0;\r
-}\r
-\r
-/* -- -- -- -- -- Tab Menu Content -- -- -- -- -- */\r
-\r
-/* Content below the Sub Tab Menu */\r
-\r
-.tabMenuContent {\r
-       clear: both;\r
-}\r
-\r
-.tabMenuContent > div {\r
-       padding: 15px 25px;\r
-}\r
-\r
-.tabMenuContent .subHeadline {\r
-       margin-bottom: 2px;\r
-}\r
-\r
-.tabMenuContent h3.containerContent {\r
-       margin-top: 0;\r
-       margin-bottom: 0;\r
-}\r
-\r
-.tabMenuContent fieldset.noJavaScript {\r
-       background: transparent;\r
-       border: 0;\r
-       margin: 0;\r
-       padding-top: 13px;\r
-}\r
-\r
-.tabMenuContent legend.noJavaScript {\r
-       display: none;\r
-}\r
-\r
-.tabMenuContentContainer {\r
-       clear: both;\r
-}\r
-\r
-.tabMenuContent .message {\r
-       margin-bottom: 7px;\r
-}\r
-\r
-.tabMenuContent .messageInner .smallButtons:after {\r
-       clear: none;\r
-}\r
-\r
-.tabMenuContent .message .messageHeading {\r
-       margin-top: 0 !important;\r
-}\r
-\r
-/* -- -- -- -- -- Specials -- -- -- -- -- */\r
-\r
-.tabNavigation { /* still necessary? */\r
-       float: right;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Tabbed Menu Styles
+ *
+ * @author             Arian Glander, Harald Szekely
+ * @copyright  2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Tabs -- -- -- -- -- */
+
+.tabMenu {
+       margin-top: 5px;
+       clear: both;
+       width: 100%;
+}
+
+.tabMenu:after {
+       content: "";
+       clear: both;
+       display: block;
+       height: 0;
+}
+
+.tabMenu ul {
+       margin: 0; 
+       padding: 0 0 0 10px;  
+}
+
+.tabMenu li {
+       list-style: none;
+       border-width: 1px 1px 0 1px;
+       margin-right: 3px;
+       float: left;
+}
+
+.tabMenu li a {
+       text-decoration: none;
+       white-space: nowrap;
+       border-width: 1px;
+       border-style: solid;
+       padding: 2px 5px 0 5px;
+       display: block;
+       position: relative;
+       z-index: 10;
+}
+
+.tabMenu li.activeTabMenu a {
+       border-bottom: none;
+       padding-bottom: 3px;
+       position: relative;
+       z-index: 20;
+}
+
+.tabMenu li a, .tabMenu li.activeTabMenu a {
+       min-height: 24px;
+}
+
+/* -- -- -- -- -- Sub Tab Menu -- -- -- -- -- */
+/* Elements inside the bar below the tabs */
+.subTabMenu {
+       border: 1px;
+       margin-bottom: -1px;
+       margin-top: -2px;
+       padding: 1px;
+       position: relative;
+       z-index: 0;
+}
+
+.subTabMenu:after {
+       content: "";
+       clear: both;
+       display: block;
+       height: 0;
+}
+
+.subTabMenu .containerHead {
+       margin: 0;
+       padding: 2px;
+       min-height: 5px;
+}
+
+.subTabMenu .containerHead h2, .subTabMenu .containerHead h3 {
+       padding: 2px 5px;
+}
+
+.subTabMenu .containerHead:after {
+       content: "";
+       clear: both;
+       display: block;
+       height: 0;
+}
+
+.subTabMenu ul {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+}
+
+.subTabMenu li {
+       float: left;
+}
+
+.subTabMenu li a {
+       text-decoration: none;
+       white-space: nowrap;
+       margin: 1px 2px;
+       padding: 2px 7px;
+       display: block;
+}
+
+.subTabMenu li.activeSubTabMenu a, .subTabMenu li a:hover {
+       border-width: 1px;
+       padding: 1px 6px;
+}
+
+.subTabMenu .containerHead div {
+       font-size: 5px;
+       height: 5px;
+}
+
+/* -- -- -- -- -- Sub Container Menu -- -- -- -- -- */
+
+/* ToDo: Find a more flexible solution */
+
+.contentBox .border .subTabMenu {
+       border: none;
+       margin: 0 0 1px 0;
+       padding: 0;
+}
+
+.contentBox .border .subTabMenu .containerHead {
+       border: none;
+       margin: 0 1px 0 0;
+}
+
+/* -- -- -- -- -- Tab Menu Content -- -- -- -- -- */
+
+/* Content below the Sub Tab Menu */
+
+.tabMenuContent {
+       clear: both;
+}
+
+.tabMenuContent > div {
+       padding: 15px 25px;
+}
+
+.tabMenuContent .subHeadline {
+       margin-bottom: 2px;
+}
+
+.tabMenuContent h3.containerContent {
+       margin-top: 0;
+       margin-bottom: 0;
+}
+
+.tabMenuContent fieldset.noJavaScript {
+       background: transparent;
+       border: 0;
+       margin: 0;
+       padding-top: 13px;
+}
+
+.tabMenuContent legend.noJavaScript {
+       display: none;
+}
+
+.tabMenuContentContainer {
+       clear: both;
+}
+
+.tabMenuContent .message {
+       margin-bottom: 7px;
+}
+
+.tabMenuContent .messageInner .smallButtons:after {
+       clear: none;
+}
+
+.tabMenuContent .message .messageHeading {
+       margin-top: 0 !important;
+}
+
+/* -- -- -- -- -- Specials -- -- -- -- -- */
+
+.tabNavigation { /* still necessary? */
+       float: right;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
index cf3646dcaed3323470607ae421e7eb8c4a5a9f55..f25e051792994bc74127b3a0a900dff421135a0f 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de-informal">\r
-       <category name="wcf.acp">\r
-               <item name="wcf.acp"><![CDATA[Administrationsoberfläche]]></item>\r
-               <item name="wcf.acp.help"><![CDATA[Hilfe]]></item>\r
-               <item name="wcf.acp.help.complete"><![CDATA[Vollständige Hilfe]]></item>\r
-               <item name="wcf.acp.help.disable"><![CDATA[Hilfe deaktivieren]]></item>\r
-               <item name="wcf.acp.help.interactive"><![CDATA[Interaktive Hilfe]]></item>\r
-               <item name="wcf.acp.packageQuickAccess"><![CDATA[Paket wechseln]]></item>\r
-               <item name="wcf.acp.search.extended"><![CDATA[Erweiterte Suche ...]]></item>\r
-               <item name="wcf.acp.sitemap"><![CDATA[Sitemap]]></item>\r
-       </category>\r
-       <category name="wcf.acp.cache">\r
-               <item name="wcf.acp.cache.button.clear"><![CDATA[Cache leeren]]></item>\r
-               <item name="wcf.acp.cache.clear.success"><![CDATA[Der Cache wurde erfolgreich gelöscht.]]></item>\r
-               <item name="wcf.acp.cache.clear.sure"><![CDATA[Möchtest du den Cache wirklich komplett leeren?]]></item>\r
-               <item name="wcf.acp.cache.data"><![CDATA[Eigenschaften]]></item>\r
-               <item name="wcf.acp.cache.data.files"><![CDATA[Dateien]]></item>\r
-               <item name="wcf.acp.cache.data.size"><![CDATA[Größe]]></item>\r
-               <item name="wcf.acp.cache.data.source"><![CDATA[Quelle]]></item>\r
-               <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>\r
-               <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.cache.list.mtime"><![CDATA[Letzte Aktualisierung]]></item>\r
-               <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>\r
-               <item name="wcf.acp.cache.list.perm"><![CDATA[Zugriffsrechte]]></item>\r
-               <item name="wcf.acp.cache.list.size"><![CDATA[Größe]]></item>\r
-       </category>\r
-       <category name="wcf.acp.cronjob">\r
-               <item name="wcf.acp.cronjob.active"><![CDATA[Aktiv]]></item>\r
-               <item name="wcf.acp.cronjob.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>\r
-               <item name="wcf.acp.cronjob.add.data"><![CDATA[Allgemeine Daten]]></item>\r
-               <item name="wcf.acp.cronjob.add.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde hinzugefügt.]]></item>\r
-               <item name="wcf.acp.cronjob.add.timing"><![CDATA[Zeitsteuerung]]></item>\r
-               <item name="wcf.acp.cronjob.className"><![CDATA[Pfad zur Klasse]]></item>\r
-               <item name="wcf.acp.cronjob.className.description"><![CDATA[Gib den Pfad zu der PHP-Datei an, die die entsprechende auszuführende Klasse enthält. Die Pfadangabe muss relativ zum Installationsverzeichnis der ausgewählten Endanwendung sein.]]></item>\r
-               <item name="wcf.acp.cronjob.cronjobID"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.cronjob.delete"><![CDATA[Zeitgesteuerte Aufgabe löschen]]></item>\r
-               <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht gelöscht werden.]]></item>\r
-               <item name="wcf.acp.cronjob.delete.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde gelöscht.]]></item>\r
-               <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Bist du sicher, dass du diese zeitgesteuerte Aufgabe löschen möchtest?]]></item>\r
-               <item name="wcf.acp.cronjob.description"><![CDATA[Beschreibung]]></item>\r
-               <item name="wcf.acp.cronjob.description.description"><![CDATA[Hier kannst du eine kurze Beschreibung der Aufgabe eintragen.]]></item>\r
-               <item name="wcf.acp.cronjob.disable"><![CDATA[Deaktivieren]]></item>\r
-               <item name="wcf.acp.cronjob.edit"><![CDATA[Zeitgesteuerte Aufgabe bearbeiten]]></item>\r
-               <item name="wcf.acp.cronjob.edit.data"><![CDATA[Allgemeine Daten]]></item>\r
-               <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht verändert werden.]]></item>\r
-               <item name="wcf.acp.cronjob.edit.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde erfolgreich geändert.]]></item>\r
-               <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Zeitsteuerung]]></item>\r
-               <item name="wcf.acp.cronjob.enable"><![CDATA[Aktivieren]]></item>\r
-               <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[Der angegebene Pfad ist ungültig.]]></item>\r
-               <item name="wcf.acp.cronjob.error.empty"><![CDATA[Bitte füll dieses Eingabefeld aus.]]></item>\r
-               <item name="wcf.acp.cronjob.error.notValid"><![CDATA[Das Zeitformat ist ungültig.]]></item>\r
-               <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Zeitgesteuerte Aufgabe mehrfach ausführen]]></item>\r
-               <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[Durch Aktivieren dieser Option wird die Aufgabe mehrfach ausgeführt, wenn zwischen dem letzten Ausführungszeitpunkt und dem aktuellen Zeitpunkt weitere Ausführungszeitpunkte liegen.]]></item>\r
-               <item name="wcf.acp.cronjob.execute"><![CDATA[Aufgabe jetzt ausführen]]></item>\r
-               <item name="wcf.acp.cronjob.execute.success"><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt.]]></item>\r
-               <item name="wcf.acp.cronjob.inactive"><![CDATA[Inaktiv]]></item>\r
-               <item name="wcf.acp.cronjob.info"><![CDATA[Allgemeine Informationen]]></item>\r
-               <item name="wcf.acp.cronjob.intro"><![CDATA[Das Anlegen von zeitgesteuerten Aufgaben erfordert eine genaue Kenntnis der Crontab-Syntax auf unixähnlichen Systemen. Weiterführende Informationen dazu erhältst du auf dieser Website: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>]]></item>\r
-               <item name="wcf.acp.cronjob.lastExec"><![CDATA[Letzte Ausführung]]></item>\r
-               <item name="wcf.acp.cronjob.list"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
-               <item name="wcf.acp.cronjob.list.count"><![CDATA[Insgesamt {#$items} zeitgesteuerte Aufgabe{if $items != 1}n{/if}]]></item>\r
-               <item name="wcf.acp.cronjob.log"><![CDATA[Protokoll der ausgeführten zeitgesteuerten Aufgaben]]></item>\r
-               <item name="wcf.acp.cronjob.log.clear"><![CDATA[Alle löschen]]></item>\r
-               <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Bist du sicher, dass du alle Protokoll-Einträge löschen möchtest?]]></item>\r
-               <item name="wcf.acp.cronjob.log.data"><![CDATA[Insgesamt {#$items} {if $items == 1}Eintrag{else}Einträge{/if}]]></item>\r
-               <item name="wcf.acp.cronjob.log.error"><![CDATA[Fehler:]]></item>\r
-               <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Ausgeführt]]></item>\r
-               <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[Derzeit sind keine Einträge vorhanden.]]></item>\r
-               <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>\r
-               <item name="wcf.acp.cronjob.nextExec"><![CDATA[Nächste Ausführung]]></item>\r
-               <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[Derzeit ist keine zeitgesteuerte Aufgabe vorhanden.]]></item>\r
-               <item name="wcf.acp.cronjob.packageName"><![CDATA[Installiert von]]></item>\r
-               <item name="wcf.acp.cronjob.runNow"><![CDATA[Jetzt ausführen]]></item>\r
-               <item name="wcf.acp.cronjob.startDom"><![CDATA[Tag des Monats]]></item>\r
-               <item name="wcf.acp.cronjob.startDom.description"><![CDATA[An diesen Tagen des Monats (1 - 31) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>\r
-               <item name="wcf.acp.cronjob.startDow"><![CDATA[Tag der Woche]]></item>\r
-               <item name="wcf.acp.cronjob.startDow.description"><![CDATA[An diesen Tagen der Woche (0 - 6 mit Sonntag = 0 oder mon - sun) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>\r
-               <item name="wcf.acp.cronjob.startHour"><![CDATA[Stunde]]></item>\r
-               <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Zu diesen Stunden (0 - 23) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>\r
-               <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>\r
-               <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Zu diesen Minuten (0 - 59) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>\r
-               <item name="wcf.acp.cronjob.startMonth"><![CDATA[Monat]]></item>\r
-               <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[In diesen Monaten (1 - 12 oder jan - dec) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>\r
-               <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>\r
-               <item name="wcf.acp.cronjob.subtitle"><![CDATA[&raquo;Cronjobs&laquo;]]></item>\r
-       </category>\r
-       <category name="wcf.acp.group">\r
-               <item name="wcf.acp.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>\r
-               <item name="wcf.acp.group.add.permissions"><![CDATA[Zugriffsrechte]]></item>\r
-               <item name="wcf.acp.group.add.success"><![CDATA[Die Benutzergruppe wurde erfolgreich angelegt.]]></item>\r
-               <item name="wcf.acp.group.administrators"><![CDATA[Administratoren]]></item>\r
-               <item name="wcf.acp.group.data"><![CDATA[Allgemeine Daten]]></item>\r
-               <item name="wcf.acp.group.delete"><![CDATA[Benutzergruppe löschen]]></item>\r
-               <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}Die Benutzergruppe wurde{else}{#$deletedGroups} Benutzergruppen wurden{/if} erfolgreich gelöscht.]]></item>\r
-               <item name="wcf.acp.group.delete.sure"><![CDATA[Willst du diese Benutzergruppe wirklich löschen?]]></item>\r
-               <item name="wcf.acp.group.edit"><![CDATA[Benutzergruppe bearbeiten]]></item>\r
-               <item name="wcf.acp.group.edit.success"><![CDATA[Deine Änderungen an der Benutzergruppe wurde erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[Du bist selbst Mitglied dieser Benutzergruppe. Änderungen an den Zugriffsrechten dieser Benutzergruppe können womöglich dazu führen, dass du aus der Administrationsoberfläche ausgeschlossen wirst. Bitte sei entsprechend vorsichtig!]]></item>\r
-               <item name="wcf.acp.group.everyone"><![CDATA[Jeder]]></item>\r
-               <item name="wcf.acp.group.groupID"><![CDATA[Gruppen-ID]]></item>\r
-               <item name="wcf.acp.group.groupName"><![CDATA[Name der Benutzergruppe]]></item>\r
-               <item name="wcf.acp.group.groupName.description"><![CDATA[Gib einen Namen der Gruppe an.]]></item>\r
-               <item name="wcf.acp.group.guests"><![CDATA[Gäste]]></item>\r
-               <item name="wcf.acp.group.list"><![CDATA[Benutzergruppen]]></item>\r
-               <item name="wcf.acp.group.list.data"><![CDATA[Insgesamt {#$items} Benutzergruppen]]></item>\r
-               <item name="wcf.acp.group.members"><![CDATA[Anzahl Mitglieder]]></item>\r
-               <item name="wcf.acp.group.moderators"><![CDATA[Moderatoren]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Kann Administrationsoberfläche betreten]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Mitglieder dieser Benutzergruppe können die Administrationsoberfläche betreten und dort abhängig von den weiteren Zugriffsrechten verschiedene Aktionen durchführen. Diese Option muss aktiviert sein, wenn diesen Benutzern andere administrative Funktionen erlaubt werden sollen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Kann versteckte Profilinformationen sehen]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Mitglieder dieser Benutzergruppe können die versteckten Informationen in Benutzerprofilen sehen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Kann allgemeine Einstellungen vornehmen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Mitglieder dieser Benutzergruppe können die allgemeinen System-Einstellungen sehen und bearbeiten. Z.B. Forum ein-/ausschalten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Kann Protokolle abrufen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können die System-Protokolle abrufen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Kann neue zeitgesteuerte Aufgaben anlegen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue zeitgesteuerte Aufgaben anlegen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben löschen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben löschen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Kann Protokoll der zeitgesteuerten Aufgaben löschen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Protokoll der zeitgesteuerten Aufgaben löschen. Bei der Ausführung einer zeitgesteuerten Aufgabe wird festgehalten, ob dieser erfolgreich ausgeführt wurde.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben ändern]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben deaktivieren]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben deaktivieren. Diese werden dann nicht mehr ausgeführt, können später jedoch auch wieder aktiviert werden.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Kann Update-Server bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Update-Server bearbeiten und neue hinzufügen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Kann Pakete installieren]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können zusätzliche Pakete installieren.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Kann Pakete deinstallieren]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete entfernen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Kann Pakete aktualisieren]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete aktualisieren.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Zugängliche Benutzergruppen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Mitglieder dieser Benutzergruppe haben auf diese Gruppen Zugriff. Zusätzlich muss angegeben werden, ob z.B. die Benutzergruppe bearbeitet werden darf.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Kann neue Benutzergruppen erstellen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzergruppen erstellen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Kann neue Benutzer erstellen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzer erstellen. Ist bei "Zugängliche Benutzergruppen" eine Option aktiviert, kann diese Gruppe beim Erstellen des Benutzers zugewiesen werden.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Kann Benutzergruppen löschen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen löschen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Kann Benutzer löschen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer löschen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Kann Benutzergruppen bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Kann E-Mail-Adressen bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Kann Kennwörter bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Kennwort von anderen Benutzern bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Kann Benutzer bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Kann E-Mails an Benutzer senden]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern sehen und ihnen E-Mails senden.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Kann Benutzer suchen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer und deren Profile durchsuchen.]]></item>\r
-               <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrative Rechte]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Inhalte]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Darstellung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.general"><![CDATA[Allgemeine administrative Rechte]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Wartung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System-Funktionen]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Paketverwaltung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user"><![CDATA[Benutzer-Funktionen]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Gruppenverwaltung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[Benutzerverwaltung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderative Rechte]]></item>\r
-               <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.user"><![CDATA[Allgemeine Rechte]]></item>\r
-               <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>\r
-               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Kann deaktivierte Stile benutzen]]></item>\r
-               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Mitglieder dieser Benutzergruppe können deaktivierte Stile auswählen.]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Stil-Verwaltung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.showMembers"><![CDATA[Zeige die Mitglieder dieser Benutzergruppe]]></item>\r
-               <item name="wcf.acp.group.superModerators"><![CDATA[Super Moderatoren]]></item>\r
-               <item name="wcf.acp.group.users"><![CDATA[Registrierte Benutzer]]></item>\r
-       </category>\r
-       <category name="wcf.acp.login">\r
-               <item name="wcf.acp.login"><![CDATA[Anmeldung]]></item>\r
-               <item name="wcf.acp.login.data"><![CDATA[Zugangsdaten]]></item>\r
-       </category>\r
-       <category name="wcf.acp.masterPassword">\r
-               <item name="wcf.acp.masterPassword"><![CDATA[Hauptkennwort]]></item>\r
-               <item name="wcf.acp.masterPassword.confirm"><![CDATA[Hauptkennwort wiederholen]]></item>\r
-               <item name="wcf.acp.masterPassword.enter"><![CDATA[Hauptkennwort erforderlich]]></item>\r
-               <item name="wcf.acp.masterPassword.enter.description"><![CDATA[Die aufgerufene Seite oder Aktion erfordert aus Sicherheitsgründen die Eingabe des Hauptkennwortes. Pro Sitzung ist die Eingabe des Hauptkennwortes nur einmal erforderlich. Falls du das Hauptkennwort vergessen haben solltest, kannst du es zurücksetzen, indem du die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschst.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[Das Hauptkennwort ist nicht korrekt. Falls du das Hauptkennwort vergessen haben solltest, kannst du es zurücksetzen, indem du die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschst.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[Das Kennwort wurde als unsicher erkannt. Das Kennwort sollte mindestens acht Zeichen lang sein, große und kleine lateinische Buchstaben, Zahlen und Sonderzeichen enthalten. Es darf nicht mit den Kennwörtern von anderen Administratoren übereinstimmen.]]></item>\r
-               <item name="wcf.acp.masterPassword.example"><![CDATA[Vorschlag]]></item>\r
-               <item name="wcf.acp.masterPassword.example.set"><![CDATA[Vorschlag übernehmen]]></item>\r
-               <item name="wcf.acp.masterPassword.init"><![CDATA[Hauptkennwort festlegen]]></item>\r
-               <item name="wcf.acp.masterPassword.init.description"><![CDATA[Das Hauptkennwort ist ein zusätzlicher Schutz für sicherheitskritische Funktionen. Du solltest hier ein möglichst sicheres Kennwort verwenden, dass sich von deinem normalen Administrator-Kennwort unterscheidet, Dritten nicht bekannt ist und auch nicht auf anderen Internetseiten verwendet wird.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.menu">\r
-               <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatisches Update]]></item>\r
-               <item name="wcf.acp.menu.link.content"><![CDATA[Inhalte]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[Protokoll anzeigen]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[Zeitgesteuerte Aufgaben auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.display"><![CDATA[Darstellung]]></item>\r
-               <item name="wcf.acp.menu.link.group"><![CDATA[Benutzergruppen]]></item>\r
-               <item name="wcf.acp.menu.link.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>\r
-               <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-Mail an Gruppenmitglieder]]></item>\r
-               <item name="wcf.acp.menu.link.group.view"><![CDATA[Benutzergruppen auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.log"><![CDATA[Protokoll]]></item>\r
-               <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.menu.link.log.session"><![CDATA[Sitzungen]]></item>\r
-               <item name="wcf.acp.menu.link.maintenance"><![CDATA[Wartung]]></item>\r
-               <item name="wcf.acp.menu.link.option"><![CDATA[Optionen]]></item>\r
-               <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Sichern &amp; Wiederherstellen]]></item>\r
-               <item name="wcf.acp.menu.link.package"><![CDATA[Paketverwaltung]]></item>\r
-               <item name="wcf.acp.menu.link.package.database"><![CDATA[Pakete suchen]]></item>\r
-               <item name="wcf.acp.menu.link.package.install"><![CDATA[Paket installieren]]></item>\r
-               <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Server hinzufügen]]></item>\r
-               <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.package.view"><![CDATA[Pakete auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>\r
-               <item name="wcf.acp.menu.link.user"><![CDATA[Benutzer]]></item>\r
-               <item name="wcf.acp.menu.link.user.add"><![CDATA[Benutzer hinzufügen]]></item>\r
-               <item name="wcf.acp.menu.link.user.list"><![CDATA[Benutzer auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-Mail an alle Benutzer]]></item>\r
-               <item name="wcf.acp.menu.link.user.management"><![CDATA[Benutzer]]></item>\r
-               <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>\r
-               <item name="wcf.acp.menu.link.user.search"><![CDATA[Benutzer suchen]]></item>\r
-       </category>\r
-       <category name="wcf.acp.option">\r
-               <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Hostname ausschließen]]></item>\r
-               <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Gib pro Zeile einen Hostname an, die du von der Seite ausschließen möchtest.]]></item>\r
-               <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[IP-Adresse ausschließen]]></item>\r
-               <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Gib pro Zeile eine IP-Adresse an, die du von der Seite ausschließen möchtest.]]></item>\r
-               <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Browser-Kennung ausschließen]]></item>\r
-               <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Gib pro Zeile eine Browser-Kennung (User-Agent) an, die du von der Seite ausschließen möchtest.]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache-Server]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Gib hier die Adresse des Memcache-Servers ein! Mehrere Server können zeilenweise angegeben werden.]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Persistente Verbindungen aktivieren]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[Sollen beim Verbinden mit dem Memcache-Server persistente Verbindungen genutzt werden?]]></item>\r
-               <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache-Methode]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Bitte wähle die gewünschte Cache-Methode aus! Beachte, dass einige Methoden spezielle Anforderungen an das Server-System stellen und nicht auf jedem Server zur Verfügung stehen.]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[Dateisystem (Standard)]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (Experimentell)]]></item>\r
-               <item name="wcf.acp.option.category.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache speichert häufig benötige Daten im Arbeitsspeicher zwischen. Dies kann die Last auf die Datenbank und das Dateisystem drastisch reduzieren. Lies mehr über dieses Thema auf der folgenden Seite:\r
-<ul>\r
-       <li><a href="http://memcached.org/">memcached.org</a></li>\r
-</ul>]]></item>\r
-               <item name="wcf.acp.option.category.general.date"><![CDATA[Datum &amp; Zeit]]></item>\r
-               <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>\r
-               <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>\r
-               <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>\r
-               <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy-Server]]></item>\r
-               <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[Hier kannst du optional Proxy-Server für Verbindungen zu externen Servern konfigurieren.]]></item>\r
-               <item name="wcf.acp.option.category.general.mail"><![CDATA[E-Mails]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Versand]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.offline"><![CDATA[Wartungsmodus]]></item>\r
-               <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module"><![CDATA[Module an / aus]]></item>\r
-               <item name="wcf.acp.option.category.module.content"><![CDATA[Inhalte]]></item>\r
-               <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.display"><![CDATA[Darstellung]]></item>\r
-               <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>\r
-               <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.user"><![CDATA[Benutzer]]></item>\r
-               <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security"><![CDATA[Sicherheit]]></item>\r
-               <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>\r
-               <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internetseiten werden häufig durch andere Programme angegriffen. So gibt es beispielsweise die Möglichkeit, automatisiert hunderte von Benutzerkonten zu erstellen. Um sich davor zu schützen, kannst du an verschiedenen Stellen ein sogenanntes <a href="http://de.wikipedia.org/wiki/Captcha" class="externalURL">Captcha-Bild</a> anzeigen lassen. Unregistrierte Benutzer müssen erst den Code eingeben, der auf diesem Bild steht. Roboter können diesen Code nicht lesen. Beachte, dass Captcha-Bilder von blinden und sehbehinderten Benutzern nicht identifiziert werden können.]]></item>\r
-               <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>\r
-               <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.censorship"><![CDATA[Zensur]]></item>\r
-               <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sitzungen]]></item>\r
-               <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.user"><![CDATA[Mitglieder]]></item>\r
-               <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookiedomain]]></item>\r
-               <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Hier kannst Du optional eine Domain angeben, unter der der Cookie laufen soll. Standardmäßig solltest Du dieses Feld frei lassen, da ein Ausfüllen nur in wenigen Fällen notwendig ist.]]></item>\r
-               <item name="wcf.acp.option.cookie_path"><![CDATA[Cookiepfad]]></item>\r
-               <item name="wcf.acp.option.cookie_path.description"><![CDATA[Der Cookiepfad wird absolut zum Document Root angegeben - also z.B. "/forum" für http://www.woltlab.de/forum.]]></item>\r
-               <item name="wcf.acp.option.cookie_prefix"><![CDATA[Präfix für Cookienamen]]></item>\r
-               <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Gib einen Präfix an, der bei Cookienamen verwendet wird.]]></item>\r
-               <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Uhr automatisch auf Sommer-/Winterzeit umstellen]]></item>\r
-               <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Soll die Uhr automatisch auf Sommer-/Winterzeit umgestellt werden?]]></item>\r
-               <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Cache-Methode für Sitzungsdaten verwenden]]></item>\r
-               <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Soll für die Speicherung der Sitzungsdaten die ausgewählte Cache-Methode verwendet werden?]]></item>\r
-               <item name="wcf.acp.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>\r
-               <item name="wcf.acp.option.export"><![CDATA[Optionen sichern]]></item>\r
-               <item name="wcf.acp.option.export.download"><![CDATA[Sicherung der Optionen herunterladen]]></item>\r
-               <item name="wcf.acp.option.export.download.description"><![CDATA[Lade eine Sicherung der Optionen auf deinen lokalen Rechner herunter.]]></item>\r
-               <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Gzip-Komprimierung aktivieren]]></item>\r
-               <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Durch Aktivierung dieser Option werden die Inhalte komprimiert vom Server an den Client gesendet. Dies reduziert den Traffic.]]></item>\r
-               <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Seitencaching im Client-Browser verhindern]]></item>\r
-               <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Durch Aktivierung dieser Option kannst du das Caching der Seite im Browser verhindern.]]></item>\r
-               <item name="wcf.acp.option.http_gzip_level"><![CDATA[Gzip-Komprimierungslevel]]></item>\r
-               <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[Werte von 1-9 sind zulässig. Als Optimum zwischen Komprimierung und Serverlast empfiehlt sich Level 1.]]></item>\r
-               <item name="wcf.acp.option.import"><![CDATA[Optionen wiederherstellen]]></item>\r
-               <item name="wcf.acp.option.import.error.importFailed"><![CDATA[Die Optionen konnten nicht erfolgreich importiert werden.]]></item>\r
-               <item name="wcf.acp.option.import.success"><![CDATA[Die Optionen wurden erfolgreich importiert.]]></item>\r
-               <item name="wcf.acp.option.import.upload"><![CDATA[Sicherung der Optionen vom lokalen Computer hochladen]]></item>\r
-               <item name="wcf.acp.option.import.upload.description"><![CDATA[Gib eine Sicherung der Optionen von Ihrem lokalen Rechner an.]]></item>\r
-               <item name="wcf.acp.option.importAndExport"><![CDATA[Optionen sichern &amp; wiederherstellen]]></item>\r
-               <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator-Adresse]]></item>\r
-               <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Gib die E-Mail-Adresse des Administrators an.]]></item>\r
-               <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Logfile-Pfad]]></item>\r
-               <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Gib den Pfad zum Logfile an.]]></item>\r
-               <item name="wcf.acp.option.mail_from_address"><![CDATA[Absender-Adresse]]></item>\r
-               <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Gib die Absender-Adresse bei automatisch generierten E-Mails an.]]></item>\r
-               <item name="wcf.acp.option.mail_from_name"><![CDATA[Absender-Name]]></item>\r
-               <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Gib den Namen des Absenders bei automatisch generierten E-Mails an.]]></item>\r
-               <item name="wcf.acp.option.mail_send_method"><![CDATA[Versandmethode]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Wähle eine Versandmethode aus.]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>\r
-               <item name="wcf.acp.option.mail_signature"><![CDATA[Signatur]]></item>\r
-               <item name="wcf.acp.option.mail_signature.description"><![CDATA[Trage hier eine Signatur ein, die bei System-E-Mails angezeigt werden soll.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP-Server]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Trage hier den SMTP-Server ein.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP-Kennwort]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Gib das SMTP-Kennwort an.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP-Port]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Gib den SMTP-Port an.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP-Benutzer]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Gib den SMTP-Benutzer an.]]></item>\r
-               <item name="wcf.acp.option.mail_use_f_param"><![CDATA[&raquo;-f&laquo; Parameter verwenden]]></item>\r
-               <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Manche Server benötigen den &raquo;-f&laquo; Parameter beim Versenden von E-Mails. Falls du Probleme mit dem Versand von E-Mails hast, aktiviere diese Einstellung.]]></item>\r
-               <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Formatierte E-Mail-Adressen verwenden]]></item>\r
-               <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Absender- und Empfänger-Adressen werden in folgendes Format gebracht: &quot;Name &lt;email@domain.tld&gt;&quot;. Diese Funktion wird nicht von allen Mailservern unterstützt und sollte daher bei Problemen abgeschaltet werden.]]></item>\r
-               <item name="wcf.acp.option.module_master_password"><![CDATA[Hauptkennwort aktivieren]]></item>\r
-               <item name="wcf.acp.option.module_master_password.description"><![CDATA[Aktiviert die zusätzliche Eingabe eines Kennworts beim Aufruf von sicherheitskritischen Bereichen.]]></item>\r
-               <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>\r
-               <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server für HTTP-Verbindungen]]></item>\r
-               <item name="wcf.acp.option.session_timeout"><![CDATA[Gültigkeitslänge einer Sitzung]]></item>\r
-               <item name="wcf.acp.option.session_timeout.description"><![CDATA[Gib an, wie lange die Sitzung gültig ist [Sekunden]. ]]></item>\r
-               <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[IP-Adresse der Sitzung überprüfen]]></item>\r
-               <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[Anzahl der Blöcke der IP-Adresse die beim Auslesen der Sitzung überprüft werden sollen. Eine hohe Einstellung kann Benutzer ausschließen, die mit wechselnden IP-Adressen im Internet unterwegs sind.]]></item>\r
-               <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Browser-Kennung der Sitzung überprüfen]]></item>\r
-               <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Soll die Browser-Kennung beim Auslesen der Sitzung überprüft werden?]]></item>\r
-               <item name="wcf.acp.option.success"><![CDATA[Deine Einstellungsänderungen wurden erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.option.timezone"><![CDATA[Zeitzone]]></item>\r
-               <item name="wcf.acp.option.timezone.description"><![CDATA[Wähle die Standard Zeitzone deiner Seite.]]></item>\r
-               <item name="wcf.acp.option.user_online_timeout"><![CDATA[Timeout für Benutzer-Online]]></item>\r
-               <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Gib an, wie lange der Benutzer trotz Inaktivität als online markiert werden soll [Sekunden].]]></item>\r
-               <item name="wcf.acp.option.category.general.page"><![CDATA[Seite]]></item>\r
-               <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.meta_description"><![CDATA[Meta Description]]></item>\r
-               <item name="wcf.acp.option.meta_description.description"><![CDATA[Gib eine Meta Description an.]]></item>\r
-               <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta Keywords]]></item>\r
-               <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Trage die Wörter ein, die im Meta-Tag Keywords stehen sollen.]]></item>\r
-               <item name="wcf.acp.option.page_description"><![CDATA[Seitenbeschreibung]]></item>\r
-               <item name="wcf.acp.option.page_description.description"><![CDATA[Füge hier eine kurze Beschreibung deiner Seite ein.]]></item>\r
-               <item name="wcf.acp.option.page_title"><![CDATA[Titel der Seite]]></item>\r
-               <item name="wcf.acp.option.page_title.description"><![CDATA[Gib hier den Globalen Titel der Seite an. Dieser Titel wird im Seitenkopf dargestellt, wenn du die Anzeige dieses Textes im Stileditor aktiviert hast.]]></item>\r
-               <item name="wcf.acp.option.page_url"><![CDATA[Adresse (URL) der Seite]]></item>\r
-               <item name="wcf.acp.option.page_url.description"><![CDATA[Gib an, unter welcher Adresse (URL) die Seite aufzurufen ist (ohne abschließenden Slash).]]></item>\r
-               <item name="wcf.acp.option.page_urls"><![CDATA[Weitere URLs]]></item>\r
-               <item name="wcf.acp.option.page_urls.description"><![CDATA[Gib hier weitere URLs an, unter denen deine Seite erreichbar ist.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.package">\r
-               <item name="wcf.acp.package.cancel"><![CDATA[Abbruch der Paketinstallation]]></item>\r
-               <item name="wcf.acp.package.description"><![CDATA[Beschreibung]]></item>\r
-               <item name="wcf.acp.package.install"><![CDATA[Paketinstallation]]></item>\r
-               <item name="wcf.acp.package.install.cancel"><![CDATA[Installation abbrechen]]></item>\r
-               <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Willst du die Installation wirklich abbrechen?]]></item>\r
-               <item name="wcf.acp.package.install.error"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>\r
-               <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[Die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} kann aufgrund von Inkompatibilitäten zu {if $excludedPackages|count == 1}folgendem Paket{else}folgenden Paketen{/if} nicht durchgeführt werden:]]></item>\r
-               <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in Version {$excludedPackage.packageVersion}]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket lässt{else}Folgende Pakete lassen{/if} die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} aufgrund von Inkompatibilitäten nicht zu:]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in Version {$excludingPackage.packageVersion}]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket ist{else}Folgende Pakete sind{/if} mit dem Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} nicht kompatibel. Wenn du die Installation fortführst, {if $excludingPackages|count == 1}wird das Paket{else}werden die Pakete{/if} vermutlich nicht mehr korrekt funktionieren.]]></item>\r
-               <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}ist bereits installiert{else}{if $package.file|isset}liegt dem Paket bei{else}fehlt{/if}{/if})</span>]]></item>\r
-               <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Willst du die Paketinstallation wirklich abbrechen?]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances"><![CDATA[Folgende Pakete können mit diesem Paket aktualisiert werden]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Wähle eines der folgenden Pakete aus, um seine Version zu aktualisieren. Falls du das Paket neu installieren möchtest, klick unten auf &raquo;Weiter&laquo;.]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[Es ist bereits eine Kopie dieses Paketes installiert. Wenn du fortfährst, wird eine weitere Kopie dieses Paketes installiert. Falls du eine vorhandene Kopie dieses Paketes aktualisieren möchtest, wähle die Kopie aus der folgenden Liste aus.]]></item>\r
-               <item name="wcf.acp.package.install.version"><![CDATA[Version des Paketes:]]></item>\r
-               <item name="wcf.acp.package.installDate"><![CDATA[Installationsdatum]]></item>\r
-               <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[Beim Versuch die Dateien des Paketes zu entpacken, ist folgender Fehler aufgetreten:]]></item>\r
-               <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[Folgende Dateien konnten nicht erfolgreich entpackt werden. Bitte überprüfe, ob der entsprechende Zielort beschreibbar ist.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Tabellen Konflikt]]></item>\r
-               <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Keine Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Alle Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Notwendige Änderungen]]></item>\r
-               <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Betroffene Tabelle]]></item>\r
-               <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Vorhandene Tabellen deiner Datenbank stehen im Konflikt mit Tabellen, die für dieses Paket installiert werden müssen. Wähle aus, ob diese Tabellen überschrieben werden sollen.]]></item>\r
-               <item name="wcf.acp.package.list"><![CDATA[Installierte Pakete]]></item>\r
-               <item name="wcf.acp.package.list.author"><![CDATA[Hersteller]]></item>\r
-               <item name="wcf.acp.package.list.count"><![CDATA[Insgesamt sind {#$items} Pakete installiert.]]></item>\r
-               <item name="wcf.acp.package.list.date"><![CDATA[Herstellungsdatum]]></item>\r
-               <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>\r
-               <item name="wcf.acp.package.list.other"><![CDATA[Sonstiges Paket]]></item>\r
-               <item name="wcf.acp.package.list.plugin"><![CDATA[Zusatzmodul]]></item>\r
-               <item name="wcf.acp.package.list.standalone"><![CDATA[Endanwendung]]></item>\r
-               <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>\r
-               <item name="wcf.acp.package.optionals"><![CDATA[Optionale Zusatzpakete installieren]]></item>\r
-               <item name="wcf.acp.package.optionals.description"><![CDATA[Das aktuelle Paket bringt folgende optionale Zusatzpakete mit. Wähle aus, welche Zusatzpakete du installieren möchtest.]]></item>\r
-               <item name="wcf.acp.package.optionals.installed"><![CDATA[ (Dieses Paket ist bereits installiert.)]]></item>\r
-               <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (Die Voraussetzungen für dieses Paket werden nicht erfüllt.)]]></item>\r
-               <item name="wcf.acp.package.packageDir"><![CDATA[Installationsverzeichnis]]></item>\r
-               <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Es ist bereits eine andere Anwendung in dem angegebenen Verzeichnis installiert.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[Das angegebene Verzeichnis ist nicht beschreibbar.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[Das angegebene Verzeichnis wird bereits von WoltLab Community Framework beansprucht. Wähle ein anderes Verzeichnis.]]></item>\r
-               <item name="wcf.acp.package.packageDir.input"><![CDATA[Gib hier das Installationsverzeichnis an.]]></item>\r
-               <item name="wcf.acp.package.packageDir.url"><![CDATA[Nach der Installation in das angegebene Installationsverzeichnis ist die Anwendung über folgende Adresse (URL) erreichbar:]]></item>\r
-               <item name="wcf.acp.package.requirements"><![CDATA[Abhängigkeiten auswählen]]></item>\r
-               <item name="wcf.acp.package.requirements.description"><![CDATA[Das aktuelle Paket benötigt Pakete, von denen mehrere Instanzen installiert sind. Bitte wähle aus, zu welcher Instanz jeweils eine Abhängigkeit hergestellt werden soll.]]></item>\r
-               <item name="wcf.acp.package.rollback"><![CDATA[Paketinstallation zurücksetzen]]></item>\r
-               <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright &copy; {$packageAuthor}]]></item>\r
-               <item name="wcf.acp.package.startInstall"><![CDATA[Neues Paket installieren]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[Das angegebene Archiv ist kein gültiges Paket.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[Paket &raquo;{$package->getName()}&laquo; kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[Es konnte keine Datei unter dem angegebenen Pfad gefunden wurden.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert. Das Paket kann nicht mehrfach installiert werden.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[Das Hochladen der ausgewählten Datei ist fehlgeschlagen.]]></item>\r
-               <item name="wcf.acp.package.startInstall.source"><![CDATA[Quelle auswählen]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Direkten Pfad zum Paket angeben]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Gib den direkten Pfad zur Paketdatei an. Dabei kann es sich um die Internet Adresse der Paketdatei oder alternativ den Pfad zur Paketdatei im Dateisystem handeln.]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Paket vom lokalen Computer hochladen]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Gib eine Paketdatei von deinem lokalen Rechner an.]]></item>\r
-               <item name="wcf.acp.package.startUpdate"><![CDATA[Paket &raquo;{$package->getName()}&laquo; aktualisieren]]></item>\r
-               <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>\r
-               <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>\r
-               <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation abgeschlossen]]></item>\r
-               <item name="wcf.acp.package.step.install.optionals"><![CDATA[Optionale Pakete werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.package"><![CDATA[Paket wird registriert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>\r
-               <item name="wcf.acp.package.step.install.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
-               <item name="wcf.acp.package.step.title"><![CDATA[Paket <b>{$packageName|encodeJS}</b>: ]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Dateien werden gelöscht ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Deinstallation abgeschlossen]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Optionale Pakete werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>\r
-               <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>\r
-               <item name="wcf.acp.package.step.update.finish"><![CDATA[Paketaktualisierung abgeschlossen]]></item>\r
-               <item name="wcf.acp.package.step.update.optionals"><![CDATA[Optionale Pakete werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.package"><![CDATA[Paket wird aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>\r
-               <item name="wcf.acp.package.step.update.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
-               <item name="wcf.acp.package.templatePatch.install.failed"><![CDATA[Das Anwenden eines Patches, der zu diesem Paket gehört, ist fehlgeschlagen, da dieser Patch nicht kompatibel zu seiner Zieldatei ist. Das Paket kann deshalb nicht installiert werden. Klick auf &raquo;Installation abbrechen&laquo;.]]></item>\r
-               <item name="wcf.acp.package.templatePatch.repatch.failed"><![CDATA[Das erneute Patchen folgender Templates scheiterte:<br />{foreach from=$failures item=$failure}{$failure.templateName} (ursprünglich gepatcht von: {$failure.packageName})<br />{/foreach}Wahrscheinlich wird deshalb das Paket, das den jeweiligen Patch ursprünglich angewendet hatte, nicht mehr funktionieren. Du solltest dieses Update dennoch fortsetzen. Klick dazu auf &raquo;Weiter&laquo;.]]></item>\r
-               <item name="wcf.acp.package.templatePatch.uninstall.failed"><![CDATA[Das Entfernen eines Patches, der zu diesem Paket gehört, ist fehlgeschlagen, da seine Zieldatei anderweitig verändert worden ist. Das Paket kann deshalb nicht entfernt werden. Klick auf &raquo;Abbruch der Paketdeinstallation&laquo;.]]></item>\r
-               <item name="wcf.acp.package.uninstall"><![CDATA[Paketdeinstallation]]></item>\r
-               <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Abbruch der Paketdeinstallation]]></item>\r
-               <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[Die Deinstallation des Paketes ist nicht möglich, da mindestens ein abhängiges Paket nicht deinstalliert werden kann.]]></item>\r
-               <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Diese{if $dependentPackages|count == 1}s Paket wird{else} Pakete werden{/if}, nach deiner Bestätigung, ohne weitere Sicherheitsabfrage deinstalliert.]]></item>\r
-               <item name="wcf.acp.package.update"><![CDATA[Paketaktualisierung]]></item>\r
-               <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>\r
-               <item name="wcf.acp.package.view.author"><![CDATA[Hersteller:]]></item>\r
-               <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Zur Administrationsoberfläche wechseln]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Paket deinstallieren]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Alle Pakete deinstallieren]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Willst du dieses Paket wirklich deinstallieren?]]></item>\r
-               <item name="wcf.acp.package.view.button.update"><![CDATA[Paket aktualisieren]]></item>\r
-               <item name="wcf.acp.package.view.date"><![CDATA[Herstellungsdatum:]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Abhängige Pakete]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[Dieses Paket wird von {#$dependentPackages|count} {if $dependentPackages|count == 1}anderen Paket{else}anderen Paketen{/if} benötigt.]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}Dieses Paket wird von 1 anderen Paket benötigt{else}{#$dependentPackages|count} Pakete sind direkt oder indirekt von diesem Paket abhängig{/if}.]]></item>\r
-               <item name="wcf.acp.package.view.dir"><![CDATA[Installationsverzeichnis:]]></item>\r
-               <item name="wcf.acp.package.view.identifier"><![CDATA[Bezeichner:]]></item>\r
-               <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installierte Instanz:]]></item>\r
-               <item name="wcf.acp.package.view.parent"><![CDATA[Übergeordnetes Paket:]]></item>\r
-               <item name="wcf.acp.package.view.properties"><![CDATA[Eigenschaften]]></item>\r
-               <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Benötigte Pakete]]></item>\r
-               <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[Dieses Paket benötigt {#$requiredPackages|count} {if $requiredPackages|count == 1}anderes Paket{else}andere Pakete{/if}.]]></item>\r
-               <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>\r
-               <item name="wcf.acp.package.view.version"><![CDATA[Installierte Version:]]></item>\r
-       </category>\r
-       <category name="wcf.acp.packageUpdate">\r
-               <item name="wcf.acp.packageUpdate"><![CDATA[Pakete aktualisieren]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentifizierung mit Update-Server]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Verbindungs-Daten]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Benutzername und Kennwort wurden nicht akzeptiert.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Gib ein Kennwort an, das zur Authentifizierung benötigt wird.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Gib einen Benutzernamen an, der zur Authentifizierung benötigt wird.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[Benutzeranmeldung]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server-Meldung]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server-Name]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Benutzerdaten dauerhaft speichern]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[Speichert die eingegebenen Benutzerdaten dauerhaft, sodass du die Daten zu einem späteren Zeitpunkt nicht erneut eingeben musst.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Adresse]]></item>\r
-               <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installierte Version]]></item>\r
-               <item name="wcf.acp.packageUpdate.error"><![CDATA[Es ist folgender Fehler aufgetreten: ]]></item>\r
-               <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[Das Herunterladen des Paketes {$package} ist fehlgeschlagen.]]></item>\r
-               <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[Beim Versuch die Paketliste herunterzuladen, ist ein Fehler aufgetreten.]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[Es {if $excludedPackages|count == 1}ist folgender Konflikt{else}sind folgende Konflikte{/if} aufgetreten:]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[Das installierte Paket &raquo;{$excludedPackage.existingPackageName}&laquo; ist mit dem Paket &raquo;{$excludedPackage.packageName}&laquo; in Version {$excludedPackage.packageVersion} nicht kompatibel.]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[Das Paket &raquo;{$excludedPackage.packageName}&laquo; in Version {$excludedPackage.packageVersion} ist mit dem installierten Paket &raquo;{$excludedPackage.existingPackageName}&laquo; nicht kompatibel.]]></item>\r
-               <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} wird installiert]]></item>\r
-               <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[Derzeit sind keine Updates verfügbar.]]></item>\r
-               <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[Du hast kein Update ausgewählt.]]></item>\r
-               <item name="wcf.acp.packageUpdate.options"><![CDATA[Optionen]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[Das Paket ist bereits installiert und kann kein weiteres Mal installiert werden.]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Paket installieren]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Weitere Paket-Instanz installieren (Paket ist bereits {#$package.instances} mal installiert)]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Installiertes Paket {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} Version {$updatableInstance.packageVersion} aktualisieren]]></item>\r
-               <item name="wcf.acp.packageUpdate.search"><![CDATA[Pakete suchen]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Autor]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Suche nach ...]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Bereits installierte einzigartige Pakete ausblenden]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Paketname]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Paketname und -beschreibung durchsuchen]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update-Server]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Alle Update-Server durchsuchen]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Art des Paketes]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Sonstige Pakete]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Zusatzmodul für bereits installierte Pakete]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Endanwendung]]></item>\r
-               <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Alle Pakete auswählen]]></item>\r
-               <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} wird aktualisiert auf {$package.toVersion}]]></item>\r
-               <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[Neue Version]]></item>\r
-               <item name="wcf.acp.packageUpdate.updates"><![CDATA[Folgende Paket-Aktualisierungen/-Installationen werden durchgeführt:]]></item>\r
-       </category>\r
-       <category name="wcf.acp.sessionLog">\r
-               <item name="wcf.acp.sessionLog.access.view"><![CDATA[Aktionen der protokollierten Sitzung von &raquo;{$sessionLog->username}&laquo;]]></item>\r
-               <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[Insgesamt {#$items} protokollierte Aktion{if $items != 1}en{/if}]]></item>\r
-               <item name="wcf.acp.sessionLog.accesses"><![CDATA[Aktionen]]></item>\r
-               <item name="wcf.acp.sessionLog.className"><![CDATA[Klasse]]></item>\r
-               <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP-Adresse]]></item>\r
-               <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Letzte Aktion]]></item>\r
-               <item name="wcf.acp.sessionLog.packageName"><![CDATA[Paket]]></item>\r
-               <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Methode]]></item>\r
-               <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>\r
-               <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.sessionLog.time"><![CDATA[Datum]]></item>\r
-               <item name="wcf.acp.sessionLog.userAgent"><![CDATA[Browser-Kennung]]></item>\r
-               <item name="wcf.acp.sessionLog.view"><![CDATA[Protokollierte Sitzungen]]></item>\r
-               <item name="wcf.acp.sessionLog.view.count"><![CDATA[Insgesamt {#$items} protokollierte Sitzung{if $items != 1}en{/if}]]></item>\r
-       </category>\r
-       <category name="wcf.acp.updateServer">\r
-               <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>\r
-               <item name="wcf.acp.updateServer.add.success"><![CDATA[Der Server wurde erfolgreich angelegt.]]></item>\r
-               <item name="wcf.acp.updateServer.data"><![CDATA[Server-Daten]]></item>\r
-               <item name="wcf.acp.updateServer.delete"><![CDATA[Server löschen]]></item>\r
-               <item name="wcf.acp.updateServer.delete.success"><![CDATA[Der Server wurde erfolgreich gelöscht.]]></item>\r
-               <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Willst du den Server wirklich löschen?]]></item>\r
-               <item name="wcf.acp.updateServer.disable"><![CDATA[Deaktivieren]]></item>\r
-               <item name="wcf.acp.updateServer.edit"><![CDATA[Server bearbeiten]]></item>\r
-               <item name="wcf.acp.updateServer.edit.success"><![CDATA[Ihre Änderungen wurden erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.updateServer.enable"><![CDATA[Aktivieren]]></item>\r
-               <item name="wcf.acp.updateServer.errorText"><![CDATA[Fehlermeldungen]]></item>\r
-               <item name="wcf.acp.updateServer.htPassword"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Gib ein Kennwort an, das zur Authentifizierung benötigt wird (optional).]]></item>\r
-               <item name="wcf.acp.updateServer.htUsername"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Gib einen Benutzernamen an, der zur Authentifizierung benötigt wird (optional).]]></item>\r
-               <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[Beim letzten Verbindungsversuch trat folgende Fehlermeldungen auf:]]></item>\r
-               <item name="wcf.acp.updateServer.list.available"><![CDATA[Insgesamt {#$items} Server eingetragen]]></item>\r
-               <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server-ID]]></item>\r
-               <item name="wcf.acp.updateServer.packages"><![CDATA[Pakete]]></item>\r
-               <item name="wcf.acp.updateServer.server"><![CDATA[Adresse]]></item>\r
-               <item name="wcf.acp.updateServer.server.description"><![CDATA[Gib die Adresse (URL) zu einem Paketserver an.]]></item>\r
-               <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[Die eingetragene Adresse ist ungültig.]]></item>\r
-               <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>\r
-               <item name="wcf.acp.updateServer.timestamp"><![CDATA[Letzter Zugriff]]></item>\r
-               <item name="wcf.acp.updateServer.view"><![CDATA[Verfügbare Update-Server]]></item>\r
-               <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[Es sind keine Update-Server eingetragen.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.user">\r
-               <item name="wcf.acp.user.add"><![CDATA[Benutzer hinzufügen]]></item>\r
-               <item name="wcf.acp.user.add.data"><![CDATA[Benutzerdaten]]></item>\r
-               <item name="wcf.acp.user.add.success"><![CDATA[Der neue Benutzer wurde erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.user.assignToGroup"><![CDATA[Benutzergruppe zuweisen]]></item>\r
-               <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Folgende Benutzer den unten ausgewählten Benutzergruppen zuweisen]]></item>\r
-               <item name="wcf.acp.user.assignToGroup.success"><![CDATA[Die Zuweisung wurde erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.user.button.assignGroup"><![CDATA[Benutzergruppe zuweisen]]></item>\r
-               <item name="wcf.acp.user.button.exportMail"><![CDATA[E-Mail-Adressen exportieren]]></item>\r
-               <item name="wcf.acp.user.button.sendMail"><![CDATA[E-Mail senden]]></item>\r
-               <item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>\r
-               <item name="wcf.acp.user.delete.error"><![CDATA[Es konnte kein Benutzer gelöscht werden.]]></item>\r
-               <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}Der Benutzer wurde{else}{#$deletedUsers} Benutzer wurden{/if} erfolgreich gelöscht.]]></item>\r
-               <item name="wcf.acp.user.delete.sure"><![CDATA[Willst du diesen Benutzer wirklich löschen?]]></item>\r
-               <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Willst du die markierten Benutzer wirklich löschen?]]></item>\r
-               <item name="wcf.acp.user.edit"><![CDATA[Benutzer bearbeiten]]></item>\r
-               <item name="wcf.acp.user.edit.success"><![CDATA[Die Änderungen an diesem Benutzer wurden erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[Du bearbeitest dein eigenes Benutzerkonto. Änderungen an den Mitgliedschaften in Benutzergruppen können womöglich dazu führen, dass du aus der Administrationsoberfläche ausgeschlossen wirst. Sei bitte entsprechend vorsichtig!]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress"><![CDATA[E-Mail-Adressen exportieren]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Exportformat]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Exporteinstellungen]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[E-Mail-Adressen von folgenden Benutzern exportieren]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Trennzeichen]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Texttrenner]]></item>\r
-               <item name="wcf.acp.user.groups"><![CDATA[Benutzergruppe(n)]]></item>\r
-               <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Finde Benutzer, die in den ausgewählten Benutzergruppen nicht Mitglied sind.]]></item>\r
-               <item name="wcf.acp.user.list"><![CDATA[Benutzer]]></item>\r
-               <item name="wcf.acp.user.list.all"><![CDATA[Alle Benutzer]]></item>\r
-               <item name="wcf.acp.user.list.count"><![CDATA[Insgesamt {#$items} Benutzer]]></item>\r
-               <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "Einen Benutzer markiert" : this.count+" Benutzer markiert"]]></item>\r
-               <item name="wcf.acp.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>\r
-               <item name="wcf.acp.user.massProcessing.action"><![CDATA[Aktion]]></item>\r
-               <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Bedingungen]]></item>\r
-               <item name="wcf.acp.user.massProcessing.success"><![CDATA[Die gewählte Aktion wurde erfolgreich auf {#$affectedUsers} Benutzer ausgeführt.]]></item>\r
-               <item name="wcf.acp.user.massProcessing.warning"><![CDATA[Die Massenverarbeitung von Benutzern führt die unten ausgewählte Aktion <b>ohne zusätzliche Sicherheitsabfrage</b> auf alle Benutzer aus, die unter die eingestellten Bedingungen fallen. Die Bearbeitungen können unter Umständen sehr rechenintensiv werden und sollten deshalb möglichst nur dann ausgeführt werden, wenn sich die Seite im Wartungsmodus befindet! Die Veränderungen können nicht rückgängig gemacht werden. Bitte benutze diese Funktion mit der nötigen Vorsicht!]]></item>\r
-               <item name="wcf.acp.user.search"><![CDATA[Benutzer suchen]]></item>\r
-               <item name="wcf.acp.user.search.conditions"><![CDATA[Kriterien der Suche]]></item>\r
-               <item name="wcf.acp.user.search.conditions.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profil]]></item>\r
-               <item name="wcf.acp.user.search.display"><![CDATA[Darstellung]]></item>\r
-               <item name="wcf.acp.user.search.display.columns"><![CDATA[Angezeigte Informationen]]></item>\r
-               <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Sonstiges]]></item>\r
-               <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profil]]></item>\r
-               <item name="wcf.acp.user.search.display.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Benutzer pro Seite]]></item>\r
-               <item name="wcf.acp.user.search.display.sort"><![CDATA[Sortierung]]></item>\r
-               <item name="wcf.acp.user.search.error.noMatches"><![CDATA[Zu den angegebenen Kriterien wurde kein Benutzer gefunden.]]></item>\r
-               <item name="wcf.acp.user.search.matches"><![CDATA[{if $items == 1}Ein Ergebnis{else}{#$items} Ergebnisse{/if}]]></item>\r
-               <item name="wcf.acp.user.search.withinResults"><![CDATA[In den Ergebnissen suchen]]></item>\r
-               <item name="wcf.acp.user.sendMail"><![CDATA[E-Mail an Benutzer senden]]></item>\r
-               <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail an alle Benutzer]]></item>\r
-               <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[E-Mail als HTML verschicken]]></item>\r
-               <item name="wcf.acp.user.sendMail.from"><![CDATA[Absender]]></item>\r
-               <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Hier kannst du die E-Mail-Adresse des Absenders definieren.{if MAIL_USE_FORMATTED_ADDRESS} Es ist auch folgendes Format möglich:{/if}</p>\r
-{if MAIL_USE_FORMATTED_ADDRESS}<p style="text-align: center; line-height: 2em;"><code>Absender Name &lt;email@absender.tld&gt;</code></p>{/if}\r
-<p>Wenn du unter System -> Optionen -> E-Mail alles ausgefüllt hast, wird dieses Feld automatisch ausgefüllt. Solltest du E-Mails per SMTP senden, so achte darauf, dass die E-Mail-Adresse des Absenders auch vom Server akzeptiert werden muss.</p>]]></item>\r
-               <item name="wcf.acp.user.sendMail.group"><![CDATA[E-Mail an Gruppenmitglieder]]></item>\r
-               <item name="wcf.acp.user.sendMail.groups"><![CDATA[E-Mail an die Mitglieder folgender Benutzergruppen senden]]></item>\r
-               <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-Mail]]></item>\r
-               <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[E-Mail an folgende Benutzer senden]]></item>\r
-               <item name="wcf.acp.user.sendMail.subject"><![CDATA[Betreff]]></item>\r
-               <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Gib hier die Betreffzeile der E-Mail an.]]></item>\r
-               <item name="wcf.acp.user.sendMail.text"><![CDATA[Nachricht]]></item>\r
-               <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Trage hier die Nachricht ein, die du den Benutzern senden möchtest.]]></item>\r
-               <item name="wcf.acp.user.userNote"><![CDATA[Angemeldet als {$this->user->username}.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.worker">\r
-               <item name="wcf.acp.worker.currentStep"><![CDATA[Aktueller Schritt]]></item>\r
-               <item name="wcf.acp.worker.description"><![CDATA[Lass dieses Browser-Fenster offen, bis der Prozess abgeschlossen ist und melde dich auf keinen Fall in einem anderen Browser-Fenster separat in der Administrationsoberfläche an, da dies den Prozess behindern könnte.]]></item>\r
-               <item name="wcf.acp.worker.progress.finish"><![CDATA[Vorgang erfolgreich abgeschlossen]]></item>\r
-               <item name="wcf.acp.worker.progress.working"><![CDATA[Vorgang läuft ...]]></item>\r
-               <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>\r
-               <item name="wcf.acp.worker.title"><![CDATA[Prozess läuft ...]]></item>\r
-       </category>\r
-       <category name="wcf.global">\r
-               <item name="wcf.global.button.back"><![CDATA[&laquo; Zurück]]></item>\r
-               <item name="wcf.global.button.close"><![CDATA[Schließen]]></item>\r
-               <item name="wcf.global.button.collapse"><![CDATA[Zuklappen]]></item>\r
-               <item name="wcf.global.button.collapsible"><![CDATA[Auf- und Zuklappen]]></item>\r
-               <item name="wcf.global.button.delete"><![CDATA[Löschen]]></item>\r
-               <item name="wcf.global.button.delete.confirm"><![CDATA[Möchtest du das Element wirklich löschen?]]></item>\r
-               <item name="wcf.global.button.deleteCompletely"><![CDATA[Endgültig löschen]]></item>\r
-               <item name="wcf.global.button.edit"><![CDATA[Bearbeiten]]></item>\r
-               <item name="wcf.global.button.editor.jump"><![CDATA[Zum Editor wechseln]]></item>\r
-               <item name="wcf.global.button.expand"><![CDATA[Aufklappen]]></item>\r
-               <item name="wcf.global.button.mark"><![CDATA[Markieren]]></item>\r
-               <item name="wcf.global.button.next"><![CDATA[Weiter &raquo;]]></item>\r
-               <item name="wcf.global.button.preview"><![CDATA[Vorschau]]></item>\r
-               <item name="wcf.global.button.reset"><![CDATA[Zurücksetzen]]></item>\r
-               <item name="wcf.global.button.submit"><![CDATA[Absenden]]></item>\r
-               <item name="wcf.global.button.unmark"><![CDATA[Demarkieren]]></item>\r
-               <item name="wcf.global.date.day"><![CDATA[Tag]]></item>\r
-               <item name="wcf.global.date.days"><![CDATA[Tage]]></item>\r
-               <item name="wcf.global.date.hour"><![CDATA[Stunde]]></item>\r
-               <item name="wcf.global.date.hours"><![CDATA[Stunden]]></item>\r
-               <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>\r
-               <item name="wcf.global.date.minutes"><![CDATA[Minuten]]></item>\r
-               <item name="wcf.global.date.month"><![CDATA[Monat]]></item>\r
-               <item name="wcf.global.date.months"><![CDATA[Monate]]></item>\r
-               <item name="wcf.global.date.second"><![CDATA[Sekunde]]></item>\r
-               <item name="wcf.global.date.seconds"><![CDATA[Sekunden]]></item>\r
-               <item name="wcf.global.date.week"><![CDATA[Woche]]></item>\r
-               <item name="wcf.global.date.weeks"><![CDATA[Wochen]]></item>\r
-               <item name="wcf.global.date.year"><![CDATA[Jahr]]></item>\r
-               <item name="wcf.global.date.year.notRequired"><![CDATA[Die Angabe des Jahres ist optional.]]></item>\r
-               <item name="wcf.global.date.years"><![CDATA[Jahre]]></item>\r
-               <item name="wcf.global.dateFormat"><![CDATA[%d.%m.%Y]]></item>\r
-               <item name="wcf.global.dateFormatLocalized"><![CDATA[%e. %B %Y]]></item>\r
-               <item name="wcf.global.dateFormatToday"><![CDATA[<b>Heute</b>, %H:%M]]></item>\r
-               <item name="wcf.global.dateFormatYesterday"><![CDATA[Gestern, %H:%M]]></item>\r
-               <item name="wcf.global.dateInputOrder"><![CDATA[day-month-year]]></item>\r
-               <item name="wcf.global.dateMethod"><![CDATA[strftime]]></item>\r
-               <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>\r
-               <item name="wcf.global.defaultValue"><![CDATA[Standard]]></item>\r
-               <item name="wcf.global.error.backward"><![CDATA[Zurück zur vorherigen Seite]]></item>\r
-               <item name="wcf.global.error.empty"><![CDATA[Füll dieses Eingabefeld aus.]]></item>\r
-               <item name="wcf.global.error.file.notFound"><![CDATA[Die Datei konnte nicht gefunden werden.]]></item>\r
-               <item name="wcf.global.error.illegalLink"><![CDATA[Du hast einen ungültigen oder nicht mehr gültigen Link aufgerufen.]]></item>\r
-               <item name="wcf.global.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist dir leider verwehrt. Du besitzt nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>\r
-               <item name="wcf.global.error.permissionDenied.title"><![CDATA[Zutritt verwehrt]]></item>\r
-               <item name="wcf.global.error.title"><![CDATA[Fehlermeldung]]></item>\r
-               <item name="wcf.global.form.error"><![CDATA[Deine Angaben sind ungültig. Überprüfe die markierten Eingabefelder.]]></item>\r
-               <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>\r
-               <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>\r
-               <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>\r
-               <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>\r
-               <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>\r
-               <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede &raquo;Du&laquo;)]]></item>\r
-               <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>\r
-               <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>\r
-               <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>\r
-               <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>\r
-               <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>\r
-               <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>\r
-               <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>\r
-               <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>\r
-               <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>\r
-               <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>\r
-               <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>\r
-               <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>\r
-               <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>\r
-               <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>\r
-               <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>\r
-               <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>\r
-               <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>\r
-               <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>\r
-               <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>\r
-               <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>\r
-               <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>\r
-               <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>\r
-               <item name="wcf.global.language.th"><![CDATA[Thailändisch]]></item>\r
-               <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>\r
-               <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
-               <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>\r
-               <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>\r
-               <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>\r
-               <item name="wcf.global.multiSelect"><![CDATA[Mehrfache Markierungen sind durch zusätzliches Drücken der Taste &raquo;Strg/Ctrl&laquo; (Windows) oder &raquo;Befehl/Command&laquo; (Mac OS) möglich.]]></item>\r
-               <item name="wcf.global.page.input"><![CDATA[Zu folgender Seite springen]]></item>\r
-               <item name="wcf.global.page.next"><![CDATA[nächste Seite]]></item>\r
-               <item name="wcf.global.page.previous"><![CDATA[vorherige Seite]]></item>\r
-               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>\r
-               <item name="wcf.global.pageTitle"><![CDATA[WoltLab&reg; Community Framework&trade;]]></item>\r
-               <item name="wcf.global.redirect.title"><![CDATA[Weiterleitung]]></item>\r
-               <item name="wcf.global.redirect.url"><![CDATA[Falls die automatische Weiterleitung nicht funktioniert, klick hier!]]></item>\r
-               <item name="wcf.global.scrollDown"><![CDATA[Zum Seitenende]]></item>\r
-               <item name="wcf.global.scrollUp"><![CDATA[Zum Seitenanfang]]></item>\r
-               <item name="wcf.global.search.matchesExactly"><![CDATA[Exakter Treffer]]></item>\r
-               <item name="wcf.global.shortTimeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>\r
-               <item name="wcf.global.shortTimeFormatLocalized"><![CDATA[%e. %B %Y, %H:%M]]></item>\r
-               <item name="wcf.global.skipToContent"><![CDATA[Zum Seiteninhalt springen]]></item>\r
-               <item name="wcf.global.sortOrder.ascending"><![CDATA[in aufsteigender Reihenfolge]]></item>\r
-               <item name="wcf.global.sortOrder.descending"><![CDATA[in absteigender Reihenfolge]]></item>\r
-               <item name="wcf.global.thousandsSeparator"><![CDATA[&nbsp;]]></item>\r
-               <item name="wcf.global.timeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>\r
-               <item name="wcf.global.timeFormatLocalized"><![CDATA[%A, %e. %B %Y, %H:%M]]></item>\r
-       </category>\r
-       <category name="wcf.imageViewer">\r
-               <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Bild " + (this.currentIndex + 1) + " von " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>\r
-               <item name="wcf.imageViewer.close"><![CDATA[Schließen]]></item>\r
-               <item name="wcf.imageViewer.enlarge"><![CDATA[Nur dieses Bild anzeigen (beendet die Bildbetrachtung)]]></item>\r
-               <item name="wcf.imageViewer.next"><![CDATA[Nächstes Bild]]></item>\r
-               <item name="wcf.imageViewer.pause"><![CDATA[Diashow stoppen]]></item>\r
-               <item name="wcf.imageViewer.play"><![CDATA[Diashow starten (Bildwechsel alle 5 Sekunden)]]></item>\r
-               <item name="wcf.imageViewer.previous"><![CDATA[Vorheriges Bild]]></item>\r
-       </category>\r
-       <category name="wcf.option">\r
-               <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Kanarische Inseln, Lissabon, London, Monrovia, Ouagadougou, Reykjav&iacute;k]]></item>\r
-               <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brüssel, Kopenhagen, Madrid, Paris, Prag, Rom, Sarajevo, Stockholm, Tunis, Warschau, Wien]]></item>\r
-               <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athen, Beirut, Bukarest, Helsinki, Istanbul, Jerusalem, Kairo, Kapstadt, Khartum, Kiew, Minsk, Sofia]]></item>\r
-               <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Abeba, Antananarivo, Bagdad, Daressalam, Kampala, Kuwait, Mogadischu, Moskau, Nairobi, Riad]]></item>\r
-               <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Teheran]]></item>\r
-               <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Eriwan, Maskat, R&eacute;union, Tiflis]]></item>\r
-               <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>\r
-               <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Asgabat, Bischkek, Duschanbe, Islamabad, Jekaterinburg, Karatschi, Malediven, Taschkent]]></item>\r
-               <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, Neu-Delhi]]></item>\r
-               <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>\r
-               <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Nowosibirsk]]></item>\r
-               <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Kokosinseln, Rangun]]></item>\r
-               <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnojarsk, Vientiane]]></item>\r
-               <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hongkong, Irkutsk, Kuala Lumpur, Manila, Peking, Perth, Singapur, Taipeh, Ulan Bator]]></item>\r
-               <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Australien)]]></item>\r
-               <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Jakutsk, Osaka, Pjöngjang, Sapporo, Seoul, Tokyo]]></item>\r
-               <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>\r
-               <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Wladiwostok]]></item>\r
-               <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord-Howe-Insel (Australien)]]></item>\r
-               <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, Neukaledonien, Salomonen]]></item>\r
-               <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolkinsel]]></item>\r
-               <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, Bairiki, Fidschi, Kamtschatka, Marshall-Inseln, Wellington]]></item>\r
-               <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham-Inseln (Neuseeland)]]></item>\r
-               <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenixinseln]]></item>\r
-               <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Linieninseln, Weihnachtsinsel]]></item>\r
-               <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azoren, Kapverdische Inseln]]></item>\r
-               <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>\r
-               <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Bras&iacute;lia, Buenos Aires, Cayenne, Georgetown, Grönland, Montevideo]]></item>\r
-               <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Neufundland]]></item>\r
-               <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Asunci&oacute;n, Atlantik (Kanada), La Paz, Port-of-Spain, Santiago]]></item>\r
-               <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>\r
-               <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Atlanta, Bogot&aacute;, Detroit, Lima, Miami, New York, San Francisco de Quito, Toronto]]></item>\r
-               <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Chicago, Dallas, Kansas City, Mexiko-Stadt, Winnipeg, Zentralamerika]]></item>\r
-               <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Arizona, Calgary, Chihuahua, Denver, Mazatlan, Salt Lake City]]></item>\r
-               <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Los Angeles, Seattle, Tijuana, Vancouver]]></item>\r
-               <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>\r
-               <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) Französisch-Polynesien]]></item>\r
-               <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cookinseln, Hawaii]]></item>\r
-               <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midwayinseln, Samoa]]></item>\r
-               <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Eniwetok, Kwajalein]]></item>\r
-       </category>\r
-       <category name="wcf.page">\r
-               <item name="wcf.page.pageNo"><![CDATA[Seite {#$pageNo}]]></item>\r
-       </category>\r
-       <category name="wcf.user">\r
-               <item name="wcf.user.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>\r
-               <item name="wcf.user.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>\r
-               <item name="wcf.user.email"><![CDATA[E-Mail-Adresse]]></item>\r
-               <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch.]]></item>\r
-               <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>\r
-               <item name="wcf.user.error.email.notUnique"><![CDATA[Diese E-Mail-Adresse ist bereits durch einen anderen Benutzer vergeben.]]></item>\r
-               <item name="wcf.user.error.email.notValid"><![CDATA[Du hast eine ungültige E-Mail-Adresse eingegeben.]]></item>\r
-               <item name="wcf.user.error.password.false"><![CDATA[Dieses Kennwort ist falsch.]]></item>\r
-               <item name="wcf.user.error.username.notFound"><![CDATA[Der Benutzername &raquo;{$username}&laquo; konnte nicht gefunden werden.]]></item>\r
-               <item name="wcf.user.error.username.notUnique"><![CDATA[Dieser Benutzername ist bereits vergeben.]]></item>\r
-               <item name="wcf.user.error.username.notValid"><![CDATA[Du hast einen ungültigen Benutzernamen eingegeben.]]></item>\r
-               <item name="wcf.user.language"><![CDATA[Sprache]]></item>\r
-               <item name="wcf.user.language.description"><![CDATA[Wähle aus, in welcher Sprache die Benutzeroberfläche erscheinen soll!]]></item>\r
-               <item name="wcf.user.logout"><![CDATA[Abmelden]]></item>\r
-               <item name="wcf.user.password"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.user.registrationDate"><![CDATA[Registrierungsdatum]]></item>\r
-               <item name="wcf.user.userID"><![CDATA[Benutzer-ID]]></item>\r
-               <item name="wcf.user.username"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.user.visibleLanguages"><![CDATA[Zeige Inhalte in folgenden Sprachen an]]></item>\r
-               <item name="wcf.user.visibleLanguages.description"><![CDATA[Gib an, in welchen Sprachen erstellte Inhalte angezeigt werden sollen.]]></item>\r
-       </category>\r
-       <category name="wcf.user.option">\r
-               <item name="wcf.user.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>\r
-       </category>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de-informal">
+       <category name="wcf.acp">
+               <item name="wcf.acp"><![CDATA[Administrationsoberfläche]]></item>
+               <item name="wcf.acp.help"><![CDATA[Hilfe]]></item>
+               <item name="wcf.acp.help.complete"><![CDATA[Vollständige Hilfe]]></item>
+               <item name="wcf.acp.help.disable"><![CDATA[Hilfe deaktivieren]]></item>
+               <item name="wcf.acp.help.interactive"><![CDATA[Interaktive Hilfe]]></item>
+               <item name="wcf.acp.packageQuickAccess"><![CDATA[Paket wechseln]]></item>
+               <item name="wcf.acp.search.extended"><![CDATA[Erweiterte Suche ...]]></item>
+               <item name="wcf.acp.sitemap"><![CDATA[Sitemap]]></item>
+       </category>
+       <category name="wcf.acp.cache">
+               <item name="wcf.acp.cache.button.clear"><![CDATA[Cache leeren]]></item>
+               <item name="wcf.acp.cache.clear.success"><![CDATA[Der Cache wurde erfolgreich gelöscht.]]></item>
+               <item name="wcf.acp.cache.clear.sure"><![CDATA[Möchtest du den Cache wirklich komplett leeren?]]></item>
+               <item name="wcf.acp.cache.data"><![CDATA[Eigenschaften]]></item>
+               <item name="wcf.acp.cache.data.files"><![CDATA[Dateien]]></item>
+               <item name="wcf.acp.cache.data.size"><![CDATA[Größe]]></item>
+               <item name="wcf.acp.cache.data.source"><![CDATA[Quelle]]></item>
+               <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>
+               <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.cache.list.mtime"><![CDATA[Letzte Aktualisierung]]></item>
+               <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>
+               <item name="wcf.acp.cache.list.perm"><![CDATA[Zugriffsrechte]]></item>
+               <item name="wcf.acp.cache.list.size"><![CDATA[Größe]]></item>
+       </category>
+       <category name="wcf.acp.cronjob">
+               <item name="wcf.acp.cronjob.active"><![CDATA[Aktiv]]></item>
+               <item name="wcf.acp.cronjob.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>
+               <item name="wcf.acp.cronjob.add.data"><![CDATA[Allgemeine Daten]]></item>
+               <item name="wcf.acp.cronjob.add.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde hinzugefügt.]]></item>
+               <item name="wcf.acp.cronjob.add.timing"><![CDATA[Zeitsteuerung]]></item>
+               <item name="wcf.acp.cronjob.className"><![CDATA[Pfad zur Klasse]]></item>
+               <item name="wcf.acp.cronjob.className.description"><![CDATA[Gib den Pfad zu der PHP-Datei an, die die entsprechende auszuführende Klasse enthält. Die Pfadangabe muss relativ zum Installationsverzeichnis der ausgewählten Endanwendung sein.]]></item>
+               <item name="wcf.acp.cronjob.cronjobID"><![CDATA[ID]]></item>
+               <item name="wcf.acp.cronjob.delete"><![CDATA[Zeitgesteuerte Aufgabe löschen]]></item>
+               <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht gelöscht werden.]]></item>
+               <item name="wcf.acp.cronjob.delete.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde gelöscht.]]></item>
+               <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Bist du sicher, dass du diese zeitgesteuerte Aufgabe löschen möchtest?]]></item>
+               <item name="wcf.acp.cronjob.description"><![CDATA[Beschreibung]]></item>
+               <item name="wcf.acp.cronjob.description.description"><![CDATA[Hier kannst du eine kurze Beschreibung der Aufgabe eintragen.]]></item>
+               <item name="wcf.acp.cronjob.disable"><![CDATA[Deaktivieren]]></item>
+               <item name="wcf.acp.cronjob.edit"><![CDATA[Zeitgesteuerte Aufgabe bearbeiten]]></item>
+               <item name="wcf.acp.cronjob.edit.data"><![CDATA[Allgemeine Daten]]></item>
+               <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht verändert werden.]]></item>
+               <item name="wcf.acp.cronjob.edit.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde erfolgreich geändert.]]></item>
+               <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Zeitsteuerung]]></item>
+               <item name="wcf.acp.cronjob.enable"><![CDATA[Aktivieren]]></item>
+               <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[Der angegebene Pfad ist ungültig.]]></item>
+               <item name="wcf.acp.cronjob.error.empty"><![CDATA[Bitte füll dieses Eingabefeld aus.]]></item>
+               <item name="wcf.acp.cronjob.error.notValid"><![CDATA[Das Zeitformat ist ungültig.]]></item>
+               <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Zeitgesteuerte Aufgabe mehrfach ausführen]]></item>
+               <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[Durch Aktivieren dieser Option wird die Aufgabe mehrfach ausgeführt, wenn zwischen dem letzten Ausführungszeitpunkt und dem aktuellen Zeitpunkt weitere Ausführungszeitpunkte liegen.]]></item>
+               <item name="wcf.acp.cronjob.execute"><![CDATA[Aufgabe jetzt ausführen]]></item>
+               <item name="wcf.acp.cronjob.execute.success"><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt.]]></item>
+               <item name="wcf.acp.cronjob.inactive"><![CDATA[Inaktiv]]></item>
+               <item name="wcf.acp.cronjob.info"><![CDATA[Allgemeine Informationen]]></item>
+               <item name="wcf.acp.cronjob.intro"><![CDATA[Das Anlegen von zeitgesteuerten Aufgaben erfordert eine genaue Kenntnis der Crontab-Syntax auf unixähnlichen Systemen. Weiterführende Informationen dazu erhältst du auf dieser Website: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>]]></item>
+               <item name="wcf.acp.cronjob.lastExec"><![CDATA[Letzte Ausführung]]></item>
+               <item name="wcf.acp.cronjob.list"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+               <item name="wcf.acp.cronjob.list.count"><![CDATA[Insgesamt {#$items} zeitgesteuerte Aufgabe{if $items != 1}n{/if}]]></item>
+               <item name="wcf.acp.cronjob.log"><![CDATA[Protokoll der ausgeführten zeitgesteuerten Aufgaben]]></item>
+               <item name="wcf.acp.cronjob.log.clear"><![CDATA[Alle löschen]]></item>
+               <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Bist du sicher, dass du alle Protokoll-Einträge löschen möchtest?]]></item>
+               <item name="wcf.acp.cronjob.log.data"><![CDATA[Insgesamt {#$items} {if $items == 1}Eintrag{else}Einträge{/if}]]></item>
+               <item name="wcf.acp.cronjob.log.error"><![CDATA[Fehler:]]></item>
+               <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Ausgeführt]]></item>
+               <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[Derzeit sind keine Einträge vorhanden.]]></item>
+               <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>
+               <item name="wcf.acp.cronjob.nextExec"><![CDATA[Nächste Ausführung]]></item>
+               <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[Derzeit ist keine zeitgesteuerte Aufgabe vorhanden.]]></item>
+               <item name="wcf.acp.cronjob.packageName"><![CDATA[Installiert von]]></item>
+               <item name="wcf.acp.cronjob.runNow"><![CDATA[Jetzt ausführen]]></item>
+               <item name="wcf.acp.cronjob.startDom"><![CDATA[Tag des Monats]]></item>
+               <item name="wcf.acp.cronjob.startDom.description"><![CDATA[An diesen Tagen des Monats (1 - 31) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>
+               <item name="wcf.acp.cronjob.startDow"><![CDATA[Tag der Woche]]></item>
+               <item name="wcf.acp.cronjob.startDow.description"><![CDATA[An diesen Tagen der Woche (0 - 6 mit Sonntag = 0 oder mon - sun) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>
+               <item name="wcf.acp.cronjob.startHour"><![CDATA[Stunde]]></item>
+               <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Zu diesen Stunden (0 - 23) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>
+               <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>
+               <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Zu diesen Minuten (0 - 59) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>
+               <item name="wcf.acp.cronjob.startMonth"><![CDATA[Monat]]></item>
+               <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[In diesen Monaten (1 - 12 oder jan - dec) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>
+               <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>
+               <item name="wcf.acp.cronjob.subtitle"><![CDATA[&raquo;Cronjobs&laquo;]]></item>
+       </category>
+       <category name="wcf.acp.group">
+               <item name="wcf.acp.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>
+               <item name="wcf.acp.group.add.permissions"><![CDATA[Zugriffsrechte]]></item>
+               <item name="wcf.acp.group.add.success"><![CDATA[Die Benutzergruppe wurde erfolgreich angelegt.]]></item>
+               <item name="wcf.acp.group.administrators"><![CDATA[Administratoren]]></item>
+               <item name="wcf.acp.group.data"><![CDATA[Allgemeine Daten]]></item>
+               <item name="wcf.acp.group.delete"><![CDATA[Benutzergruppe löschen]]></item>
+               <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}Die Benutzergruppe wurde{else}{#$deletedGroups} Benutzergruppen wurden{/if} erfolgreich gelöscht.]]></item>
+               <item name="wcf.acp.group.delete.sure"><![CDATA[Willst du diese Benutzergruppe wirklich löschen?]]></item>
+               <item name="wcf.acp.group.edit"><![CDATA[Benutzergruppe bearbeiten]]></item>
+               <item name="wcf.acp.group.edit.success"><![CDATA[Deine Änderungen an der Benutzergruppe wurde erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[Du bist selbst Mitglied dieser Benutzergruppe. Änderungen an den Zugriffsrechten dieser Benutzergruppe können womöglich dazu führen, dass du aus der Administrationsoberfläche ausgeschlossen wirst. Bitte sei entsprechend vorsichtig!]]></item>
+               <item name="wcf.acp.group.everyone"><![CDATA[Jeder]]></item>
+               <item name="wcf.acp.group.groupID"><![CDATA[Gruppen-ID]]></item>
+               <item name="wcf.acp.group.groupName"><![CDATA[Name der Benutzergruppe]]></item>
+               <item name="wcf.acp.group.groupName.description"><![CDATA[Gib einen Namen der Gruppe an.]]></item>
+               <item name="wcf.acp.group.guests"><![CDATA[Gäste]]></item>
+               <item name="wcf.acp.group.list"><![CDATA[Benutzergruppen]]></item>
+               <item name="wcf.acp.group.list.data"><![CDATA[Insgesamt {#$items} Benutzergruppen]]></item>
+               <item name="wcf.acp.group.members"><![CDATA[Anzahl Mitglieder]]></item>
+               <item name="wcf.acp.group.moderators"><![CDATA[Moderatoren]]></item>
+               <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Kann Administrationsoberfläche betreten]]></item>
+               <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Mitglieder dieser Benutzergruppe können die Administrationsoberfläche betreten und dort abhängig von den weiteren Zugriffsrechten verschiedene Aktionen durchführen. Diese Option muss aktiviert sein, wenn diesen Benutzern andere administrative Funktionen erlaubt werden sollen.]]></item>
+               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Kann versteckte Profilinformationen sehen]]></item>
+               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Mitglieder dieser Benutzergruppe können die versteckten Informationen in Benutzerprofilen sehen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Kann allgemeine Einstellungen vornehmen]]></item>
+               <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Mitglieder dieser Benutzergruppe können die allgemeinen System-Einstellungen sehen und bearbeiten. Z.B. Forum ein-/ausschalten.]]></item>
+               <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Kann Protokolle abrufen]]></item>
+               <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können die System-Protokolle abrufen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Kann neue zeitgesteuerte Aufgaben anlegen]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue zeitgesteuerte Aufgaben anlegen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben löschen]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben löschen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Kann Protokoll der zeitgesteuerten Aufgaben löschen]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Protokoll der zeitgesteuerten Aufgaben löschen. Bei der Ausführung einer zeitgesteuerten Aufgabe wird festgehalten, ob dieser erfolgreich ausgeführt wurde.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben ändern]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben deaktivieren]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben deaktivieren. Diese werden dann nicht mehr ausgeführt, können später jedoch auch wieder aktiviert werden.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Kann Update-Server bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Update-Server bearbeiten und neue hinzufügen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Kann Pakete installieren]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können zusätzliche Pakete installieren.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Kann Pakete deinstallieren]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete entfernen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Kann Pakete aktualisieren]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete aktualisieren.]]></item>
+               <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Zugängliche Benutzergruppen]]></item>
+               <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Mitglieder dieser Benutzergruppe haben auf diese Gruppen Zugriff. Zusätzlich muss angegeben werden, ob z.B. die Benutzergruppe bearbeitet werden darf.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Kann neue Benutzergruppen erstellen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzergruppen erstellen.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Kann neue Benutzer erstellen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzer erstellen. Ist bei "Zugängliche Benutzergruppen" eine Option aktiviert, kann diese Gruppe beim Erstellen des Benutzers zugewiesen werden.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Kann Benutzergruppen löschen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen löschen.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Kann Benutzer löschen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer löschen.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Kann Benutzergruppen bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Kann E-Mail-Adressen bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Kann Kennwörter bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Kennwort von anderen Benutzern bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Kann Benutzer bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Kann E-Mails an Benutzer senden]]></item>
+               <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern sehen und ihnen E-Mails senden.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Kann Benutzer suchen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer und deren Profile durchsuchen.]]></item>
+               <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrative Rechte]]></item>
+               <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Inhalte]]></item>
+               <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Darstellung]]></item>
+               <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.general"><![CDATA[Allgemeine administrative Rechte]]></item>
+               <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Wartung]]></item>
+               <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System-Funktionen]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Paketverwaltung]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user"><![CDATA[Benutzer-Funktionen]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Gruppenverwaltung]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[Benutzerverwaltung]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderative Rechte]]></item>
+               <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.user"><![CDATA[Allgemeine Rechte]]></item>
+               <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>
+               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Kann deaktivierte Stile benutzen]]></item>
+               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Mitglieder dieser Benutzergruppe können deaktivierte Stile auswählen.]]></item>
+               <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Stil-Verwaltung]]></item>
+               <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.showMembers"><![CDATA[Zeige die Mitglieder dieser Benutzergruppe]]></item>
+               <item name="wcf.acp.group.superModerators"><![CDATA[Super Moderatoren]]></item>
+               <item name="wcf.acp.group.users"><![CDATA[Registrierte Benutzer]]></item>
+       </category>
+       <category name="wcf.acp.login">
+               <item name="wcf.acp.login"><![CDATA[Anmeldung]]></item>
+               <item name="wcf.acp.login.data"><![CDATA[Zugangsdaten]]></item>
+       </category>
+       <category name="wcf.acp.masterPassword">
+               <item name="wcf.acp.masterPassword"><![CDATA[Hauptkennwort]]></item>
+               <item name="wcf.acp.masterPassword.confirm"><![CDATA[Hauptkennwort wiederholen]]></item>
+               <item name="wcf.acp.masterPassword.enter"><![CDATA[Hauptkennwort erforderlich]]></item>
+               <item name="wcf.acp.masterPassword.enter.description"><![CDATA[Die aufgerufene Seite oder Aktion erfordert aus Sicherheitsgründen die Eingabe des Hauptkennwortes. Pro Sitzung ist die Eingabe des Hauptkennwortes nur einmal erforderlich. Falls du das Hauptkennwort vergessen haben solltest, kannst du es zurücksetzen, indem du die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschst.]]></item>
+               <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[Das Hauptkennwort ist nicht korrekt. Falls du das Hauptkennwort vergessen haben solltest, kannst du es zurücksetzen, indem du die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschst.]]></item>
+               <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>
+               <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[Das Kennwort wurde als unsicher erkannt. Das Kennwort sollte mindestens acht Zeichen lang sein, große und kleine lateinische Buchstaben, Zahlen und Sonderzeichen enthalten. Es darf nicht mit den Kennwörtern von anderen Administratoren übereinstimmen.]]></item>
+               <item name="wcf.acp.masterPassword.example"><![CDATA[Vorschlag]]></item>
+               <item name="wcf.acp.masterPassword.example.set"><![CDATA[Vorschlag übernehmen]]></item>
+               <item name="wcf.acp.masterPassword.init"><![CDATA[Hauptkennwort festlegen]]></item>
+               <item name="wcf.acp.masterPassword.init.description"><![CDATA[Das Hauptkennwort ist ein zusätzlicher Schutz für sicherheitskritische Funktionen. Du solltest hier ein möglichst sicheres Kennwort verwenden, dass sich von deinem normalen Administrator-Kennwort unterscheidet, Dritten nicht bekannt ist und auch nicht auf anderen Internetseiten verwendet wird.]]></item>
+       </category>
+       <category name="wcf.acp.menu">
+               <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatisches Update]]></item>
+               <item name="wcf.acp.menu.link.content"><![CDATA[Inhalte]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[Protokoll anzeigen]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[Zeitgesteuerte Aufgaben auflisten]]></item>
+               <item name="wcf.acp.menu.link.display"><![CDATA[Darstellung]]></item>
+               <item name="wcf.acp.menu.link.group"><![CDATA[Benutzergruppen]]></item>
+               <item name="wcf.acp.menu.link.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>
+               <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-Mail an Gruppenmitglieder]]></item>
+               <item name="wcf.acp.menu.link.group.view"><![CDATA[Benutzergruppen auflisten]]></item>
+               <item name="wcf.acp.menu.link.log"><![CDATA[Protokoll]]></item>
+               <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.menu.link.log.session"><![CDATA[Sitzungen]]></item>
+               <item name="wcf.acp.menu.link.maintenance"><![CDATA[Wartung]]></item>
+               <item name="wcf.acp.menu.link.option"><![CDATA[Optionen]]></item>
+               <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Sichern &amp; Wiederherstellen]]></item>
+               <item name="wcf.acp.menu.link.package"><![CDATA[Paketverwaltung]]></item>
+               <item name="wcf.acp.menu.link.package.database"><![CDATA[Pakete suchen]]></item>
+               <item name="wcf.acp.menu.link.package.install"><![CDATA[Paket installieren]]></item>
+               <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Server hinzufügen]]></item>
+               <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server auflisten]]></item>
+               <item name="wcf.acp.menu.link.package.view"><![CDATA[Pakete auflisten]]></item>
+               <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>
+               <item name="wcf.acp.menu.link.user"><![CDATA[Benutzer]]></item>
+               <item name="wcf.acp.menu.link.user.add"><![CDATA[Benutzer hinzufügen]]></item>
+               <item name="wcf.acp.menu.link.user.list"><![CDATA[Benutzer auflisten]]></item>
+               <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-Mail an alle Benutzer]]></item>
+               <item name="wcf.acp.menu.link.user.management"><![CDATA[Benutzer]]></item>
+               <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>
+               <item name="wcf.acp.menu.link.user.search"><![CDATA[Benutzer suchen]]></item>
+       </category>
+       <category name="wcf.acp.option">
+               <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Hostname ausschließen]]></item>
+               <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Gib pro Zeile einen Hostname an, die du von der Seite ausschließen möchtest.]]></item>
+               <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[IP-Adresse ausschließen]]></item>
+               <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Gib pro Zeile eine IP-Adresse an, die du von der Seite ausschließen möchtest.]]></item>
+               <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Browser-Kennung ausschließen]]></item>
+               <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Gib pro Zeile eine Browser-Kennung (User-Agent) an, die du von der Seite ausschließen möchtest.]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache-Server]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Gib hier die Adresse des Memcache-Servers ein! Mehrere Server können zeilenweise angegeben werden.]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Persistente Verbindungen aktivieren]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[Sollen beim Verbinden mit dem Memcache-Server persistente Verbindungen genutzt werden?]]></item>
+               <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache-Methode]]></item>
+               <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>
+               <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Bitte wähle die gewünschte Cache-Methode aus! Beachte, dass einige Methoden spezielle Anforderungen an das Server-System stellen und nicht auf jedem Server zur Verfügung stehen.]]></item>
+               <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[Dateisystem (Standard)]]></item>
+               <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (Experimentell)]]></item>
+               <item name="wcf.acp.option.category.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.cache.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>
+               <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache speichert häufig benötige Daten im Arbeitsspeicher zwischen. Dies kann die Last auf die Datenbank und das Dateisystem drastisch reduzieren. Lies mehr über dieses Thema auf der folgenden Seite:
+<ul>
+       <li><a href="http://memcached.org/">memcached.org</a></li>
+</ul>]]></item>
+               <item name="wcf.acp.option.category.general.date"><![CDATA[Datum &amp; Zeit]]></item>
+               <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>
+               <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>
+               <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>
+               <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy-Server]]></item>
+               <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[Hier kannst du optional Proxy-Server für Verbindungen zu externen Servern konfigurieren.]]></item>
+               <item name="wcf.acp.option.category.general.mail"><![CDATA[E-Mails]]></item>
+               <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.mail.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Versand]]></item>
+               <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.offline"><![CDATA[Wartungsmodus]]></item>
+               <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module"><![CDATA[Module an / aus]]></item>
+               <item name="wcf.acp.option.category.module.content"><![CDATA[Inhalte]]></item>
+               <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.display"><![CDATA[Darstellung]]></item>
+               <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>
+               <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.user"><![CDATA[Benutzer]]></item>
+               <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security"><![CDATA[Sicherheit]]></item>
+               <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>
+               <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internetseiten werden häufig durch andere Programme angegriffen. So gibt es beispielsweise die Möglichkeit, automatisiert hunderte von Benutzerkonten zu erstellen. Um sich davor zu schützen, kannst du an verschiedenen Stellen ein sogenanntes <a href="http://de.wikipedia.org/wiki/Captcha" class="externalURL">Captcha-Bild</a> anzeigen lassen. Unregistrierte Benutzer müssen erst den Code eingeben, der auf diesem Bild steht. Roboter können diesen Code nicht lesen. Beachte, dass Captcha-Bilder von blinden und sehbehinderten Benutzern nicht identifiziert werden können.]]></item>
+               <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>
+               <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.censorship"><![CDATA[Zensur]]></item>
+               <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sitzungen]]></item>
+               <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.user"><![CDATA[Mitglieder]]></item>
+               <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookiedomain]]></item>
+               <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Hier kannst Du optional eine Domain angeben, unter der der Cookie laufen soll. Standardmäßig solltest Du dieses Feld frei lassen, da ein Ausfüllen nur in wenigen Fällen notwendig ist.]]></item>
+               <item name="wcf.acp.option.cookie_path"><![CDATA[Cookiepfad]]></item>
+               <item name="wcf.acp.option.cookie_path.description"><![CDATA[Der Cookiepfad wird absolut zum Document Root angegeben - also z.B. "/forum" für http://www.woltlab.de/forum.]]></item>
+               <item name="wcf.acp.option.cookie_prefix"><![CDATA[Präfix für Cookienamen]]></item>
+               <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Gib einen Präfix an, der bei Cookienamen verwendet wird.]]></item>
+               <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Uhr automatisch auf Sommer-/Winterzeit umstellen]]></item>
+               <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Soll die Uhr automatisch auf Sommer-/Winterzeit umgestellt werden?]]></item>
+               <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Cache-Methode für Sitzungsdaten verwenden]]></item>
+               <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Soll für die Speicherung der Sitzungsdaten die ausgewählte Cache-Methode verwendet werden?]]></item>
+               <item name="wcf.acp.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>
+               <item name="wcf.acp.option.export"><![CDATA[Optionen sichern]]></item>
+               <item name="wcf.acp.option.export.download"><![CDATA[Sicherung der Optionen herunterladen]]></item>
+               <item name="wcf.acp.option.export.download.description"><![CDATA[Lade eine Sicherung der Optionen auf deinen lokalen Rechner herunter.]]></item>
+               <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Gzip-Komprimierung aktivieren]]></item>
+               <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Durch Aktivierung dieser Option werden die Inhalte komprimiert vom Server an den Client gesendet. Dies reduziert den Traffic.]]></item>
+               <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Seitencaching im Client-Browser verhindern]]></item>
+               <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Durch Aktivierung dieser Option kannst du das Caching der Seite im Browser verhindern.]]></item>
+               <item name="wcf.acp.option.http_gzip_level"><![CDATA[Gzip-Komprimierungslevel]]></item>
+               <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[Werte von 1-9 sind zulässig. Als Optimum zwischen Komprimierung und Serverlast empfiehlt sich Level 1.]]></item>
+               <item name="wcf.acp.option.import"><![CDATA[Optionen wiederherstellen]]></item>
+               <item name="wcf.acp.option.import.error.importFailed"><![CDATA[Die Optionen konnten nicht erfolgreich importiert werden.]]></item>
+               <item name="wcf.acp.option.import.success"><![CDATA[Die Optionen wurden erfolgreich importiert.]]></item>
+               <item name="wcf.acp.option.import.upload"><![CDATA[Sicherung der Optionen vom lokalen Computer hochladen]]></item>
+               <item name="wcf.acp.option.import.upload.description"><![CDATA[Gib eine Sicherung der Optionen von Ihrem lokalen Rechner an.]]></item>
+               <item name="wcf.acp.option.importAndExport"><![CDATA[Optionen sichern &amp; wiederherstellen]]></item>
+               <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator-Adresse]]></item>
+               <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Gib die E-Mail-Adresse des Administrators an.]]></item>
+               <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Logfile-Pfad]]></item>
+               <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Gib den Pfad zum Logfile an.]]></item>
+               <item name="wcf.acp.option.mail_from_address"><![CDATA[Absender-Adresse]]></item>
+               <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Gib die Absender-Adresse bei automatisch generierten E-Mails an.]]></item>
+               <item name="wcf.acp.option.mail_from_name"><![CDATA[Absender-Name]]></item>
+               <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Gib den Namen des Absenders bei automatisch generierten E-Mails an.]]></item>
+               <item name="wcf.acp.option.mail_send_method"><![CDATA[Versandmethode]]></item>
+               <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>
+               <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Wähle eine Versandmethode aus.]]></item>
+               <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>
+               <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>
+               <item name="wcf.acp.option.mail_signature"><![CDATA[Signatur]]></item>
+               <item name="wcf.acp.option.mail_signature.description"><![CDATA[Trage hier eine Signatur ein, die bei System-E-Mails angezeigt werden soll.]]></item>
+               <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP-Server]]></item>
+               <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Trage hier den SMTP-Server ein.]]></item>
+               <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP-Kennwort]]></item>
+               <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Gib das SMTP-Kennwort an.]]></item>
+               <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP-Port]]></item>
+               <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Gib den SMTP-Port an.]]></item>
+               <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP-Benutzer]]></item>
+               <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Gib den SMTP-Benutzer an.]]></item>
+               <item name="wcf.acp.option.mail_use_f_param"><![CDATA[&raquo;-f&laquo; Parameter verwenden]]></item>
+               <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Manche Server benötigen den &raquo;-f&laquo; Parameter beim Versenden von E-Mails. Falls du Probleme mit dem Versand von E-Mails hast, aktiviere diese Einstellung.]]></item>
+               <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Formatierte E-Mail-Adressen verwenden]]></item>
+               <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Absender- und Empfänger-Adressen werden in folgendes Format gebracht: &quot;Name &lt;email@domain.tld&gt;&quot;. Diese Funktion wird nicht von allen Mailservern unterstützt und sollte daher bei Problemen abgeschaltet werden.]]></item>
+               <item name="wcf.acp.option.module_master_password"><![CDATA[Hauptkennwort aktivieren]]></item>
+               <item name="wcf.acp.option.module_master_password.description"><![CDATA[Aktiviert die zusätzliche Eingabe eines Kennworts beim Aufruf von sicherheitskritischen Bereichen.]]></item>
+               <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>
+               <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server für HTTP-Verbindungen]]></item>
+               <item name="wcf.acp.option.session_timeout"><![CDATA[Gültigkeitslänge einer Sitzung]]></item>
+               <item name="wcf.acp.option.session_timeout.description"><![CDATA[Gib an, wie lange die Sitzung gültig ist [Sekunden]. ]]></item>
+               <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[IP-Adresse der Sitzung überprüfen]]></item>
+               <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[Anzahl der Blöcke der IP-Adresse die beim Auslesen der Sitzung überprüft werden sollen. Eine hohe Einstellung kann Benutzer ausschließen, die mit wechselnden IP-Adressen im Internet unterwegs sind.]]></item>
+               <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Browser-Kennung der Sitzung überprüfen]]></item>
+               <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Soll die Browser-Kennung beim Auslesen der Sitzung überprüft werden?]]></item>
+               <item name="wcf.acp.option.success"><![CDATA[Deine Einstellungsänderungen wurden erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.option.timezone"><![CDATA[Zeitzone]]></item>
+               <item name="wcf.acp.option.timezone.description"><![CDATA[Wähle die Standard Zeitzone deiner Seite.]]></item>
+               <item name="wcf.acp.option.user_online_timeout"><![CDATA[Timeout für Benutzer-Online]]></item>
+               <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Gib an, wie lange der Benutzer trotz Inaktivität als online markiert werden soll [Sekunden].]]></item>
+               <item name="wcf.acp.option.category.general.page"><![CDATA[Seite]]></item>
+               <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.meta_description"><![CDATA[Meta Description]]></item>
+               <item name="wcf.acp.option.meta_description.description"><![CDATA[Gib eine Meta Description an.]]></item>
+               <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta Keywords]]></item>
+               <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Trage die Wörter ein, die im Meta-Tag Keywords stehen sollen.]]></item>
+               <item name="wcf.acp.option.page_description"><![CDATA[Seitenbeschreibung]]></item>
+               <item name="wcf.acp.option.page_description.description"><![CDATA[Füge hier eine kurze Beschreibung deiner Seite ein.]]></item>
+               <item name="wcf.acp.option.page_title"><![CDATA[Titel der Seite]]></item>
+               <item name="wcf.acp.option.page_title.description"><![CDATA[Gib hier den Globalen Titel der Seite an. Dieser Titel wird im Seitenkopf dargestellt, wenn du die Anzeige dieses Textes im Stileditor aktiviert hast.]]></item>
+               <item name="wcf.acp.option.page_url"><![CDATA[Adresse (URL) der Seite]]></item>
+               <item name="wcf.acp.option.page_url.description"><![CDATA[Gib an, unter welcher Adresse (URL) die Seite aufzurufen ist (ohne abschließenden Slash).]]></item>
+               <item name="wcf.acp.option.page_urls"><![CDATA[Weitere URLs]]></item>
+               <item name="wcf.acp.option.page_urls.description"><![CDATA[Gib hier weitere URLs an, unter denen deine Seite erreichbar ist.]]></item>
+       </category>
+       <category name="wcf.acp.package">
+               <item name="wcf.acp.package.cancel"><![CDATA[Abbruch der Paketinstallation]]></item>
+               <item name="wcf.acp.package.description"><![CDATA[Beschreibung]]></item>
+               <item name="wcf.acp.package.install"><![CDATA[Paketinstallation]]></item>
+               <item name="wcf.acp.package.install.cancel"><![CDATA[Installation abbrechen]]></item>
+               <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Willst du die Installation wirklich abbrechen?]]></item>
+               <item name="wcf.acp.package.install.error"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>
+               <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[Die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} kann aufgrund von Inkompatibilitäten zu {if $excludedPackages|count == 1}folgendem Paket{else}folgenden Paketen{/if} nicht durchgeführt werden:]]></item>
+               <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in Version {$excludedPackage.packageVersion}]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket lässt{else}Folgende Pakete lassen{/if} die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} aufgrund von Inkompatibilitäten nicht zu:]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in Version {$excludingPackage.packageVersion}]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket ist{else}Folgende Pakete sind{/if} mit dem Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} nicht kompatibel. Wenn du die Installation fortführst, {if $excludingPackages|count == 1}wird das Paket{else}werden die Pakete{/if} vermutlich nicht mehr korrekt funktionieren.]]></item>
+               <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}ist bereits installiert{else}{if $package.file|isset}liegt dem Paket bei{else}fehlt{/if}{/if})</span>]]></item>
+               <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Willst du die Paketinstallation wirklich abbrechen?]]></item>
+               <item name="wcf.acp.package.install.updatableInstances"><![CDATA[Folgende Pakete können mit diesem Paket aktualisiert werden]]></item>
+               <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Wähle eines der folgenden Pakete aus, um seine Version zu aktualisieren. Falls du das Paket neu installieren möchtest, klick unten auf &raquo;Weiter&laquo;.]]></item>
+               <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[Es ist bereits eine Kopie dieses Paketes installiert. Wenn du fortfährst, wird eine weitere Kopie dieses Paketes installiert. Falls du eine vorhandene Kopie dieses Paketes aktualisieren möchtest, wähle die Kopie aus der folgenden Liste aus.]]></item>
+               <item name="wcf.acp.package.install.version"><![CDATA[Version des Paketes:]]></item>
+               <item name="wcf.acp.package.installDate"><![CDATA[Installationsdatum]]></item>
+               <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[Beim Versuch die Dateien des Paketes zu entpacken, ist folgender Fehler aufgetreten:]]></item>
+               <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[Folgende Dateien konnten nicht erfolgreich entpackt werden. Bitte überprüfe, ob der entsprechende Zielort beschreibbar ist.]]></item>
+               <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Tabellen Konflikt]]></item>
+               <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Keine Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>
+               <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Alle Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>
+               <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Notwendige Änderungen]]></item>
+               <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Betroffene Tabelle]]></item>
+               <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Vorhandene Tabellen deiner Datenbank stehen im Konflikt mit Tabellen, die für dieses Paket installiert werden müssen. Wähle aus, ob diese Tabellen überschrieben werden sollen.]]></item>
+               <item name="wcf.acp.package.list"><![CDATA[Installierte Pakete]]></item>
+               <item name="wcf.acp.package.list.author"><![CDATA[Hersteller]]></item>
+               <item name="wcf.acp.package.list.count"><![CDATA[Insgesamt sind {#$items} Pakete installiert.]]></item>
+               <item name="wcf.acp.package.list.date"><![CDATA[Herstellungsdatum]]></item>
+               <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>
+               <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>
+               <item name="wcf.acp.package.list.other"><![CDATA[Sonstiges Paket]]></item>
+               <item name="wcf.acp.package.list.plugin"><![CDATA[Zusatzmodul]]></item>
+               <item name="wcf.acp.package.list.standalone"><![CDATA[Endanwendung]]></item>
+               <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>
+               <item name="wcf.acp.package.optionals"><![CDATA[Optionale Zusatzpakete installieren]]></item>
+               <item name="wcf.acp.package.optionals.description"><![CDATA[Das aktuelle Paket bringt folgende optionale Zusatzpakete mit. Wähle aus, welche Zusatzpakete du installieren möchtest.]]></item>
+               <item name="wcf.acp.package.optionals.installed"><![CDATA[ (Dieses Paket ist bereits installiert.)]]></item>
+               <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (Die Voraussetzungen für dieses Paket werden nicht erfüllt.)]]></item>
+               <item name="wcf.acp.package.packageDir"><![CDATA[Installationsverzeichnis]]></item>
+               <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>
+               <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Es ist bereits eine andere Anwendung in dem angegebenen Verzeichnis installiert.]]></item>
+               <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>
+               <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[Das angegebene Verzeichnis ist nicht beschreibbar.]]></item>
+               <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[Das angegebene Verzeichnis wird bereits von WoltLab Community Framework beansprucht. Wähle ein anderes Verzeichnis.]]></item>
+               <item name="wcf.acp.package.packageDir.input"><![CDATA[Gib hier das Installationsverzeichnis an.]]></item>
+               <item name="wcf.acp.package.packageDir.url"><![CDATA[Nach der Installation in das angegebene Installationsverzeichnis ist die Anwendung über folgende Adresse (URL) erreichbar:]]></item>
+               <item name="wcf.acp.package.requirements"><![CDATA[Abhängigkeiten auswählen]]></item>
+               <item name="wcf.acp.package.requirements.description"><![CDATA[Das aktuelle Paket benötigt Pakete, von denen mehrere Instanzen installiert sind. Bitte wähle aus, zu welcher Instanz jeweils eine Abhängigkeit hergestellt werden soll.]]></item>
+               <item name="wcf.acp.package.rollback"><![CDATA[Paketinstallation zurücksetzen]]></item>
+               <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright &copy; {$packageAuthor}]]></item>
+               <item name="wcf.acp.package.startInstall"><![CDATA[Neues Paket installieren]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[Das angegebene Archiv ist kein gültiges Paket.]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[Paket &raquo;{$package->getName()}&laquo; kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>
+               <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[Es konnte keine Datei unter dem angegebenen Pfad gefunden wurden.]]></item>
+               <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert. Das Paket kann nicht mehrfach installiert werden.]]></item>
+               <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[Das Hochladen der ausgewählten Datei ist fehlgeschlagen.]]></item>
+               <item name="wcf.acp.package.startInstall.source"><![CDATA[Quelle auswählen]]></item>
+               <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Direkten Pfad zum Paket angeben]]></item>
+               <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Gib den direkten Pfad zur Paketdatei an. Dabei kann es sich um die Internet Adresse der Paketdatei oder alternativ den Pfad zur Paketdatei im Dateisystem handeln.]]></item>
+               <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Paket vom lokalen Computer hochladen]]></item>
+               <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Gib eine Paketdatei von deinem lokalen Rechner an.]]></item>
+               <item name="wcf.acp.package.startUpdate"><![CDATA[Paket &raquo;{$package->getName()}&laquo; aktualisieren]]></item>
+               <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>
+               <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>
+               <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation abgeschlossen]]></item>
+               <item name="wcf.acp.package.step.install.optionals"><![CDATA[Optionale Pakete werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.package"><![CDATA[Paket wird registriert ...]]></item>
+               <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>
+               <item name="wcf.acp.package.step.install.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+               <item name="wcf.acp.package.step.title"><![CDATA[Paket <b>{$packageName|encodeJS}</b>: ]]></item>
+               <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Dateien werden gelöscht ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Deinstallation abgeschlossen]]></item>
+               <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Optionale Pakete werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+               <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>
+               <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>
+               <item name="wcf.acp.package.step.update.finish"><![CDATA[Paketaktualisierung abgeschlossen]]></item>
+               <item name="wcf.acp.package.step.update.optionals"><![CDATA[Optionale Pakete werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.package"><![CDATA[Paket wird aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>
+               <item name="wcf.acp.package.step.update.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+               <item name="wcf.acp.package.templatePatch.install.failed"><![CDATA[Das Anwenden eines Patches, der zu diesem Paket gehört, ist fehlgeschlagen, da dieser Patch nicht kompatibel zu seiner Zieldatei ist. Das Paket kann deshalb nicht installiert werden. Klick auf &raquo;Installation abbrechen&laquo;.]]></item>
+               <item name="wcf.acp.package.templatePatch.repatch.failed"><![CDATA[Das erneute Patchen folgender Templates scheiterte:<br />{foreach from=$failures item=$failure}{$failure.templateName} (ursprünglich gepatcht von: {$failure.packageName})<br />{/foreach}Wahrscheinlich wird deshalb das Paket, das den jeweiligen Patch ursprünglich angewendet hatte, nicht mehr funktionieren. Du solltest dieses Update dennoch fortsetzen. Klick dazu auf &raquo;Weiter&laquo;.]]></item>
+               <item name="wcf.acp.package.templatePatch.uninstall.failed"><![CDATA[Das Entfernen eines Patches, der zu diesem Paket gehört, ist fehlgeschlagen, da seine Zieldatei anderweitig verändert worden ist. Das Paket kann deshalb nicht entfernt werden. Klick auf &raquo;Abbruch der Paketdeinstallation&laquo;.]]></item>
+               <item name="wcf.acp.package.uninstall"><![CDATA[Paketdeinstallation]]></item>
+               <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Abbruch der Paketdeinstallation]]></item>
+               <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[Die Deinstallation des Paketes ist nicht möglich, da mindestens ein abhängiges Paket nicht deinstalliert werden kann.]]></item>
+               <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Diese{if $dependentPackages|count == 1}s Paket wird{else} Pakete werden{/if}, nach deiner Bestätigung, ohne weitere Sicherheitsabfrage deinstalliert.]]></item>
+               <item name="wcf.acp.package.update"><![CDATA[Paketaktualisierung]]></item>
+               <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>
+               <item name="wcf.acp.package.view.author"><![CDATA[Hersteller:]]></item>
+               <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Zur Administrationsoberfläche wechseln]]></item>
+               <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Paket deinstallieren]]></item>
+               <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Alle Pakete deinstallieren]]></item>
+               <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Willst du dieses Paket wirklich deinstallieren?]]></item>
+               <item name="wcf.acp.package.view.button.update"><![CDATA[Paket aktualisieren]]></item>
+               <item name="wcf.acp.package.view.date"><![CDATA[Herstellungsdatum:]]></item>
+               <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Abhängige Pakete]]></item>
+               <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[Dieses Paket wird von {#$dependentPackages|count} {if $dependentPackages|count == 1}anderen Paket{else}anderen Paketen{/if} benötigt.]]></item>
+               <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}Dieses Paket wird von 1 anderen Paket benötigt{else}{#$dependentPackages|count} Pakete sind direkt oder indirekt von diesem Paket abhängig{/if}.]]></item>
+               <item name="wcf.acp.package.view.dir"><![CDATA[Installationsverzeichnis:]]></item>
+               <item name="wcf.acp.package.view.identifier"><![CDATA[Bezeichner:]]></item>
+               <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installierte Instanz:]]></item>
+               <item name="wcf.acp.package.view.parent"><![CDATA[Übergeordnetes Paket:]]></item>
+               <item name="wcf.acp.package.view.properties"><![CDATA[Eigenschaften]]></item>
+               <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Benötigte Pakete]]></item>
+               <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[Dieses Paket benötigt {#$requiredPackages|count} {if $requiredPackages|count == 1}anderes Paket{else}andere Pakete{/if}.]]></item>
+               <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>
+               <item name="wcf.acp.package.view.version"><![CDATA[Installierte Version:]]></item>
+       </category>
+       <category name="wcf.acp.packageUpdate">
+               <item name="wcf.acp.packageUpdate"><![CDATA[Pakete aktualisieren]]></item>
+               <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentifizierung mit Update-Server]]></item>
+               <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Verbindungs-Daten]]></item>
+               <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Benutzername und Kennwort wurden nicht akzeptiert.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Kennwort]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Gib ein Kennwort an, das zur Authentifizierung benötigt wird.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Benutzername]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Gib einen Benutzernamen an, der zur Authentifizierung benötigt wird.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[Benutzeranmeldung]]></item>
+               <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server-Meldung]]></item>
+               <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server-Name]]></item>
+               <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Benutzerdaten dauerhaft speichern]]></item>
+               <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[Speichert die eingegebenen Benutzerdaten dauerhaft, sodass du die Daten zu einem späteren Zeitpunkt nicht erneut eingeben musst.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Adresse]]></item>
+               <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installierte Version]]></item>
+               <item name="wcf.acp.packageUpdate.error"><![CDATA[Es ist folgender Fehler aufgetreten: ]]></item>
+               <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[Das Herunterladen des Paketes {$package} ist fehlgeschlagen.]]></item>
+               <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[Beim Versuch die Paketliste herunterzuladen, ist ein Fehler aufgetreten.]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[Es {if $excludedPackages|count == 1}ist folgender Konflikt{else}sind folgende Konflikte{/if} aufgetreten:]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[Das installierte Paket &raquo;{$excludedPackage.existingPackageName}&laquo; ist mit dem Paket &raquo;{$excludedPackage.packageName}&laquo; in Version {$excludedPackage.packageVersion} nicht kompatibel.]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[Das Paket &raquo;{$excludedPackage.packageName}&laquo; in Version {$excludedPackage.packageVersion} ist mit dem installierten Paket &raquo;{$excludedPackage.existingPackageName}&laquo; nicht kompatibel.]]></item>
+               <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} wird installiert]]></item>
+               <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[Derzeit sind keine Updates verfügbar.]]></item>
+               <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[Du hast kein Update ausgewählt.]]></item>
+               <item name="wcf.acp.packageUpdate.options"><![CDATA[Optionen]]></item>
+               <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[Das Paket ist bereits installiert und kann kein weiteres Mal installiert werden.]]></item>
+               <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Paket installieren]]></item>
+               <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Weitere Paket-Instanz installieren (Paket ist bereits {#$package.instances} mal installiert)]]></item>
+               <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Installiertes Paket {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} Version {$updatableInstance.packageVersion} aktualisieren]]></item>
+               <item name="wcf.acp.packageUpdate.search"><![CDATA[Pakete suchen]]></item>
+               <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Autor]]></item>
+               <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Suche nach ...]]></item>
+               <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Bereits installierte einzigartige Pakete ausblenden]]></item>
+               <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Paketname]]></item>
+               <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Paketname und -beschreibung durchsuchen]]></item>
+               <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update-Server]]></item>
+               <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Alle Update-Server durchsuchen]]></item>
+               <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Art des Paketes]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Sonstige Pakete]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Zusatzmodul für bereits installierte Pakete]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Endanwendung]]></item>
+               <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Alle Pakete auswählen]]></item>
+               <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} wird aktualisiert auf {$package.toVersion}]]></item>
+               <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[Neue Version]]></item>
+               <item name="wcf.acp.packageUpdate.updates"><![CDATA[Folgende Paket-Aktualisierungen/-Installationen werden durchgeführt:]]></item>
+       </category>
+       <category name="wcf.acp.sessionLog">
+               <item name="wcf.acp.sessionLog.access.view"><![CDATA[Aktionen der protokollierten Sitzung von &raquo;{$sessionLog->username}&laquo;]]></item>
+               <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[Insgesamt {#$items} protokollierte Aktion{if $items != 1}en{/if}]]></item>
+               <item name="wcf.acp.sessionLog.accesses"><![CDATA[Aktionen]]></item>
+               <item name="wcf.acp.sessionLog.className"><![CDATA[Klasse]]></item>
+               <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP-Adresse]]></item>
+               <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Letzte Aktion]]></item>
+               <item name="wcf.acp.sessionLog.packageName"><![CDATA[Paket]]></item>
+               <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Methode]]></item>
+               <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>
+               <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>
+               <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>
+               <item name="wcf.acp.sessionLog.time"><![CDATA[Datum]]></item>
+               <item name="wcf.acp.sessionLog.userAgent"><![CDATA[Browser-Kennung]]></item>
+               <item name="wcf.acp.sessionLog.view"><![CDATA[Protokollierte Sitzungen]]></item>
+               <item name="wcf.acp.sessionLog.view.count"><![CDATA[Insgesamt {#$items} protokollierte Sitzung{if $items != 1}en{/if}]]></item>
+       </category>
+       <category name="wcf.acp.updateServer">
+               <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>
+               <item name="wcf.acp.updateServer.add.success"><![CDATA[Der Server wurde erfolgreich angelegt.]]></item>
+               <item name="wcf.acp.updateServer.data"><![CDATA[Server-Daten]]></item>
+               <item name="wcf.acp.updateServer.delete"><![CDATA[Server löschen]]></item>
+               <item name="wcf.acp.updateServer.delete.success"><![CDATA[Der Server wurde erfolgreich gelöscht.]]></item>
+               <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Willst du den Server wirklich löschen?]]></item>
+               <item name="wcf.acp.updateServer.disable"><![CDATA[Deaktivieren]]></item>
+               <item name="wcf.acp.updateServer.edit"><![CDATA[Server bearbeiten]]></item>
+               <item name="wcf.acp.updateServer.edit.success"><![CDATA[Ihre Änderungen wurden erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.updateServer.enable"><![CDATA[Aktivieren]]></item>
+               <item name="wcf.acp.updateServer.errorText"><![CDATA[Fehlermeldungen]]></item>
+               <item name="wcf.acp.updateServer.htPassword"><![CDATA[Kennwort]]></item>
+               <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Gib ein Kennwort an, das zur Authentifizierung benötigt wird (optional).]]></item>
+               <item name="wcf.acp.updateServer.htUsername"><![CDATA[Benutzername]]></item>
+               <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Gib einen Benutzernamen an, der zur Authentifizierung benötigt wird (optional).]]></item>
+               <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[Beim letzten Verbindungsversuch trat folgende Fehlermeldungen auf:]]></item>
+               <item name="wcf.acp.updateServer.list.available"><![CDATA[Insgesamt {#$items} Server eingetragen]]></item>
+               <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server-ID]]></item>
+               <item name="wcf.acp.updateServer.packages"><![CDATA[Pakete]]></item>
+               <item name="wcf.acp.updateServer.server"><![CDATA[Adresse]]></item>
+               <item name="wcf.acp.updateServer.server.description"><![CDATA[Gib die Adresse (URL) zu einem Paketserver an.]]></item>
+               <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[Die eingetragene Adresse ist ungültig.]]></item>
+               <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>
+               <item name="wcf.acp.updateServer.timestamp"><![CDATA[Letzter Zugriff]]></item>
+               <item name="wcf.acp.updateServer.view"><![CDATA[Verfügbare Update-Server]]></item>
+               <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[Es sind keine Update-Server eingetragen.]]></item>
+       </category>
+       <category name="wcf.acp.user">
+               <item name="wcf.acp.user.add"><![CDATA[Benutzer hinzufügen]]></item>
+               <item name="wcf.acp.user.add.data"><![CDATA[Benutzerdaten]]></item>
+               <item name="wcf.acp.user.add.success"><![CDATA[Der neue Benutzer wurde erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.user.assignToGroup"><![CDATA[Benutzergruppe zuweisen]]></item>
+               <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Folgende Benutzer den unten ausgewählten Benutzergruppen zuweisen]]></item>
+               <item name="wcf.acp.user.assignToGroup.success"><![CDATA[Die Zuweisung wurde erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.user.button.assignGroup"><![CDATA[Benutzergruppe zuweisen]]></item>
+               <item name="wcf.acp.user.button.exportMail"><![CDATA[E-Mail-Adressen exportieren]]></item>
+               <item name="wcf.acp.user.button.sendMail"><![CDATA[E-Mail senden]]></item>
+               <item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>
+               <item name="wcf.acp.user.delete.error"><![CDATA[Es konnte kein Benutzer gelöscht werden.]]></item>
+               <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}Der Benutzer wurde{else}{#$deletedUsers} Benutzer wurden{/if} erfolgreich gelöscht.]]></item>
+               <item name="wcf.acp.user.delete.sure"><![CDATA[Willst du diesen Benutzer wirklich löschen?]]></item>
+               <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Willst du die markierten Benutzer wirklich löschen?]]></item>
+               <item name="wcf.acp.user.edit"><![CDATA[Benutzer bearbeiten]]></item>
+               <item name="wcf.acp.user.edit.success"><![CDATA[Die Änderungen an diesem Benutzer wurden erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[Du bearbeitest dein eigenes Benutzerkonto. Änderungen an den Mitgliedschaften in Benutzergruppen können womöglich dazu führen, dass du aus der Administrationsoberfläche ausgeschlossen wirst. Sei bitte entsprechend vorsichtig!]]></item>
+               <item name="wcf.acp.user.exportEmailAddress"><![CDATA[E-Mail-Adressen exportieren]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Exportformat]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Exporteinstellungen]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[E-Mail-Adressen von folgenden Benutzern exportieren]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Trennzeichen]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Texttrenner]]></item>
+               <item name="wcf.acp.user.groups"><![CDATA[Benutzergruppe(n)]]></item>
+               <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Finde Benutzer, die in den ausgewählten Benutzergruppen nicht Mitglied sind.]]></item>
+               <item name="wcf.acp.user.list"><![CDATA[Benutzer]]></item>
+               <item name="wcf.acp.user.list.all"><![CDATA[Alle Benutzer]]></item>
+               <item name="wcf.acp.user.list.count"><![CDATA[Insgesamt {#$items} Benutzer]]></item>
+               <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "Einen Benutzer markiert" : this.count+" Benutzer markiert"]]></item>
+               <item name="wcf.acp.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>
+               <item name="wcf.acp.user.massProcessing.action"><![CDATA[Aktion]]></item>
+               <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Bedingungen]]></item>
+               <item name="wcf.acp.user.massProcessing.success"><![CDATA[Die gewählte Aktion wurde erfolgreich auf {#$affectedUsers} Benutzer ausgeführt.]]></item>
+               <item name="wcf.acp.user.massProcessing.warning"><![CDATA[Die Massenverarbeitung von Benutzern führt die unten ausgewählte Aktion <b>ohne zusätzliche Sicherheitsabfrage</b> auf alle Benutzer aus, die unter die eingestellten Bedingungen fallen. Die Bearbeitungen können unter Umständen sehr rechenintensiv werden und sollten deshalb möglichst nur dann ausgeführt werden, wenn sich die Seite im Wartungsmodus befindet! Die Veränderungen können nicht rückgängig gemacht werden. Bitte benutze diese Funktion mit der nötigen Vorsicht!]]></item>
+               <item name="wcf.acp.user.search"><![CDATA[Benutzer suchen]]></item>
+               <item name="wcf.acp.user.search.conditions"><![CDATA[Kriterien der Suche]]></item>
+               <item name="wcf.acp.user.search.conditions.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profil]]></item>
+               <item name="wcf.acp.user.search.display"><![CDATA[Darstellung]]></item>
+               <item name="wcf.acp.user.search.display.columns"><![CDATA[Angezeigte Informationen]]></item>
+               <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Sonstiges]]></item>
+               <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profil]]></item>
+               <item name="wcf.acp.user.search.display.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Benutzer pro Seite]]></item>
+               <item name="wcf.acp.user.search.display.sort"><![CDATA[Sortierung]]></item>
+               <item name="wcf.acp.user.search.error.noMatches"><![CDATA[Zu den angegebenen Kriterien wurde kein Benutzer gefunden.]]></item>
+               <item name="wcf.acp.user.search.matches"><![CDATA[{if $items == 1}Ein Ergebnis{else}{#$items} Ergebnisse{/if}]]></item>
+               <item name="wcf.acp.user.search.withinResults"><![CDATA[In den Ergebnissen suchen]]></item>
+               <item name="wcf.acp.user.sendMail"><![CDATA[E-Mail an Benutzer senden]]></item>
+               <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail an alle Benutzer]]></item>
+               <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[E-Mail als HTML verschicken]]></item>
+               <item name="wcf.acp.user.sendMail.from"><![CDATA[Absender]]></item>
+               <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Hier kannst du die E-Mail-Adresse des Absenders definieren.{if MAIL_USE_FORMATTED_ADDRESS} Es ist auch folgendes Format möglich:{/if}</p>
+{if MAIL_USE_FORMATTED_ADDRESS}<p style="text-align: center; line-height: 2em;"><code>Absender Name &lt;email@absender.tld&gt;</code></p>{/if}
+<p>Wenn du unter System -> Optionen -> E-Mail alles ausgefüllt hast, wird dieses Feld automatisch ausgefüllt. Solltest du E-Mails per SMTP senden, so achte darauf, dass die E-Mail-Adresse des Absenders auch vom Server akzeptiert werden muss.</p>]]></item>
+               <item name="wcf.acp.user.sendMail.group"><![CDATA[E-Mail an Gruppenmitglieder]]></item>
+               <item name="wcf.acp.user.sendMail.groups"><![CDATA[E-Mail an die Mitglieder folgender Benutzergruppen senden]]></item>
+               <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-Mail]]></item>
+               <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[E-Mail an folgende Benutzer senden]]></item>
+               <item name="wcf.acp.user.sendMail.subject"><![CDATA[Betreff]]></item>
+               <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Gib hier die Betreffzeile der E-Mail an.]]></item>
+               <item name="wcf.acp.user.sendMail.text"><![CDATA[Nachricht]]></item>
+               <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Trage hier die Nachricht ein, die du den Benutzern senden möchtest.]]></item>
+               <item name="wcf.acp.user.userNote"><![CDATA[Angemeldet als {$this->user->username}.]]></item>
+       </category>
+       <category name="wcf.acp.worker">
+               <item name="wcf.acp.worker.currentStep"><![CDATA[Aktueller Schritt]]></item>
+               <item name="wcf.acp.worker.description"><![CDATA[Lass dieses Browser-Fenster offen, bis der Prozess abgeschlossen ist und melde dich auf keinen Fall in einem anderen Browser-Fenster separat in der Administrationsoberfläche an, da dies den Prozess behindern könnte.]]></item>
+               <item name="wcf.acp.worker.progress.finish"><![CDATA[Vorgang erfolgreich abgeschlossen]]></item>
+               <item name="wcf.acp.worker.progress.working"><![CDATA[Vorgang läuft ...]]></item>
+               <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>
+               <item name="wcf.acp.worker.title"><![CDATA[Prozess läuft ...]]></item>
+       </category>
+       <category name="wcf.global">
+               <item name="wcf.global.button.back"><![CDATA[&laquo; Zurück]]></item>
+               <item name="wcf.global.button.close"><![CDATA[Schließen]]></item>
+               <item name="wcf.global.button.collapse"><![CDATA[Zuklappen]]></item>
+               <item name="wcf.global.button.collapsible"><![CDATA[Auf- und Zuklappen]]></item>
+               <item name="wcf.global.button.delete"><![CDATA[Löschen]]></item>
+               <item name="wcf.global.button.delete.confirm"><![CDATA[Möchtest du das Element wirklich löschen?]]></item>
+               <item name="wcf.global.button.deleteCompletely"><![CDATA[Endgültig löschen]]></item>
+               <item name="wcf.global.button.edit"><![CDATA[Bearbeiten]]></item>
+               <item name="wcf.global.button.editor.jump"><![CDATA[Zum Editor wechseln]]></item>
+               <item name="wcf.global.button.expand"><![CDATA[Aufklappen]]></item>
+               <item name="wcf.global.button.mark"><![CDATA[Markieren]]></item>
+               <item name="wcf.global.button.next"><![CDATA[Weiter &raquo;]]></item>
+               <item name="wcf.global.button.preview"><![CDATA[Vorschau]]></item>
+               <item name="wcf.global.button.reset"><![CDATA[Zurücksetzen]]></item>
+               <item name="wcf.global.button.submit"><![CDATA[Absenden]]></item>
+               <item name="wcf.global.button.unmark"><![CDATA[Demarkieren]]></item>
+               <item name="wcf.global.date.day"><![CDATA[Tag]]></item>
+               <item name="wcf.global.date.days"><![CDATA[Tage]]></item>
+               <item name="wcf.global.date.hour"><![CDATA[Stunde]]></item>
+               <item name="wcf.global.date.hours"><![CDATA[Stunden]]></item>
+               <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>
+               <item name="wcf.global.date.minutes"><![CDATA[Minuten]]></item>
+               <item name="wcf.global.date.month"><![CDATA[Monat]]></item>
+               <item name="wcf.global.date.months"><![CDATA[Monate]]></item>
+               <item name="wcf.global.date.second"><![CDATA[Sekunde]]></item>
+               <item name="wcf.global.date.seconds"><![CDATA[Sekunden]]></item>
+               <item name="wcf.global.date.week"><![CDATA[Woche]]></item>
+               <item name="wcf.global.date.weeks"><![CDATA[Wochen]]></item>
+               <item name="wcf.global.date.year"><![CDATA[Jahr]]></item>
+               <item name="wcf.global.date.year.notRequired"><![CDATA[Die Angabe des Jahres ist optional.]]></item>
+               <item name="wcf.global.date.years"><![CDATA[Jahre]]></item>
+               <item name="wcf.global.dateFormat"><![CDATA[%d.%m.%Y]]></item>
+               <item name="wcf.global.dateFormatLocalized"><![CDATA[%e. %B %Y]]></item>
+               <item name="wcf.global.dateFormatToday"><![CDATA[<b>Heute</b>, %H:%M]]></item>
+               <item name="wcf.global.dateFormatYesterday"><![CDATA[Gestern, %H:%M]]></item>
+               <item name="wcf.global.dateInputOrder"><![CDATA[day-month-year]]></item>
+               <item name="wcf.global.dateMethod"><![CDATA[strftime]]></item>
+               <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>
+               <item name="wcf.global.defaultValue"><![CDATA[Standard]]></item>
+               <item name="wcf.global.error.backward"><![CDATA[Zurück zur vorherigen Seite]]></item>
+               <item name="wcf.global.error.empty"><![CDATA[Füll dieses Eingabefeld aus.]]></item>
+               <item name="wcf.global.error.file.notFound"><![CDATA[Die Datei konnte nicht gefunden werden.]]></item>
+               <item name="wcf.global.error.illegalLink"><![CDATA[Du hast einen ungültigen oder nicht mehr gültigen Link aufgerufen.]]></item>
+               <item name="wcf.global.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist dir leider verwehrt. Du besitzt nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>
+               <item name="wcf.global.error.permissionDenied.title"><![CDATA[Zutritt verwehrt]]></item>
+               <item name="wcf.global.error.title"><![CDATA[Fehlermeldung]]></item>
+               <item name="wcf.global.form.error"><![CDATA[Deine Angaben sind ungültig. Überprüfe die markierten Eingabefelder.]]></item>
+               <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>
+               <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>
+               <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>
+               <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>
+               <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>
+               <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede &raquo;Du&laquo;)]]></item>
+               <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>
+               <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>
+               <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>
+               <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>
+               <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>
+               <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>
+               <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>
+               <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>
+               <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>
+               <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>
+               <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>
+               <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>
+               <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>
+               <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>
+               <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>
+               <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>
+               <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>
+               <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>
+               <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>
+               <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>
+               <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>
+               <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>
+               <item name="wcf.global.language.th"><![CDATA[Thailändisch]]></item>
+               <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>
+               <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>
+               <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>
+               <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>
+               <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>
+               <item name="wcf.global.multiSelect"><![CDATA[Mehrfache Markierungen sind durch zusätzliches Drücken der Taste &raquo;Strg/Ctrl&laquo; (Windows) oder &raquo;Befehl/Command&laquo; (Mac OS) möglich.]]></item>
+               <item name="wcf.global.page.input"><![CDATA[Zu folgender Seite springen]]></item>
+               <item name="wcf.global.page.next"><![CDATA[nächste Seite]]></item>
+               <item name="wcf.global.page.previous"><![CDATA[vorherige Seite]]></item>
+               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>
+               <item name="wcf.global.pageTitle"><![CDATA[WoltLab&reg; Community Framework&trade;]]></item>
+               <item name="wcf.global.redirect.title"><![CDATA[Weiterleitung]]></item>
+               <item name="wcf.global.redirect.url"><![CDATA[Falls die automatische Weiterleitung nicht funktioniert, klick hier!]]></item>
+               <item name="wcf.global.scrollDown"><![CDATA[Zum Seitenende]]></item>
+               <item name="wcf.global.scrollUp"><![CDATA[Zum Seitenanfang]]></item>
+               <item name="wcf.global.search.matchesExactly"><![CDATA[Exakter Treffer]]></item>
+               <item name="wcf.global.shortTimeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>
+               <item name="wcf.global.shortTimeFormatLocalized"><![CDATA[%e. %B %Y, %H:%M]]></item>
+               <item name="wcf.global.skipToContent"><![CDATA[Zum Seiteninhalt springen]]></item>
+               <item name="wcf.global.sortOrder.ascending"><![CDATA[in aufsteigender Reihenfolge]]></item>
+               <item name="wcf.global.sortOrder.descending"><![CDATA[in absteigender Reihenfolge]]></item>
+               <item name="wcf.global.thousandsSeparator"><![CDATA[&nbsp;]]></item>
+               <item name="wcf.global.timeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>
+               <item name="wcf.global.timeFormatLocalized"><![CDATA[%A, %e. %B %Y, %H:%M]]></item>
+       </category>
+       <category name="wcf.imageViewer">
+               <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Bild " + (this.currentIndex + 1) + " von " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>
+               <item name="wcf.imageViewer.close"><![CDATA[Schließen]]></item>
+               <item name="wcf.imageViewer.enlarge"><![CDATA[Nur dieses Bild anzeigen (beendet die Bildbetrachtung)]]></item>
+               <item name="wcf.imageViewer.next"><![CDATA[Nächstes Bild]]></item>
+               <item name="wcf.imageViewer.pause"><![CDATA[Diashow stoppen]]></item>
+               <item name="wcf.imageViewer.play"><![CDATA[Diashow starten (Bildwechsel alle 5 Sekunden)]]></item>
+               <item name="wcf.imageViewer.previous"><![CDATA[Vorheriges Bild]]></item>
+       </category>
+       <category name="wcf.option">
+               <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Kanarische Inseln, Lissabon, London, Monrovia, Ouagadougou, Reykjav&iacute;k]]></item>
+               <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brüssel, Kopenhagen, Madrid, Paris, Prag, Rom, Sarajevo, Stockholm, Tunis, Warschau, Wien]]></item>
+               <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athen, Beirut, Bukarest, Helsinki, Istanbul, Jerusalem, Kairo, Kapstadt, Khartum, Kiew, Minsk, Sofia]]></item>
+               <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Abeba, Antananarivo, Bagdad, Daressalam, Kampala, Kuwait, Mogadischu, Moskau, Nairobi, Riad]]></item>
+               <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Teheran]]></item>
+               <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Eriwan, Maskat, R&eacute;union, Tiflis]]></item>
+               <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>
+               <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Asgabat, Bischkek, Duschanbe, Islamabad, Jekaterinburg, Karatschi, Malediven, Taschkent]]></item>
+               <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, Neu-Delhi]]></item>
+               <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>
+               <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Nowosibirsk]]></item>
+               <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Kokosinseln, Rangun]]></item>
+               <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnojarsk, Vientiane]]></item>
+               <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hongkong, Irkutsk, Kuala Lumpur, Manila, Peking, Perth, Singapur, Taipeh, Ulan Bator]]></item>
+               <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Australien)]]></item>
+               <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Jakutsk, Osaka, Pjöngjang, Sapporo, Seoul, Tokyo]]></item>
+               <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>
+               <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Wladiwostok]]></item>
+               <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord-Howe-Insel (Australien)]]></item>
+               <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, Neukaledonien, Salomonen]]></item>
+               <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolkinsel]]></item>
+               <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, Bairiki, Fidschi, Kamtschatka, Marshall-Inseln, Wellington]]></item>
+               <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham-Inseln (Neuseeland)]]></item>
+               <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenixinseln]]></item>
+               <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Linieninseln, Weihnachtsinsel]]></item>
+               <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azoren, Kapverdische Inseln]]></item>
+               <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>
+               <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Bras&iacute;lia, Buenos Aires, Cayenne, Georgetown, Grönland, Montevideo]]></item>
+               <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Neufundland]]></item>
+               <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Asunci&oacute;n, Atlantik (Kanada), La Paz, Port-of-Spain, Santiago]]></item>
+               <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>
+               <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Atlanta, Bogot&aacute;, Detroit, Lima, Miami, New York, San Francisco de Quito, Toronto]]></item>
+               <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Chicago, Dallas, Kansas City, Mexiko-Stadt, Winnipeg, Zentralamerika]]></item>
+               <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Arizona, Calgary, Chihuahua, Denver, Mazatlan, Salt Lake City]]></item>
+               <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Los Angeles, Seattle, Tijuana, Vancouver]]></item>
+               <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>
+               <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) Französisch-Polynesien]]></item>
+               <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cookinseln, Hawaii]]></item>
+               <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midwayinseln, Samoa]]></item>
+               <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Eniwetok, Kwajalein]]></item>
+       </category>
+       <category name="wcf.page">
+               <item name="wcf.page.pageNo"><![CDATA[Seite {#$pageNo}]]></item>
+       </category>
+       <category name="wcf.user">
+               <item name="wcf.user.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>
+               <item name="wcf.user.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>
+               <item name="wcf.user.email"><![CDATA[E-Mail-Adresse]]></item>
+               <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch.]]></item>
+               <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>
+               <item name="wcf.user.error.email.notUnique"><![CDATA[Diese E-Mail-Adresse ist bereits durch einen anderen Benutzer vergeben.]]></item>
+               <item name="wcf.user.error.email.notValid"><![CDATA[Du hast eine ungültige E-Mail-Adresse eingegeben.]]></item>
+               <item name="wcf.user.error.password.false"><![CDATA[Dieses Kennwort ist falsch.]]></item>
+               <item name="wcf.user.error.username.notFound"><![CDATA[Der Benutzername &raquo;{$username}&laquo; konnte nicht gefunden werden.]]></item>
+               <item name="wcf.user.error.username.notUnique"><![CDATA[Dieser Benutzername ist bereits vergeben.]]></item>
+               <item name="wcf.user.error.username.notValid"><![CDATA[Du hast einen ungültigen Benutzernamen eingegeben.]]></item>
+               <item name="wcf.user.language"><![CDATA[Sprache]]></item>
+               <item name="wcf.user.language.description"><![CDATA[Wähle aus, in welcher Sprache die Benutzeroberfläche erscheinen soll!]]></item>
+               <item name="wcf.user.logout"><![CDATA[Abmelden]]></item>
+               <item name="wcf.user.password"><![CDATA[Kennwort]]></item>
+               <item name="wcf.user.registrationDate"><![CDATA[Registrierungsdatum]]></item>
+               <item name="wcf.user.userID"><![CDATA[Benutzer-ID]]></item>
+               <item name="wcf.user.username"><![CDATA[Benutzername]]></item>
+               <item name="wcf.user.visibleLanguages"><![CDATA[Zeige Inhalte in folgenden Sprachen an]]></item>
+               <item name="wcf.user.visibleLanguages.description"><![CDATA[Gib an, in welchen Sprachen erstellte Inhalte angezeigt werden sollen.]]></item>
+       </category>
+       <category name="wcf.user.option">
+               <item name="wcf.user.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>
+       </category>
 </language>
\ No newline at end of file
index 08bd3fda0f46b2456a4b2d6b82f9a56aff733789..7ca91c1b857eb679c67ac18c9002660abda1d33e 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de">\r
-       <category name="wcf.acp">\r
-               <item name="wcf.acp"><![CDATA[Administrationsoberfläche]]></item>\r
-               <item name="wcf.acp.help"><![CDATA[Hilfe]]></item>\r
-               <item name="wcf.acp.help.complete"><![CDATA[Vollständige Hilfe]]></item>\r
-               <item name="wcf.acp.help.disable"><![CDATA[Hilfe deaktivieren]]></item>\r
-               <item name="wcf.acp.help.interactive"><![CDATA[Interaktive Hilfe]]></item>\r
-               <item name="wcf.acp.packageQuickAccess"><![CDATA[Paket wechseln]]></item>\r
-               <item name="wcf.acp.search.extended"><![CDATA[Erweiterte Suche ...]]></item>\r
-               <item name="wcf.acp.sitemap"><![CDATA[Sitemap]]></item>\r
-       </category>\r
-       <category name="wcf.acp.cache">\r
-               <item name="wcf.acp.cache.button.clear"><![CDATA[Cache leeren]]></item>\r
-               <item name="wcf.acp.cache.clear.success"><![CDATA[Der Cache wurde erfolgreich gelöscht.]]></item>\r
-               <item name="wcf.acp.cache.clear.sure"><![CDATA[Wollen Sie den Cache wirklich komplett leeren?]]></item>\r
-               <item name="wcf.acp.cache.data"><![CDATA[Eigenschaften]]></item>\r
-               <item name="wcf.acp.cache.data.files"><![CDATA[Dateien]]></item>\r
-               <item name="wcf.acp.cache.data.size"><![CDATA[Größe]]></item>\r
-               <item name="wcf.acp.cache.data.source"><![CDATA[Quelle]]></item>\r
-               <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>\r
-               <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.cache.list.mtime"><![CDATA[Letzte Aktualisierung]]></item>\r
-               <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>\r
-               <item name="wcf.acp.cache.list.perm"><![CDATA[Zugriffsrechte]]></item>\r
-               <item name="wcf.acp.cache.list.size"><![CDATA[Größe]]></item>\r
-       </category>\r
-       <category name="wcf.acp.cronjob">\r
-               <item name="wcf.acp.cronjob.active"><![CDATA[Aktiv]]></item>\r
-               <item name="wcf.acp.cronjob.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>\r
-               <item name="wcf.acp.cronjob.add.data"><![CDATA[Allgemeine Daten]]></item>\r
-               <item name="wcf.acp.cronjob.add.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde hinzugefügt.]]></item>\r
-               <item name="wcf.acp.cronjob.add.timing"><![CDATA[Zeitsteuerung]]></item>\r
-               <item name="wcf.acp.cronjob.className"><![CDATA[Pfad zur Klasse]]></item>\r
-               <item name="wcf.acp.cronjob.className.description"><![CDATA[Geben Sie den Pfad zu der PHP-Datei an, die die entsprechende auszuführende Klasse enthält. Die Pfadangabe muss relativ zum Installationsverzeichnis der ausgewählten Endanwendung sein.]]></item>\r
-               <item name="wcf.acp.cronjob.cronjobID"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.cronjob.delete"><![CDATA[Zeitgesteuerte Aufgabe löschen]]></item>\r
-               <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht gelöscht werden.]]></item>\r
-               <item name="wcf.acp.cronjob.delete.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde gelöscht.]]></item>\r
-               <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Sind Sie sicher, dass Sie diese zeitgesteuerte Aufgabe löschen möchten?]]></item>\r
-               <item name="wcf.acp.cronjob.description"><![CDATA[Beschreibung]]></item>\r
-               <item name="wcf.acp.cronjob.description.description"><![CDATA[Hier können Sie eine kurze Beschreibung der Aufgabe eintragen.]]></item>\r
-               <item name="wcf.acp.cronjob.disable"><![CDATA[Deaktivieren]]></item>\r
-               <item name="wcf.acp.cronjob.edit"><![CDATA[Zeitgesteuerte Aufgabe bearbeiten]]></item>\r
-               <item name="wcf.acp.cronjob.edit.data"><![CDATA[Allgemeine Daten]]></item>\r
-               <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht verändert werden.]]></item>\r
-               <item name="wcf.acp.cronjob.edit.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde erfolgreich geändert.]]></item>\r
-               <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Zeitsteuerung]]></item>\r
-               <item name="wcf.acp.cronjob.enable"><![CDATA[Aktivieren]]></item>\r
-               <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[Der angegebene Pfad ist ungültig.]]></item>\r
-               <item name="wcf.acp.cronjob.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>\r
-               <item name="wcf.acp.cronjob.error.notValid"><![CDATA[Das Zeitformat ist ungültig.]]></item>\r
-               <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Zeitgesteuerte Aufgabe mehrfach ausführen]]></item>\r
-               <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[Durch Aktivieren dieser Option wird die Aufgabe mehrfach ausgeführt, wenn zwischen dem letzten Ausführungszeitpunkt und dem aktuellen Zeitpunkt weitere Ausführungszeitpunkte liegen.]]></item>\r
-               <item name="wcf.acp.cronjob.execute"><![CDATA[Aufgabe jetzt ausführen]]></item>\r
-               <item name="wcf.acp.cronjob.execute.success"><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt.]]></item>\r
-               <item name="wcf.acp.cronjob.inactive"><![CDATA[Inaktiv]]></item>\r
-               <item name="wcf.acp.cronjob.info"><![CDATA[Allgemeine Informationen]]></item>\r
-               <item name="wcf.acp.cronjob.intro"><![CDATA[Das Anlegen von zeitgesteuerten Aufgaben erfordert eine genaue Kenntnis der Crontab-Syntax auf unixähnlichen Systemen. Weiterführende Informationen dazu erhalten Sie auf dieser Website: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>]]></item>\r
-               <item name="wcf.acp.cronjob.lastExec"><![CDATA[Letzte Ausführung]]></item>\r
-               <item name="wcf.acp.cronjob.list"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
-               <item name="wcf.acp.cronjob.list.count"><![CDATA[Insgesamt {#$items} zeitgesteuerte Aufgabe{if $items != 1}n{/if}]]></item>\r
-               <item name="wcf.acp.cronjob.log"><![CDATA[Protokoll der ausgeführten zeitgesteuerten Aufgaben]]></item>\r
-               <item name="wcf.acp.cronjob.log.clear"><![CDATA[Alle löschen]]></item>\r
-               <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Sind Sie sicher, dass Sie alle Protokoll-Einträge löschen möchten?]]></item>\r
-               <item name="wcf.acp.cronjob.log.data"><![CDATA[Insgesamt {#$items} {if $items == 1}Eintrag{else}Einträge{/if}]]></item>\r
-               <item name="wcf.acp.cronjob.log.error"><![CDATA[Fehler:]]></item>\r
-               <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Ausgeführt]]></item>\r
-               <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[Derzeit sind keine Einträge vorhanden.]]></item>\r
-               <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>\r
-               <item name="wcf.acp.cronjob.nextExec"><![CDATA[Nächste Ausführung]]></item>\r
-               <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[Derzeit ist keine zeitgesteuerte Aufgabe vorhanden.]]></item>\r
-               <item name="wcf.acp.cronjob.packageName"><![CDATA[Installiert von]]></item>\r
-               <item name="wcf.acp.cronjob.runNow"><![CDATA[Jetzt ausführen]]></item>\r
-               <item name="wcf.acp.cronjob.startDom"><![CDATA[Tag des Monats]]></item>\r
-               <item name="wcf.acp.cronjob.startDom.description"><![CDATA[An diesen Tagen des Monats (1 - 31) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>\r
-               <item name="wcf.acp.cronjob.startDow"><![CDATA[Tag der Woche]]></item>\r
-               <item name="wcf.acp.cronjob.startDow.description"><![CDATA[An diesen Tagen der Woche (0 - 6 mit Sonntag = 0 oder mon - sun) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>\r
-               <item name="wcf.acp.cronjob.startHour"><![CDATA[Stunde]]></item>\r
-               <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Zu diesen Stunden (0 - 23) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>\r
-               <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>\r
-               <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Zu diesen Minuten (0 - 59) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>\r
-               <item name="wcf.acp.cronjob.startMonth"><![CDATA[Monat]]></item>\r
-               <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[In diesen Monaten (1 - 12 oder jan - dec) soll die Aufgabe ausgeführt werden.]]></item>\r
-               <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>\r
-               <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>\r
-               <item name="wcf.acp.cronjob.subtitle"><![CDATA[&raquo;Cronjobs&laquo;]]></item>\r
-       </category>\r
-       <category name="wcf.acp.group">\r
-               <item name="wcf.acp.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>\r
-               <item name="wcf.acp.group.add.permissions"><![CDATA[Zugriffsrechte]]></item>\r
-               <item name="wcf.acp.group.add.success"><![CDATA[Die Benutzergruppe wurde erfolgreich angelegt.]]></item>\r
-               <item name="wcf.acp.group.administrators"><![CDATA[Administratoren]]></item>\r
-               <item name="wcf.acp.group.data"><![CDATA[Allgemeine Daten]]></item>\r
-               <item name="wcf.acp.group.delete"><![CDATA[Benutzergruppe löschen]]></item>\r
-               <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}Die Benutzergruppe wurde{else}{#$deletedGroups} Benutzergruppen wurden{/if} erfolgreich gelöscht.]]></item>\r
-               <item name="wcf.acp.group.delete.sure"><![CDATA[Wollen Sie diese Benutzergruppe wirklich löschen?]]></item>\r
-               <item name="wcf.acp.group.edit"><![CDATA[Benutzergruppe bearbeiten]]></item>\r
-               <item name="wcf.acp.group.edit.success"><![CDATA[Ihre Änderungen an der Benutzergruppe wurde erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[Sie sind selbst Mitglied dieser Benutzergruppe. Änderungen an den Zugriffsrechten dieser Benutzergruppe können womöglich dazu führen, dass Sie aus der Administrationsoberfläche ausgeschlossen werden. Bitte seien Sie entsprechend vorsichtig!]]></item>\r
-               <item name="wcf.acp.group.everyone"><![CDATA[Jeder]]></item>\r
-               <item name="wcf.acp.group.groupID"><![CDATA[Gruppen-ID]]></item>\r
-               <item name="wcf.acp.group.groupName"><![CDATA[Name der Benutzergruppe]]></item>\r
-               <item name="wcf.acp.group.groupName.description"><![CDATA[Geben Sie einen Namen für die Gruppe an.]]></item>\r
-               <item name="wcf.acp.group.guests"><![CDATA[Gäste]]></item>\r
-               <item name="wcf.acp.group.list"><![CDATA[Benutzergruppen]]></item>\r
-               <item name="wcf.acp.group.list.data"><![CDATA[Insgesamt {#$items} Benutzergruppen]]></item>\r
-               <item name="wcf.acp.group.members"><![CDATA[Anzahl Mitglieder]]></item>\r
-               <item name="wcf.acp.group.moderators"><![CDATA[Moderatoren]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Kann Administrationsoberfläche betreten]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Mitglieder dieser Benutzergruppe können die Administrationsoberfläche betreten und dort abhängig von den weiteren Zugriffsrechten verschiedene Aktionen durchführen. Diese Option muss aktiviert sein, wenn diesen Benutzern andere administrative Funktionen erlaubt werden sollen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Kann versteckte Profilinformationen sehen]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Mitglieder dieser Benutzergruppe können die versteckten Informationen in Benutzerprofilen sehen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Kann allgemeine Einstellungen vornehmen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Mitglieder dieser Benutzergruppe können die allgemeinen System-Einstellungen sehen und bearbeiten. Z.B. Forum ein-/ausschalten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Kann Protokolle abrufen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können die System-Protokolle abrufen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Kann neue zeitgesteuerte Aufgaben anlegen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue zeitgesteuerte Aufgaben anlegen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben löschen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben löschen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Kann Protokoll der zeitgesteuerten Aufgaben löschen]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Protokoll der zeitgesteuerten Aufgaben löschen. Bei der Ausführung einer zeitgesteuerten Aufgabe wird festgehalten, ob dieser erfolgreich ausgeführt wurde.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben ändern]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben deaktivieren]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben deaktivieren. Diese werden dann nicht mehr ausgeführt, können später jedoch auch wieder aktiviert werden.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Kann Update-Server bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Update-Server bearbeiten und neue hinzufügen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Kann Pakete installieren]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können zusätzliche Pakete installieren.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Kann Pakete deinstallieren]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete entfernen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Kann Pakete aktualisieren]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete aktualisieren.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Zugängliche Benutzergruppen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Mitglieder dieser Benutzergruppe haben auf diese Gruppen Zugriff. Zusätzlich muss angegeben werden, ob z.B. die Benutzergruppe bearbeitet werden darf.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Kann neue Benutzergruppen erstellen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzergruppen erstellen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Kann neue Benutzer erstellen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzer erstellen. Ist bei "Zugängliche Benutzergruppen" eine Option aktiviert, kann diese Gruppe beim Erstellen des Benutzers zugewiesen werden.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Kann Benutzergruppen löschen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen löschen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Kann Benutzer löschen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer löschen.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Kann Benutzergruppen bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Kann E-Mail-Adressen bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Kann Kennwörter bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Kennwort von anderen Benutzern bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Kann Benutzer bearbeiten]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer bearbeiten.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Kann E-Mails an Benutzer senden]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern sehen und ihnen E-Mails senden.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Kann Benutzer suchen]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer und deren Profile durchsuchen.]]></item>\r
-               <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrative Rechte]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Inhalte]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Darstellung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.general"><![CDATA[Allgemeine administrative Rechte]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Wartung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System-Funktionen]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Paketverwaltung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user"><![CDATA[Benutzer-Funktionen]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Gruppenverwaltung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[Benutzerverwaltung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderative Rechte]]></item>\r
-               <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.user"><![CDATA[Allgemeine Rechte]]></item>\r
-               <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>\r
-               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Kann deaktivierte Stile benutzen]]></item>\r
-               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Mitglieder dieser Benutzergruppe können deaktivierte Stile auswählen.]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Stil-Verwaltung]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.showMembers"><![CDATA[Zeige die Mitglieder dieser Benutzergruppe]]></item>\r
-               <item name="wcf.acp.group.superModerators"><![CDATA[Super Moderatoren]]></item>\r
-               <item name="wcf.acp.group.users"><![CDATA[Registrierte Benutzer]]></item>\r
-       </category>\r
-       <category name="wcf.acp.login">\r
-               <item name="wcf.acp.login"><![CDATA[Anmeldung]]></item>\r
-               <item name="wcf.acp.login.data"><![CDATA[Zugangsdaten]]></item>\r
-       </category>\r
-       <category name="wcf.acp.masterPassword">\r
-               <item name="wcf.acp.masterPassword"><![CDATA[Hauptkennwort]]></item>\r
-               <item name="wcf.acp.masterPassword.confirm"><![CDATA[Hauptkennwort wiederholen]]></item>\r
-               <item name="wcf.acp.masterPassword.enter"><![CDATA[Hauptkennwort erforderlich]]></item>\r
-               <item name="wcf.acp.masterPassword.enter.description"><![CDATA[Die aufgerufene Seite oder Aktion erfordert aus Sicherheitsgründen die Eingabe des Hauptkennwortes. Pro Sitzung ist die Eingabe des Hauptkennwortes nur einmal erforderlich. Falls Sie das Hauptkennwort vergessen haben sollten, können Sie es zurücksetzen, indem Sie die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschen.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[Das Hauptkennwort ist nicht korrekt. Falls Sie das Hauptkennwort vergessen haben sollten, können Sie es zurücksetzen, indem Sie die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschen.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[Das Kennwort wurde als unsicher erkannt. Das Kennwort sollte mindestens acht Zeichen lang sein, große und kleine lateinische Buchstaben, Zahlen und Sonderzeichen enthalten. Es darf nicht mit den Kennwörtern von anderen Administratoren übereinstimmen.]]></item>\r
-               <item name="wcf.acp.masterPassword.example"><![CDATA[Vorschlag]]></item>\r
-               <item name="wcf.acp.masterPassword.example.set"><![CDATA[Vorschlag übernehmen]]></item>\r
-               <item name="wcf.acp.masterPassword.init"><![CDATA[Hauptkennwort festlegen]]></item>\r
-               <item name="wcf.acp.masterPassword.init.description"><![CDATA[Das Hauptkennwort ist ein zusätzlicher Schutz für sicherheitskritische Funktionen. Sie sollten hier ein möglichst sicheres Kennwort verwenden, dass sich von Ihrem normalen Administrator-Kennwort unterscheidet, Dritten nicht bekannt ist und auch nicht auf anderen Internetseiten verwendet wird.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.menu">\r
-               <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatisches Update]]></item>\r
-               <item name="wcf.acp.menu.link.content"><![CDATA[Inhalte]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[Zeitgesteuerte Aufgaben auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.display"><![CDATA[Darstellung]]></item>\r
-               <item name="wcf.acp.menu.link.group"><![CDATA[Benutzergruppen]]></item>\r
-               <item name="wcf.acp.menu.link.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>\r
-               <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-Mail an Gruppenmitglieder]]></item>\r
-               <item name="wcf.acp.menu.link.group.view"><![CDATA[Benutzergruppen auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.log"><![CDATA[Protokoll]]></item>\r
-               <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.menu.link.log.session"><![CDATA[Sitzungen]]></item>\r
-               <item name="wcf.acp.menu.link.maintenance"><![CDATA[Wartung]]></item>\r
-               <item name="wcf.acp.menu.link.option"><![CDATA[Optionen]]></item>\r
-               <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Sichern &amp; Wiederherstellen]]></item>\r
-               <item name="wcf.acp.menu.link.package"><![CDATA[Paketverwaltung]]></item>\r
-               <item name="wcf.acp.menu.link.package.database"><![CDATA[Pakete suchen]]></item>\r
-               <item name="wcf.acp.menu.link.package.install"><![CDATA[Paket installieren]]></item>\r
-               <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Server hinzufügen]]></item>\r
-               <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.package.view"><![CDATA[Pakete auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>\r
-               <item name="wcf.acp.menu.link.user"><![CDATA[Benutzer]]></item>\r
-               <item name="wcf.acp.menu.link.user.add"><![CDATA[Benutzer hinzufügen]]></item>\r
-               <item name="wcf.acp.menu.link.user.list"><![CDATA[Benutzer auflisten]]></item>\r
-               <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-Mail an alle Benutzer]]></item>\r
-               <item name="wcf.acp.menu.link.user.management"><![CDATA[Benutzer]]></item>\r
-               <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>\r
-               <item name="wcf.acp.menu.link.user.search"><![CDATA[Benutzer suchen]]></item>\r
-       </category>\r
-       <category name="wcf.acp.option">\r
-               <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Hostname ausschließen]]></item>\r
-               <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Geben Sie pro Zeile einen Hostname an, die Sie von der Seite ausschließen möchten.]]></item>\r
-               <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[IP-Adresse ausschließen]]></item>\r
-               <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Geben Sie pro Zeile eine IP-Adresse an, die Sie von der Seite ausschließen möchten.]]></item>\r
-               <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Browser-Kennung ausschließen]]></item>\r
-               <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Geben Sie pro Zeile eine Browser-Kennung (User-Agent) an, die Sie von der Seite ausschließen möchten.]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache-Server]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Geben Sie hier die Adresse des Memcache-Servers ein! Mehrere Server können zeilenweise angegeben werden.]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Persistente Verbindungen aktivieren]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[Sollen beim Verbinden mit dem Memcache-Server persistente Verbindungen genutzt werden?]]></item>\r
-               <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache-Methode]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Bitte wählen Sie die gewünschte Cache-Methode aus! Beachten Sie, dass einige Methoden spezielle Anforderungen an das Server-System stellen und nicht auf jedem Server zur Verfügung stehen.]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[Dateisystem (Standard)]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (Experimentell)]]></item>\r
-               <item name="wcf.acp.option.category.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache speichert häufig benötige Daten im Arbeitsspeicher zwischen. Dies kann die Last auf die Datenbank und das Dateisystem drastisch reduzieren. Lesen Sie mehr über dieses Thema auf der folgenden Seite:\r
-<ul>\r
-       <li><a href="http://memcached.org/">memcached.org</a></li>\r
-</ul>]]></item>\r
-               <item name="wcf.acp.option.category.general.date"><![CDATA[Datum &amp; Zeit]]></item>\r
-               <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>\r
-               <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>\r
-               <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>\r
-               <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy-Server]]></item>\r
-               <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[Hier können Sie optional Proxy-Server für Verbindungen zu externen Servern konfigurieren.]]></item>\r
-               <item name="wcf.acp.option.category.general.mail"><![CDATA[E-Mails]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Versand]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.offline"><![CDATA[Wartungsmodus]]></item>\r
-               <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module"><![CDATA[Module an / aus]]></item>\r
-               <item name="wcf.acp.option.category.module.content"><![CDATA[Inhalte]]></item>\r
-               <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.display"><![CDATA[Darstellung]]></item>\r
-               <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>\r
-               <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.user"><![CDATA[Benutzer]]></item>\r
-               <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security"><![CDATA[Sicherheit]]></item>\r
-               <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>\r
-               <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internetseiten werden häufig durch andere Programme angegriffen. So gibt es beispielsweise die Möglichkeit, automatisiert hunderte von Benutzerkonten zu erstellen. Um sich davor zu schützen, können Sie an verschiedenen Stellen ein sogenanntes <a href="http://de.wikipedia.org/wiki/Captcha" class="externalURL">Captcha-Bild</a> anzeigen lassen. Unregistrierte Benutzer müssen erst den Code eingeben, der auf diesem Bild steht. Roboter können diesen Code nicht lesen. Beachten Sie, dass Captcha-Bilder von blinden und sehbehinderten Benutzern nicht identifiziert werden können.]]></item>\r
-               <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>\r
-               <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.censorship"><![CDATA[Zensur]]></item>\r
-               <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sitzungen]]></item>\r
-               <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.user"><![CDATA[Mitglieder]]></item>\r
-               <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookiedomain]]></item>\r
-               <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Hier können Sie optional eine Domain angeben, unter der der Cookie laufen soll. Standardmäßig sollten Sie dieses Feld frei lassen, da ein Ausfüllen nur in wenigen Fällen notwendig ist.]]></item>\r
-               <item name="wcf.acp.option.cookie_path"><![CDATA[Cookiepfad]]></item>\r
-               <item name="wcf.acp.option.cookie_path.description"><![CDATA[Der Cookiepfad wird absolut zum Document Root angegeben - also z.B. "/forum" für http://www.woltlab.de/forum.]]></item>\r
-               <item name="wcf.acp.option.cookie_prefix"><![CDATA[Präfix für Cookienamen]]></item>\r
-               <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Geben Sie einen Präfix an, der bei Cookienamen verwendet wird.]]></item>\r
-               <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Uhr automatisch auf Sommer-/Winterzeit umstellen]]></item>\r
-               <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Soll die Uhr automatisch auf Sommer-/Winterzeit umgestellt werden?]]></item>\r
-               <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Cache-Methode für Sitzungsdaten verwenden]]></item>\r
-               <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Soll für die Speicherung der Sitzungsdaten die ausgewählte Cache-Methode verwendet werden?]]></item>\r
-               <item name="wcf.acp.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>\r
-               <item name="wcf.acp.option.export"><![CDATA[Optionen sichern]]></item>\r
-               <item name="wcf.acp.option.export.download"><![CDATA[Sicherung der Optionen herunterladen]]></item>\r
-               <item name="wcf.acp.option.export.download.description"><![CDATA[Laden Sie eine Sicherung der Optionen auf Ihren lokalen Rechner herunter.]]></item>\r
-               <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Gzip-Komprimierung aktivieren]]></item>\r
-               <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Durch Aktivierung dieser Option werden die Inhalte komprimiert vom Server an den Client gesendet. Dies reduziert den Traffic.]]></item>\r
-               <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Seitencaching im Client-Browser verhindern]]></item>\r
-               <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Durch Aktivierung dieser Option können Sie das Caching der Seite im Browser verhindern.]]></item>\r
-               <item name="wcf.acp.option.http_gzip_level"><![CDATA[Gzip-Komprimierungslevel]]></item>\r
-               <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[Werte von 1-9 sind zulässig. Als Optimum zwischen Komprimierung und Serverlast empfiehlt sich Level 1.]]></item>\r
-               <item name="wcf.acp.option.import"><![CDATA[Optionen wiederherstellen]]></item>\r
-               <item name="wcf.acp.option.import.error.importFailed"><![CDATA[Die Optionen konnten nicht erfolgreich importiert werden.]]></item>\r
-               <item name="wcf.acp.option.import.success"><![CDATA[Die Optionen wurden erfolgreich importiert.]]></item>\r
-               <item name="wcf.acp.option.import.upload"><![CDATA[Sicherung der Optionen vom lokalen Computer hochladen]]></item>\r
-               <item name="wcf.acp.option.import.upload.description"><![CDATA[Geben Sie eine Sicherung der Optionen von Ihrem lokalen Rechner an.]]></item>\r
-               <item name="wcf.acp.option.importAndExport"><![CDATA[Optionen sichern &amp; wiederherstellen]]></item>\r
-               <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator-Adresse]]></item>\r
-               <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Geben Sie die E-Mail-Adresse des Administrators an.]]></item>\r
-               <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Logfile-Pfad]]></item>\r
-               <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Geben Sie den Pfad zum Logfile an.]]></item>\r
-               <item name="wcf.acp.option.mail_from_address"><![CDATA[Absender-Adresse]]></item>\r
-               <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Geben Sie die Absender-Adresse bei automatisch generierten E-Mails an.]]></item>\r
-               <item name="wcf.acp.option.mail_from_name"><![CDATA[Absender-Name]]></item>\r
-               <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Geben Sie den Namen des Absenders bei automatisch generierten E-Mails an.]]></item>\r
-               <item name="wcf.acp.option.mail_send_method"><![CDATA[Versandmethode]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Wählen Sie eine Versandmethode aus.]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>\r
-               <item name="wcf.acp.option.mail_signature"><![CDATA[Signatur]]></item>\r
-               <item name="wcf.acp.option.mail_signature.description"><![CDATA[Tragen Sie hier eine Signatur ein, die bei System-E-Mails angezeigt werden soll.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP-Server]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Tragen Sie hier den SMTP-Server ein.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP-Kennwort]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Geben Sie das SMTP-Kennwort an.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP-Port]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Geben Sie den SMTP-Port an.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP-Benutzer]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Geben Sie den SMTP-Benutzer an.]]></item>\r
-               <item name="wcf.acp.option.mail_use_f_param"><![CDATA[&raquo;-f&laquo; Parameter verwenden]]></item>\r
-               <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Manche Server benötigen den &raquo;-f&laquo; Parameter beim Versenden von E-Mails. Falls Sie Probleme mit dem Versand von E-Mails haben, aktivieren Sie diese Einstellung.]]></item>\r
-               <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Formatierte E-Mail-Adressen verwenden]]></item>\r
-               <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Absender- und Empfänger-Adressen werden in folgendes Format gebracht: &quot;Name &lt;email@domain.tld&gt;&quot;. Diese Funktion wird nicht von allen Mailservern unterstützt und sollte daher bei Problemen abgeschaltet werden.]]></item>\r
-               <item name="wcf.acp.option.module_master_password"><![CDATA[Hauptkennwort aktivieren]]></item>\r
-               <item name="wcf.acp.option.module_master_password.description"><![CDATA[Aktiviert die zusätzliche Eingabe eines Kennworts beim Aufruf von sicherheitskritischen Bereichen.]]></item>\r
-               <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>\r
-               <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server für HTTP-Verbindungen]]></item>\r
-               <item name="wcf.acp.option.session_timeout"><![CDATA[Gültigkeitslänge einer Sitzung]]></item>\r
-               <item name="wcf.acp.option.session_timeout.description"><![CDATA[Geben Sie an, wie lange die Sitzung gültig ist [Sekunden]. ]]></item>\r
-               <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[IP-Adresse der Sitzung überprüfen]]></item>\r
-               <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[Anzahl der Blöcke der IP-Adresse die beim Auslesen der Sitzung überprüft werden sollen. Eine hohe Einstellung kann Benutzer ausschließen, die mit wechselnden IP-Adressen im Internet unterwegs sind.]]></item>\r
-               <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Browser-Kennung der Sitzung überprüfen]]></item>\r
-               <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Soll die Browser-Kennung beim Auslesen der Sitzung überprüft werden?]]></item>\r
-               <item name="wcf.acp.option.success"><![CDATA[Ihre Einstellungsänderungen wurden erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.option.timezone"><![CDATA[Zeitzone]]></item>\r
-               <item name="wcf.acp.option.timezone.description"><![CDATA[Wählen Sie die Standard Zeitzone Ihrer Seite.]]></item>\r
-               <item name="wcf.acp.option.user_online_timeout"><![CDATA[Timeout für Benutzer-Online]]></item>\r
-               <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Geben Sie an, wie lange der Benutzer trotz Inaktivität als online markiert werden soll [Sekunden].]]></item>\r
-               <item name="wcf.acp.option.category.general.page"><![CDATA[Seite]]></item>\r
-               <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.meta_description"><![CDATA[Meta Description]]></item>\r
-               <item name="wcf.acp.option.meta_description.description"><![CDATA[Geben Sie eine Meta Description an.]]></item>\r
-               <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta Keywords]]></item>\r
-               <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Tragen Sie die Wörter ein, die im Meta-Tag Keywords stehen sollen.]]></item>\r
-               <item name="wcf.acp.option.page_description"><![CDATA[Seitenbeschreibung]]></item>\r
-               <item name="wcf.acp.option.page_description.description"><![CDATA[Fügen Sie hier eine kurze Beschreibung Ihrer Seite ein.]]></item>\r
-               <item name="wcf.acp.option.page_title"><![CDATA[Titel der Seite]]></item>\r
-               <item name="wcf.acp.option.page_title.description"><![CDATA[Geben Sie hier den Globalen Titel der Seite an. Dieser Titel wird im Seitenkopf dargestellt, wenn Sie die Anzeige dieses Textes im Stileditor aktiviert haben.]]></item>\r
-               <item name="wcf.acp.option.page_url"><![CDATA[Adresse (URL) der Seite]]></item>\r
-               <item name="wcf.acp.option.page_url.description"><![CDATA[Geben Sie an, unter welcher Adresse (URL) die Seite aufzurufen ist (ohne abschließenden Slash).]]></item>\r
-               <item name="wcf.acp.option.page_urls"><![CDATA[Weitere URLs]]></item>\r
-               <item name="wcf.acp.option.page_urls.description"><![CDATA[Geben Sie hier weitere URLs an, unter denen Ihre Seite erreichbar ist.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.package">\r
-               <item name="wcf.acp.package.cancel"><![CDATA[Abbruch der Paketinstallation]]></item>\r
-               <item name="wcf.acp.package.description"><![CDATA[Beschreibung]]></item>\r
-               <item name="wcf.acp.package.install"><![CDATA[Paketinstallation]]></item>\r
-               <item name="wcf.acp.package.install.cancel"><![CDATA[Installation abbrechen]]></item>\r
-               <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Wollen Sie die Installation wirklich abbrechen?]]></item>\r
-               <item name="wcf.acp.package.install.error"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>\r
-               <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[Die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} kann aufgrund von Inkompatibilitäten zu {if $excludedPackages|count == 1}folgendem Paket{else}folgenden Paketen{/if} nicht durchgeführt werden:]]></item>\r
-               <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in Version {$excludedPackage.packageVersion}]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket lässt{else}Folgende Pakete lassen{/if} die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} aufgrund von Inkompatibilitäten nicht zu:]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in Version {$excludingPackage.packageVersion}]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket ist{else}Folgende Pakete sind{/if} mit dem Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} nicht kompatibel. Wenn Sie die Installation fortführen, {if $excludingPackages|count == 1}wird das Paket{else}werden die Pakete{/if} vermutlich nicht mehr korrekt funktionieren.]]></item>\r
-               <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}ist bereits installiert{else}{if $package.file|isset}liegt dem Paket bei{else}fehlt{/if}{/if})</span>]]></item>\r
-               <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Wollen Sie die Paketinstallation wirklich abbrechen?]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances"><![CDATA[Folgende Pakete können mit diesem Paket aktualisiert werden]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Wählen Sie eines der folgenden Pakete aus, um seine Version zu aktualisieren. Falls Sie das Paket neu installieren möchten, klicken Sie unten auf &raquo;Weiter&laquo;.]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[Es ist bereits eine Kopie dieses Paketes installiert. Wenn Sie fortfahren, wird eine weitere Kopie dieses Paketes installiert. Falls Sie eine vorhandene Kopie dieses Paketes aktualisieren möchten, wählen Sie die Kopie aus der folgenden Liste aus.]]></item>\r
-               <item name="wcf.acp.package.install.version"><![CDATA[Version des Paketes:]]></item>\r
-               <item name="wcf.acp.package.installDate"><![CDATA[Installationsdatum]]></item>\r
-               <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[Beim Versuch die Dateien des Paketes zu entpacken, ist folgender Fehler aufgetreten:]]></item>\r
-               <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[Folgende Dateien konnten nicht erfolgreich entpackt werden. Bitte überprüfen Sie, ob der entsprechende Zielort beschreibbar ist.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Tabellen Konflikt]]></item>\r
-               <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Keine Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Alle Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Notwendige Änderungen]]></item>\r
-               <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Betroffene Tabelle]]></item>\r
-               <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Vorhandene Tabellen Ihrer Datenbank stehen im Konflikt mit Tabellen, die für dieses Paket installiert werden müssen. Bitte wählen Sie aus, ob diese Tabellen überschrieben werden sollen.]]></item>\r
-               <item name="wcf.acp.package.list"><![CDATA[Installierte Pakete]]></item>\r
-               <item name="wcf.acp.package.list.author"><![CDATA[Hersteller]]></item>\r
-               <item name="wcf.acp.package.list.count"><![CDATA[Insgesamt sind {#$items} Pakete installiert.]]></item>\r
-               <item name="wcf.acp.package.list.date"><![CDATA[Herstellungsdatum]]></item>\r
-               <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>\r
-               <item name="wcf.acp.package.list.other"><![CDATA[Sonstiges Paket]]></item>\r
-               <item name="wcf.acp.package.list.plugin"><![CDATA[Zusatzmodul]]></item>\r
-               <item name="wcf.acp.package.list.standalone"><![CDATA[Endanwendung]]></item>\r
-               <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>\r
-               <item name="wcf.acp.package.optionals"><![CDATA[Optionale Zusatzpakete installieren]]></item>\r
-               <item name="wcf.acp.package.optionals.description"><![CDATA[Das aktuelle Paket bringt folgende optionale Zusatzpakete mit. Bitte wählen Sie aus, welche Zusatzpakete Sie installieren möchten.]]></item>\r
-               <item name="wcf.acp.package.optionals.installed"><![CDATA[ (Dieses Paket ist bereits installiert.)]]></item>\r
-               <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (Die Voraussetzungen für dieses Paket werden nicht erfüllt.)]]></item>\r
-               <item name="wcf.acp.package.packageDir"><![CDATA[Installationsverzeichnis]]></item>\r
-               <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Es ist bereits eine andere Anwendung in dem angegebenen Verzeichnis installiert.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[Das angegebene Verzeichnis ist nicht beschreibbar.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[Das angegebene Verzeichnis wird bereits von WoltLab Community Framework beansprucht. Bitte wählen Sie ein anderes Verzeichnis.]]></item>\r
-               <item name="wcf.acp.package.packageDir.input"><![CDATA[Bitte geben Sie hier das Installationsverzeichnis an.]]></item>\r
-               <item name="wcf.acp.package.packageDir.url"><![CDATA[Nach der Installation in das angegebene Installationsverzeichnis ist die Anwendung über folgende Adresse (URL) erreichbar:]]></item>\r
-               <item name="wcf.acp.package.requirements"><![CDATA[Abhängigkeiten auswählen]]></item>\r
-               <item name="wcf.acp.package.requirements.description"><![CDATA[Das aktuelle Paket benötigt Pakete, von denen mehrere Instanzen installiert sind. Bitte wählen Sie aus, zu welcher Instanz jeweils eine Abhängigkeit hergestellt werden soll.]]></item>\r
-               <item name="wcf.acp.package.rollback"><![CDATA[Paketinstallation zurücksetzen]]></item>\r
-               <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright &copy; {$packageAuthor}]]></item>\r
-               <item name="wcf.acp.package.startInstall"><![CDATA[Neues Paket installieren]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[Das angegebene Archiv ist kein gültiges Paket.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[Paket &raquo;{$package->getName()}&laquo; kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[Es konnte keine Datei unter dem angegebenen Pfad gefunden wurden.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert. Das Paket kann nicht mehrfach installiert werden.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[Das Hochladen der ausgewählten Datei ist fehlgeschlagen.]]></item>\r
-               <item name="wcf.acp.package.startInstall.source"><![CDATA[Quelle auswählen]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Direkten Pfad zum Paket angeben]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Geben Sie den direkten Pfad zur Paketdatei an. Dabei kann es sich um die Internet Adresse der Paketdatei oder alternativ den Pfad zur Paketdatei im Dateisystem handeln.]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Paket vom lokalen Computer hochladen]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Geben Sie eine Paketdatei von Ihrem lokalen Rechner an.]]></item>\r
-               <item name="wcf.acp.package.startUpdate"><![CDATA[Paket &raquo;{$package->getName()}&laquo; aktualisieren]]></item>\r
-               <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>\r
-               <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>\r
-               <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation abgeschlossen]]></item>\r
-               <item name="wcf.acp.package.step.install.optionals"><![CDATA[Optionale Pakete werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.package"><![CDATA[Paket wird registriert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden installiert ...]]></item>\r
-               <item name="wcf.acp.package.step.install.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>\r
-               <item name="wcf.acp.package.step.install.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
-               <item name="wcf.acp.package.step.title"><![CDATA[Paket <b>{$packageName|encodeJS}</b>: ]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Dateien werden gelöscht ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Deinstallation abgeschlossen]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Optionale Pakete werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden deinstalliert ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>\r
-               <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
-               <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>\r
-               <item name="wcf.acp.package.step.update.finish"><![CDATA[Paketaktualisierung abgeschlossen]]></item>\r
-               <item name="wcf.acp.package.step.update.optionals"><![CDATA[Optionale Pakete werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.package"><![CDATA[Paket wird aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden aktualisiert ...]]></item>\r
-               <item name="wcf.acp.package.step.update.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>\r
-               <item name="wcf.acp.package.step.update.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
-               <item name="wcf.acp.package.uninstall"><![CDATA[Paketdeinstallation]]></item>\r
-               <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Abbruch der Paketdeinstallation]]></item>\r
-               <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[Die Deinstallation des Paketes ist nicht möglich, da mindestens ein abhängiges Paket nicht deinstalliert werden kann.]]></item>\r
-               <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Diese{if $dependentPackages|count == 1}s Paket wird{else} Pakete werden{/if}, nach Ihrer Bestätigung, ohne weitere Sicherheitsabfrage deinstalliert.]]></item>\r
-               <item name="wcf.acp.package.update"><![CDATA[Paketaktualisierung]]></item>\r
-               <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>\r
-               <item name="wcf.acp.package.view.author"><![CDATA[Hersteller:]]></item>\r
-               <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Zur Administrationsoberfläche wechseln]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Paket deinstallieren]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Alle Pakete deinstallieren]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Wollen Sie dieses Paket wirklich deinstallieren?]]></item>\r
-               <item name="wcf.acp.package.view.button.update"><![CDATA[Paket aktualisieren]]></item>\r
-               <item name="wcf.acp.package.view.date"><![CDATA[Herstellungsdatum:]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Abhängige Pakete]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[Dieses Paket wird von {#$dependentPackages|count} {if $dependentPackages|count == 1}anderen Paket{else}anderen Paketen{/if} benötigt.]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}Dieses Paket wird von 1 anderen Paket benötigt{else}{#$dependentPackages|count} Pakete sind direkt oder indirekt von diesem Paket abhängig{/if}.]]></item>\r
-               <item name="wcf.acp.package.view.dir"><![CDATA[Installationsverzeichnis:]]></item>\r
-               <item name="wcf.acp.package.view.identifier"><![CDATA[Bezeichner:]]></item>\r
-               <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installierte Instanz:]]></item>\r
-               <item name="wcf.acp.package.view.parent"><![CDATA[Übergeordnetes Paket:]]></item>\r
-               <item name="wcf.acp.package.view.properties"><![CDATA[Eigenschaften]]></item>\r
-               <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Benötigte Pakete]]></item>\r
-               <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[Dieses Paket benötigt {#$requiredPackages|count} {if $requiredPackages|count == 1}anderes Paket{else}andere Pakete{/if}.]]></item>\r
-               <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>\r
-               <item name="wcf.acp.package.view.version"><![CDATA[Installierte Version:]]></item>\r
-       </category>\r
-       <category name="wcf.acp.packageUpdate">\r
-               <item name="wcf.acp.packageUpdate"><![CDATA[Pakete aktualisieren]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentifizierung mit Update-Server]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Verbindungs-Daten]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Benutzername und Kennwort wurden nicht akzeptiert.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Geben Sie ein Kennwort an, das zur Authentifizierung benötigt wird.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Geben Sie einen Benutzernamen an, der zur Authentifizierung benötigt wird.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[Benutzeranmeldung]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server-Meldung]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server-Name]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Benutzerdaten dauerhaft speichern]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[Speichert die eingegebenen Benutzerdaten dauerhaft, sodass Sie die Daten zu einem späteren Zeitpunkt nicht erneut eingeben müssen.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Adresse]]></item>\r
-               <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installierte Version]]></item>\r
-               <item name="wcf.acp.packageUpdate.error"><![CDATA[Es ist folgender Fehler aufgetreten: ]]></item>\r
-               <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[Das Herunterladen des Paketes {$package} ist fehlgeschlagen.]]></item>\r
-               <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[Beim Versuch die Paketliste herunterzuladen, ist ein Fehler aufgetreten.]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[Es {if $excludedPackages|count == 1}ist folgender Konflikt{else}sind folgende Konflikte{/if} aufgetreten:]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[Das installierte Paket &raquo;{$excludedPackage.existingPackageName}&laquo; ist mit dem Paket &raquo;{$excludedPackage.packageName}&laquo; in Version {$excludedPackage.packageVersion} nicht kompatibel.]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[Das Paket &raquo;{$excludedPackage.packageName}&laquo; in Version {$excludedPackage.packageVersion} ist mit dem installierten Paket &raquo;{$excludedPackage.existingPackageName}&laquo; nicht kompatibel.]]></item>\r
-               <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} wird installiert]]></item>\r
-               <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[Derzeit sind keine Updates verfügbar.]]></item>\r
-               <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[Sie haben kein Update ausgewählt.]]></item>\r
-               <item name="wcf.acp.packageUpdate.options"><![CDATA[Optionen]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[Paket ist bereits installiert und kann kein weiteres Mal installiert werden.]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Paket installieren]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Weitere Paket-Instanz installieren (Paket ist bereits {#$package.instances} mal installiert)]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Installiertes Paket {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} Version {$updatableInstance.packageVersion} aktualisieren]]></item>\r
-               <item name="wcf.acp.packageUpdate.search"><![CDATA[Pakete suchen]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Autor]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Suche nach ...]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Bereits installierte einzigartige Pakete ausblenden]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Paketname]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Paketname und -beschreibung durchsuchen]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update-Server]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Alle Update-Server durchsuchen]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Art des Paketes]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Sonstige Pakete]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Zusatzmodul für bereits installierte Pakete]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Endanwendung]]></item>\r
-               <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Alle Pakete auswählen]]></item>\r
-               <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} wird aktualisiert auf {$package.toVersion}]]></item>\r
-               <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[Neue Version]]></item>\r
-               <item name="wcf.acp.packageUpdate.updates"><![CDATA[Folgende Paket-Aktualisierungen/-Installationen werden durchgeführt:]]></item>\r
-       </category>\r
-       <category name="wcf.acp.sessionLog">\r
-               <item name="wcf.acp.sessionLog.access.view"><![CDATA[Aktionen der protokollierten Sitzung von &raquo;{$sessionLog->username}&laquo;]]></item>\r
-               <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[Insgesamt {#$items} protokollierte Aktion{if $items != 1}en{/if}]]></item>\r
-               <item name="wcf.acp.sessionLog.accesses"><![CDATA[Aktionen]]></item>\r
-               <item name="wcf.acp.sessionLog.className"><![CDATA[Klasse]]></item>\r
-               <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP-Adresse]]></item>\r
-               <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Letzte Aktion]]></item>\r
-               <item name="wcf.acp.sessionLog.packageName"><![CDATA[Paket]]></item>\r
-               <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Methode]]></item>\r
-               <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>\r
-               <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.sessionLog.time"><![CDATA[Datum]]></item>\r
-               <item name="wcf.acp.sessionLog.userAgent"><![CDATA[Browser-Kennung]]></item>\r
-               <item name="wcf.acp.sessionLog.view"><![CDATA[Protokollierte Sitzungen]]></item>\r
-               <item name="wcf.acp.sessionLog.view.count"><![CDATA[Insgesamt {#$items} protokollierte Sitzung{if $items != 1}en{/if}]]></item>\r
-       </category>\r
-       <category name="wcf.acp.updateServer">\r
-               <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>\r
-               <item name="wcf.acp.updateServer.add.success"><![CDATA[Der Server wurde erfolgreich angelegt.]]></item>\r
-               <item name="wcf.acp.updateServer.data"><![CDATA[Server-Daten]]></item>\r
-               <item name="wcf.acp.updateServer.delete"><![CDATA[Server löschen]]></item>\r
-               <item name="wcf.acp.updateServer.delete.success"><![CDATA[Der Server wurde erfolgreich gelöscht.]]></item>\r
-               <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Wollen Sie den Server wirklich löschen?]]></item>\r
-               <item name="wcf.acp.updateServer.disable"><![CDATA[Deaktivieren]]></item>\r
-               <item name="wcf.acp.updateServer.edit"><![CDATA[Server bearbeiten]]></item>\r
-               <item name="wcf.acp.updateServer.edit.success"><![CDATA[Ihre Änderungen wurden erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.updateServer.enable"><![CDATA[Aktivieren]]></item>\r
-               <item name="wcf.acp.updateServer.errorText"><![CDATA[Fehlermeldungen]]></item>\r
-               <item name="wcf.acp.updateServer.htPassword"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Geben Sie ein Kennwort an, das zur Authentifizierung benötigt wird (optional).]]></item>\r
-               <item name="wcf.acp.updateServer.htUsername"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Geben Sie einen Benutzernamen an, der zur Authentifizierung benötigt wird (optional).]]></item>\r
-               <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[Beim letzten Verbindungsversuch trat folgende Fehlermeldungen auf:]]></item>\r
-               <item name="wcf.acp.updateServer.list.available"><![CDATA[Insgesamt {#$items} Server eingetragen]]></item>\r
-               <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server-ID]]></item>\r
-               <item name="wcf.acp.updateServer.packages"><![CDATA[Pakete]]></item>\r
-               <item name="wcf.acp.updateServer.server"><![CDATA[Adresse]]></item>\r
-               <item name="wcf.acp.updateServer.server.description"><![CDATA[Geben Sie die Adresse (URL) zu einem Paketserver an.]]></item>\r
-               <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[Die eingetragene Adresse ist ungültig.]]></item>\r
-               <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>\r
-               <item name="wcf.acp.updateServer.timestamp"><![CDATA[Letzter Zugriff]]></item>\r
-               <item name="wcf.acp.updateServer.view"><![CDATA[Verfügbare Update-Server]]></item>\r
-               <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[Es sind keine Update-Server eingetragen.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.user">\r
-               <item name="wcf.acp.user.add"><![CDATA[Benutzer hinzufügen]]></item>\r
-               <item name="wcf.acp.user.add.data"><![CDATA[Benutzerdaten]]></item>\r
-               <item name="wcf.acp.user.add.success"><![CDATA[Der neue Benutzer wurde erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.user.assignToGroup"><![CDATA[Benutzergruppe zuweisen]]></item>\r
-               <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Folgende Benutzer den unten ausgewählten Benutzergruppen zuweisen]]></item>\r
-               <item name="wcf.acp.user.assignToGroup.success"><![CDATA[Die Zuweisung wurde erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.user.button.assignGroup"><![CDATA[Benutzergruppe zuweisen]]></item>\r
-               <item name="wcf.acp.user.button.exportMail"><![CDATA[E-Mail-Adressen exportieren]]></item>\r
-               <item name="wcf.acp.user.button.sendMail"><![CDATA[E-Mail senden]]></item>\r
-               <item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>\r
-               <item name="wcf.acp.user.delete.error"><![CDATA[Es konnte kein Benutzer gelöscht werden.]]></item>\r
-               <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}Der Benutzer wurde{else}{#$deletedUsers} Benutzer wurden{/if} erfolgreich gelöscht.]]></item>\r
-               <item name="wcf.acp.user.delete.sure"><![CDATA[Wollen Sie diesen Benutzer wirklich löschen?]]></item>\r
-               <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Wollen Sie die markierten Benutzer wirklich löschen?]]></item>\r
-               <item name="wcf.acp.user.edit"><![CDATA[Benutzer bearbeiten]]></item>\r
-               <item name="wcf.acp.user.edit.success"><![CDATA[Die Änderungen an diesem Benutzer wurden erfolgreich gespeichert.]]></item>\r
-               <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[Sie bearbeiten Ihr eigenes Benutzerkonto. Änderungen an den Mitgliedschaften in Benutzergruppen können womöglich dazu führen, dass Sie aus der Administrationsoberfläche ausgeschlossen werden. Bitte seien Sie entsprechend vorsichtig!]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress"><![CDATA[E-Mail-Adressen exportieren]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Exportformat]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Exporteinstellungen]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[E-Mail-Adressen von folgenden Benutzern exportieren]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Trennzeichen]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Texttrenner]]></item>\r
-               <item name="wcf.acp.user.groups"><![CDATA[Benutzergruppe(n)]]></item>\r
-               <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Finde Benutzer, die in den ausgewählten Benutzergruppen nicht Mitglied sind.]]></item>\r
-               <item name="wcf.acp.user.list"><![CDATA[Benutzer]]></item>\r
-               <item name="wcf.acp.user.list.all"><![CDATA[Alle Benutzer]]></item>\r
-               <item name="wcf.acp.user.list.count"><![CDATA[Insgesamt {#$items} Benutzer]]></item>\r
-               <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "Einen Benutzer markiert" : this.count+" Benutzer markiert"]]></item>\r
-               <item name="wcf.acp.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>\r
-               <item name="wcf.acp.user.massProcessing.action"><![CDATA[Aktion]]></item>\r
-               <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Bedingungen]]></item>\r
-               <item name="wcf.acp.user.massProcessing.success"><![CDATA[Die gewählte Aktion wurde erfolgreich auf {#$affectedUsers} Benutzer ausgeführt.]]></item>\r
-               <item name="wcf.acp.user.massProcessing.warning"><![CDATA[Die Massenverarbeitung von Benutzern führt die unten ausgewählte Aktion <b>ohne zusätzliche Sicherheitsabfrage</b> auf alle Benutzer aus, die unter die eingestellten Bedingungen fallen. Die Bearbeitungen können unter Umständen sehr rechenintensiv werden und sollten deshalb möglichst nur dann ausgeführt werden, wenn sich die Seite im Wartungsmodus befindet! Die Veränderungen können nicht rückgängig gemacht werden. Bitte benutzen Sie diese Funktion mit der nötigen Vorsicht!]]></item>\r
-               <item name="wcf.acp.user.search"><![CDATA[Benutzer suchen]]></item>\r
-               <item name="wcf.acp.user.search.conditions"><![CDATA[Kriterien der Suche]]></item>\r
-               <item name="wcf.acp.user.search.conditions.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profil]]></item>\r
-               <item name="wcf.acp.user.search.display"><![CDATA[Darstellung]]></item>\r
-               <item name="wcf.acp.user.search.display.columns"><![CDATA[Angezeigte Informationen]]></item>\r
-               <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Sonstiges]]></item>\r
-               <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profil]]></item>\r
-               <item name="wcf.acp.user.search.display.general"><![CDATA[Allgemein]]></item>\r
-               <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Benutzer pro Seite]]></item>\r
-               <item name="wcf.acp.user.search.display.sort"><![CDATA[Sortierung]]></item>\r
-               <item name="wcf.acp.user.search.error.noMatches"><![CDATA[Zu den angegebenen Kriterien wurde kein Benutzer gefunden.]]></item>\r
-               <item name="wcf.acp.user.search.matches"><![CDATA[{if $items == 1}Ein Ergebnis{else}{#$items} Ergebnisse{/if}]]></item>\r
-               <item name="wcf.acp.user.search.withinResults"><![CDATA[In den Ergebnissen suchen]]></item>\r
-               <item name="wcf.acp.user.sendMail"><![CDATA[E-Mail an Benutzer senden]]></item>\r
-               <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail an alle Benutzer]]></item>\r
-               <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[E-Mail als HTML verschicken]]></item>\r
-               <item name="wcf.acp.user.sendMail.from"><![CDATA[Absender]]></item>\r
-               <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Hier können Sie die E-Mail-Adresse des Absenders definieren.{if MAIL_USE_FORMATTED_ADDRESS} Es ist auch folgendes Format möglich:{/if}</p>\r
-{if MAIL_USE_FORMATTED_ADDRESS}<p style="text-align: center; line-height: 2em;"><code>Absender Name &lt;email@absender.tld&gt;</code></p>{/if}\r
-<p>Wenn Sie unter System -> Optionen -> E-Mail alles ausgefüllt haben, wird dieses Feld automatisch ausgefüllt. Sollten Sie E-Mails per SMTP senden, so achten Sie darauf, dass die E-Mail-Adresse des Absenders auch vom Server akzeptiert werden muss.</p>]]></item>\r
-               <item name="wcf.acp.user.sendMail.group"><![CDATA[E-Mail an Gruppenmitglieder]]></item>\r
-               <item name="wcf.acp.user.sendMail.groups"><![CDATA[E-Mail an die Mitglieder folgender Benutzergruppen senden]]></item>\r
-               <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-Mail]]></item>\r
-               <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[E-Mail an folgende Benutzer senden]]></item>\r
-               <item name="wcf.acp.user.sendMail.subject"><![CDATA[Betreff]]></item>\r
-               <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Geben Sie hier die Betreffzeile der E-Mail an.]]></item>\r
-               <item name="wcf.acp.user.sendMail.text"><![CDATA[Nachricht]]></item>\r
-               <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Tragen Sie hier die Nachricht ein, die Sie den Benutzern senden möchten.]]></item>\r
-               <item name="wcf.acp.user.userNote"><![CDATA[Angemeldet als {$this->user->username}.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.worker">\r
-               <item name="wcf.acp.worker.currentStep"><![CDATA[Aktueller Schritt]]></item>\r
-               <item name="wcf.acp.worker.description"><![CDATA[Bitte lassen Sie dieses Browser-Fenster offen, bis der Prozess abgeschlossen ist und melden Sie sich auf keinen Fall in einem anderen Browser-Fenster separat in der Administrationsoberfläche an, da dies den Prozess behindern könnte.]]></item>\r
-               <item name="wcf.acp.worker.progress.finish"><![CDATA[Vorgang erfolgreich abgeschlossen]]></item>\r
-               <item name="wcf.acp.worker.progress.working"><![CDATA[Vorgang läuft ...]]></item>\r
-               <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>\r
-               <item name="wcf.acp.worker.title"><![CDATA[Prozess läuft ...]]></item>\r
-       </category>\r
-       <category name="wcf.global">\r
-               <item name="wcf.global.button.back"><![CDATA[&laquo; Zurück]]></item>\r
-               <item name="wcf.global.button.close"><![CDATA[Schließen]]></item>\r
-               <item name="wcf.global.button.collapse"><![CDATA[Zuklappen]]></item>\r
-               <item name="wcf.global.button.collapsible"><![CDATA[Auf- und Zuklappen]]></item>\r
-               <item name="wcf.global.button.delete"><![CDATA[Löschen]]></item>\r
-               <item name="wcf.global.button.delete.confirm"><![CDATA[Möchten Sie das Element wirklich löschen?]]></item>\r
-               <item name="wcf.global.button.deleteCompletely"><![CDATA[Endgültig löschen]]></item>\r
-               <item name="wcf.global.button.edit"><![CDATA[Bearbeiten]]></item>\r
-               <item name="wcf.global.button.editor.jump"><![CDATA[Zum Editor wechseln]]></item>\r
-               <item name="wcf.global.button.expand"><![CDATA[Aufklappen]]></item>\r
-               <item name="wcf.global.button.mark"><![CDATA[Markieren]]></item>\r
-               <item name="wcf.global.button.next"><![CDATA[Weiter &raquo;]]></item>\r
-               <item name="wcf.global.button.preview"><![CDATA[Vorschau]]></item>\r
-               <item name="wcf.global.button.reset"><![CDATA[Zurücksetzen]]></item>\r
-               <item name="wcf.global.button.submit"><![CDATA[Absenden]]></item>\r
-               <item name="wcf.global.button.unmark"><![CDATA[Demarkieren]]></item>\r
-               <item name="wcf.global.date.day"><![CDATA[Tag]]></item>\r
-               <item name="wcf.global.date.days"><![CDATA[Tage]]></item>\r
-               <item name="wcf.global.date.hour"><![CDATA[Stunde]]></item>\r
-               <item name="wcf.global.date.hours"><![CDATA[Stunden]]></item>\r
-               <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>\r
-               <item name="wcf.global.date.minutes"><![CDATA[Minuten]]></item>\r
-               <item name="wcf.global.date.month"><![CDATA[Monat]]></item>\r
-               <item name="wcf.global.date.months"><![CDATA[Monate]]></item>\r
-               <item name="wcf.global.date.second"><![CDATA[Sekunde]]></item>\r
-               <item name="wcf.global.date.seconds"><![CDATA[Sekunden]]></item>\r
-               <item name="wcf.global.date.week"><![CDATA[Woche]]></item>\r
-               <item name="wcf.global.date.weeks"><![CDATA[Wochen]]></item>\r
-               <item name="wcf.global.date.year"><![CDATA[Jahr]]></item>\r
-               <item name="wcf.global.date.year.notRequired"><![CDATA[Die Angabe des Jahres ist optional.]]></item>\r
-               <item name="wcf.global.date.years"><![CDATA[Jahre]]></item>\r
-               <item name="wcf.global.dateInputOrder"><![CDATA[day-month-year]]></item>\r
-               <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>\r
-               <item name="wcf.global.defaultValue"><![CDATA[Standard]]></item>\r
-               <item name="wcf.global.error.backward"><![CDATA[Zurück zur vorherigen Seite]]></item>\r
-               <item name="wcf.global.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>\r
-               <item name="wcf.global.error.file.notFound"><![CDATA[Die Datei konnte nicht gefunden werden.]]></item>\r
-               <item name="wcf.global.error.illegalLink"><![CDATA[Sie haben einen ungültigen oder nicht mehr gültigen Link aufgerufen.]]></item>\r
-               <item name="wcf.global.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist Ihnen leider verwehrt. Sie besitzen nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>\r
-               <item name="wcf.global.error.permissionDenied.title"><![CDATA[Zutritt verwehrt]]></item>\r
-               <item name="wcf.global.error.title"><![CDATA[Fehlermeldung]]></item>\r
-               <item name="wcf.global.form.error"><![CDATA[Ihre Angaben sind ungültig. Bitte überprüfen Sie die markierten Eingabefelder.]]></item>\r
-               <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>\r
-               <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>\r
-               <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>\r
-               <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>\r
-               <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>\r
-               <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede &raquo;Du&laquo;)]]></item>\r
-               <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>\r
-               <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>\r
-               <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>\r
-               <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>\r
-               <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>\r
-               <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>\r
-               <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>\r
-               <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>\r
-               <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>\r
-               <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>\r
-               <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>\r
-               <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>\r
-               <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>\r
-               <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>\r
-               <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>\r
-               <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>\r
-               <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>\r
-               <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>\r
-               <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>\r
-               <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>\r
-               <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>\r
-               <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>\r
-               <item name="wcf.global.language.th"><![CDATA[Thailändisch]]></item>\r
-               <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>\r
-               <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
-               <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>\r
-               <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>\r
-               <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>\r
-               <item name="wcf.global.multiSelect"><![CDATA[Mehrfache Markierungen sind durch zusätzliches Drücken der Taste &raquo;Strg/Ctrl&laquo; (Windows) oder &raquo;Befehl/Command&laquo; (Mac OS) möglich.]]></item>\r
-               <item name="wcf.global.page.input"><![CDATA[Zu folgender Seite springen]]></item>\r
-               <item name="wcf.global.page.next"><![CDATA[nächste Seite]]></item>\r
-               <item name="wcf.global.page.previous"><![CDATA[vorherige Seite]]></item>\r
-               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>\r
-               <item name="wcf.global.pageTitle"><![CDATA[WoltLab&reg; Community Framework&trade;]]></item>\r
-               <item name="wcf.global.redirect.title"><![CDATA[Weiterleitung]]></item>\r
-               <item name="wcf.global.redirect.url"><![CDATA[Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!]]></item>\r
-               <item name="wcf.global.scrollDown"><![CDATA[Zum Seitenende]]></item>\r
-               <item name="wcf.global.scrollUp"><![CDATA[Zum Seitenanfang]]></item>\r
-               <item name="wcf.global.search.matchesExactly"><![CDATA[Exakter Treffer]]></item>\r
-               \r
-               <item name="wcf.global.skipToContent"><![CDATA[Zum Seiteninhalt springen]]></item>\r
-               <item name="wcf.global.sortOrder.ascending"><![CDATA[in aufsteigender Reihenfolge]]></item>\r
-               <item name="wcf.global.sortOrder.descending"><![CDATA[in absteigender Reihenfolge]]></item>\r
-               <item name="wcf.global.thousandsSeparator"><![CDATA[&nbsp;]]></item>\r
-               \r
-               <item name="wcf.global.date.dateFormat"><![CDATA[j. F Y]]></item>\r
-               <item name="wcf.global.date.timeFormat"><![CDATA[H:i]]></item>\r
-               <item name="wcf.global.date.dateTimeFormat"><![CDATA[%date%, %time%]]></item>\r
-               \r
-               <!--  variables for dynamic javascript datetime -->\r
-               <item name="wcf.global.date.relative.minutes"><![CDATA['Vor ' + (($minutes > 1) ? $minutes + ' Minuten' : 'einer Minute' )]]></item>\r
-               <item name="wcf.global.date.relative.hours"><![CDATA['Vor ' + (($hours > 1) ? $hours + ' Stunden' : 'einer Stunde' )]]></item>\r
-               <item name="wcf.global.date.relative.pastDays"><![CDATA[(($days > 1) ? '%day%' : 'Gestern' ) + ', %time%']]></item>\r
-               \r
-               <!-- variables for localized date formats; unnecessary in english -->\r
-               <item name="wcf.global.date.month.january"><![CDATA[Januar]]></item>\r
-               <item name="wcf.global.date.month.february"><![CDATA[Februar]]></item>\r
-               <item name="wcf.global.date.month.march"><![CDATA[März]]></item>\r
-               <item name="wcf.global.date.month.april"><![CDATA[April]]></item>\r
-               <item name="wcf.global.date.month.may"><![CDATA[Mai]]></item>\r
-               <item name="wcf.global.date.month.june"><![CDATA[Juni]]></item>\r
-               <item name="wcf.global.date.month.july"><![CDATA[Juli]]></item>\r
-               <item name="wcf.global.date.month.august"><![CDATA[August]]></item>\r
-               <item name="wcf.global.date.month.september"><![CDATA[September]]></item>\r
-               <item name="wcf.global.date.month.october"><![CDATA[Oktober]]></item>\r
-               <item name="wcf.global.date.month.november"><![CDATA[November]]></item>\r
-               <item name="wcf.global.date.month.december"><![CDATA[Dezember]]></item>\r
-               <item name="wcf.global.date.month.jan"><![CDATA[Jan]]></item>\r
-               <item name="wcf.global.date.month.feb"><![CDATA[Feb]]></item>\r
-               <item name="wcf.global.date.month.mar"><![CDATA[Mär]]></item>\r
-               <item name="wcf.global.date.month.apr"><![CDATA[Apr]]></item>\r
-               <item name="wcf.global.date.month.may"><![CDATA[Mai]]></item>\r
-               <item name="wcf.global.date.month.jun"><![CDATA[Jun]]></item>\r
-               <item name="wcf.global.date.month.jul"><![CDATA[Jul]]></item>\r
-               <item name="wcf.global.date.month.aug"><![CDATA[Aug]]></item>\r
-               <item name="wcf.global.date.month.sep"><![CDATA[Sep]]></item>\r
-               <item name="wcf.global.date.month.oct"><![CDATA[Okt]]></item>\r
-               <item name="wcf.global.date.month.nov"><![CDATA[Nov]]></item>\r
-               <item name="wcf.global.date.month.dec"><![CDATA[Dez]]></item>\r
-               <item name="wcf.global.date.day.sunday"><![CDATA[Sonntag]]></item>\r
-               <item name="wcf.global.date.day.monday"><![CDATA[Montag]]></item>\r
-               <item name="wcf.global.date.day.tuesday"><![CDATA[Dienstag]]></item>\r
-               <item name="wcf.global.date.day.wednesday"><![CDATA[Mittwoch]]></item>\r
-               <item name="wcf.global.date.day.thursday"><![CDATA[Donnerstag]]></item>\r
-               <item name="wcf.global.date.day.friday"><![CDATA[Freitag]]></item>\r
-               <item name="wcf.global.date.day.saturday"><![CDATA[Samstag]]></item>\r
-               <item name="wcf.global.date.day.sun"><![CDATA[Son]]></item>\r
-               <item name="wcf.global.date.day.mon"><![CDATA[Mon]]></item>\r
-               <item name="wcf.global.date.day.tue"><![CDATA[Die]]></item>\r
-               <item name="wcf.global.date.day.wed"><![CDATA[Mit]]></item>\r
-               <item name="wcf.global.date.day.thu"><![CDATA[Don]]></item>\r
-               <item name="wcf.global.date.day.fri"><![CDATA[Fre]]></item>\r
-               <item name="wcf.global.date.day.sat"><![CDATA[Sam]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.kwajalein"><![CDATA[(UTC-12:00) Kwajalein]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.midway"><![CDATA[(UTC-11:00) Midway]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.samoa"><![CDATA[(UTC-11:00) Samoa]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.honolulu"><![CDATA[(UTC-10:00) Hawaii]]></item>\r
-               <item name="wcf.global.date.timezone.america.anchorage"><![CDATA[(UTC-09:00) Alaska]]></item>\r
-               <item name="wcf.global.date.timezone.america.tijuana"><![CDATA[(UTC-08:00) Tijuana, Niederkalifornien]]></item>\r
-               <item name="wcf.global.date.timezone.america.los_angeles"><![CDATA[(UTC-08:00) Pacific Zeit]]></item>\r
-               <item name="wcf.global.date.timezone.america.phoenix"><![CDATA[(UTC-07:00) Arizona]]></item>\r
-               <item name="wcf.global.date.timezone.america.chihuahua"><![CDATA[(UTC-07:00) Chihuahua, La Paz, Mazatlan]]></item>\r
-               <item name="wcf.global.date.timezone.america.denver"><![CDATA[(UTC-07:00) Mountain Zeit]]></item>\r
-               <item name="wcf.global.date.timezone.america.chicago"><![CDATA[(UTC-06:00) Central Zeit]]></item>\r
-               <item name="wcf.global.date.timezone.america.mexico_city"><![CDATA[(UTC-06:00) Guadalajara, Mexiko-Stadt, Monterrey]]></item>\r
-               <item name="wcf.global.date.timezone.america.tegucigalpa"><![CDATA[(UTC-06:00) Mittelamerika]]></item>\r
-               <item name="wcf.global.date.timezone.america.regina"><![CDATA[(UTC-06:00) Saskatchewan]]></item>\r
-               <item name="wcf.global.date.timezone.america.bogota"><![CDATA[(UTC-05:00) Bogotá, Lima, Quito]]></item>\r
-               <item name="wcf.global.date.timezone.america.new_york"><![CDATA[(UTC-05:00) Eastern Zeit]]></item>\r
-               <item name="wcf.global.date.timezone.america.indiana.indianapolis"><![CDATA[(UTC-05:00) Indiana (Ost)]]></item>\r
-               <item name="wcf.global.date.timezone.america.rio_branco"><![CDATA[(UTC-05:00) Rio Branco]]></item>\r
-               <item name="wcf.global.date.timezone.america.caracas"><![CDATA[(UTC-04:30) Caracas]]></item>\r
-               <item name="wcf.global.date.timezone.america.asuncion"><![CDATA[(UTC-04:00) Asuncion]]></item>\r
-               <item name="wcf.global.date.timezone.america.halifax"><![CDATA[(UTC-04:00) Atlantic (Kanada)]]></item>\r
-               <item name="wcf.global.date.timezone.america.cuiaba"><![CDATA[(UTC-04:00) Cuiaba]]></item>\r
-               <item name="wcf.global.date.timezone.america.la_paz"><![CDATA[(UTC-04:00) Georgetown, La Paz, Manaus, San Juan]]></item>\r
-               <item name="wcf.global.date.timezone.america.santiago"><![CDATA[(UTC-04:00) Santiago]]></item>\r
-               <item name="wcf.global.date.timezone.america.st_johns"><![CDATA[(UTC-03:30) Neufundland]]></item>\r
-               <item name="wcf.global.date.timezone.america.sao_paulo"><![CDATA[(UTC-03:00) Brasilia]]></item>\r
-               <item name="wcf.global.date.timezone.america.argentina.buenos_aires"><![CDATA[(UTC-03:00) Buenos Aires]]></item>\r
-               <item name="wcf.global.date.timezone.america.cayenne"><![CDATA[(UTC-03:00) Cayenne, Fortaleza]]></item>\r
-               <item name="wcf.global.date.timezone.america.godthab"><![CDATA[(UTC-03:00) Grönland]]></item>\r
-               <item name="wcf.global.date.timezone.america.montevideo"><![CDATA[(UTC-03:00) Montevideo]]></item>\r
-               <item name="wcf.global.date.timezone.atlantic.south_georgia"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>\r
-               <item name="wcf.global.date.timezone.atlantic.azores"><![CDATA[(UTC-01:00) Azoren]]></item>\r
-               <item name="wcf.global.date.timezone.atlantic.cape_verde"><![CDATA[(UTC-01:00) Kap Verde]]></item>\r
-               <item name="wcf.global.date.timezone.africa.casablanca"><![CDATA[(UTC) Casablanca]]></item>\r
-               <item name="wcf.global.date.timezone.europe.london"><![CDATA[(UTC) Dublin, Edinburgh, Lissabon, London]]></item>\r
-               <item name="wcf.global.date.timezone.africa.monrovia"><![CDATA[(UTC) Monrovia, Reykjavik]]></item>\r
-               <item name="wcf.global.date.timezone.europe.berlin"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien]]></item>\r
-               <item name="wcf.global.date.timezone.europe.belgrade"><![CDATA[(UTC+01:00) Belgrad, Bratislava, Bupdapest, Ljubljana, Prag]]></item>\r
-               <item name="wcf.global.date.timezone.europe.paris"><![CDATA[(UTC+01:00) Brüssel, Kopenhagen, Madrid, Paris]]></item>\r
-               <item name="wcf.global.date.timezone.europe.sarajevo"><![CDATA[(UTC+01:00) Sarajevo, Skopje, Warschau, Zagreb]]></item>\r
-               <item name="wcf.global.date.timezone.africa.algiers"><![CDATA[(UTC+01:00) West-Zentralafrika]]></item>\r
-               <item name="wcf.global.date.timezone.africa.windhoek"><![CDATA[(UTC+01:00) Windhuk]]></item>\r
-               <item name="wcf.global.date.timezone.asia.amman"><![CDATA[(UTC+02:00) Amman]]></item>\r
-               <item name="wcf.global.date.timezone.europe.athens"><![CDATA[(UTC+02:00) Athen, Bukarest, Istanbul]]></item>\r
-               <item name="wcf.global.date.timezone.asia.beirut"><![CDATA[(UTC+02:00) Beirut]]></item>\r
-               <item name="wcf.global.date.timezone.asia.damascus"><![CDATA[(UTC+02:00) Damaskus]]></item>\r
-               <item name="wcf.global.date.timezone.africa.harare"><![CDATA[(UTC+02:00) Harare, Pretoria]]></item>\r
-               <item name="wcf.global.date.timezone.europe.helsinki"><![CDATA[(UTC+02:00) Helsinki, Kiew, Riga, Sofia, Tallinn, Wilna]]></item>\r
-               <item name="wcf.global.date.timezone.asia.jerusalem"><![CDATA[(UTC+02:00) Jerusalem]]></item>\r
-               <item name="wcf.global.date.timezone.africa.cairo"><![CDATA[(UTC+02:00) Kairo]]></item>\r
-               <item name="wcf.global.date.timezone.europe.minsk"><![CDATA[(UTC+02:00) Minsk]]></item>\r
-               <item name="wcf.global.date.timezone.asia.baghdad"><![CDATA[(UTC+03:00) Bagdad]]></item>\r
-               <item name="wcf.global.date.timezone.asia.kuwait"><![CDATA[(UTC+03:00) Kuwait, Riad]]></item>\r
-               <item name="wcf.global.date.timezone.europe.moscow"><![CDATA[(UTC+03:00) Moskau, St. Petersburg, Wolgograd]]></item>\r
-               <item name="wcf.global.date.timezone.africa.nairobi"><![CDATA[(UTC+03:00) Nairobi]]></item>\r
-               <item name="wcf.global.date.timezone.asia.tehran"><![CDATA[(UTC+03:30) Teheran]]></item>\r
-               <item name="wcf.global.date.timezone.asia.muscat"><![CDATA[(UTC+04:00) Abu Dhabi, Muskat]]></item>\r
-               <item name="wcf.global.date.timezone.asia.baku"><![CDATA[(UTC+04:00) Baku]]></item>\r
-               <item name="wcf.global.date.timezone.asia.yerevan"><![CDATA[(UTC+04:00) Eriwan]]></item>\r
-               <item name="wcf.global.date.timezone.indian.mauritius"><![CDATA[(UTC+04:00) Port Louis]]></item>\r
-               <item name="wcf.global.date.timezone.asia.tbilisi"><![CDATA[(UTC+04:00) Tiflis]]></item>\r
-               <item name="wcf.global.date.timezone.asia.kabul"><![CDATA[(UTC+04:30) Kabul]]></item>\r
-               <item name="wcf.global.date.timezone.asia.karachi"><![CDATA[(UTC+05:00) Islamabad, Karatschi]]></item>\r
-               <item name="wcf.global.date.timezone.asia.yekaterinburg"><![CDATA[(UTC+05:00) Jekaterinburg]]></item>\r
-               <item name="wcf.global.date.timezone.asia.tashkent"><![CDATA[(UTC+05:00) Taschkent]]></item>\r
-               <item name="wcf.global.date.timezone.asia.kolkata"><![CDATA[(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi]]></item>\r
-               <item name="wcf.global.date.timezone.asia.colombo"><![CDATA[(UTC+05:30) Sri Jayawardenepura]]></item>\r
-               <item name="wcf.global.date.timezone.asia.katmandu"><![CDATA[(UTC+05:45) Katmandu]]></item>\r
-               <item name="wcf.global.date.timezone.asia.almaty"><![CDATA[(UTC+06:00) Astana]]></item>\r
-               <item name="wcf.global.date.timezone.asia.dhaka"><![CDATA[(UTC+06:00) Dakka]]></item>\r
-               <item name="wcf.global.date.timezone.asia.novosibirsk"><![CDATA[(UTC+06:00) Nowosibirsk]]></item>\r
-               <item name="wcf.global.date.timezone.asia.rangoon"><![CDATA[(UTC+06:30) Yangon (Rangun)]]></item>\r
-               <item name="wcf.global.date.timezone.asia.bangkok"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta]]></item>\r
-               <item name="wcf.global.date.timezone.asia.krasnoyarsk"><![CDATA[(UTC+07:00) Krasnojarsk]]></item>\r
-               <item name="wcf.global.date.timezone.asia.irkutsk"><![CDATA[(UTC+08:00) Irkutsk]]></item>\r
-               <item name="wcf.global.date.timezone.asia.kuala_lumpur"><![CDATA[(UTC+08:00) Kuala Lumpur, Singapur]]></item>\r
-               <item name="wcf.global.date.timezone.asia.chongqing"><![CDATA[(UTC+08:00) Peking, Chongqing, Hongkong, Urumchi]]></item>\r
-               <item name="wcf.global.date.timezone.australia.perth"><![CDATA[(UTC+08:00) Perth]]></item>\r
-               <item name="wcf.global.date.timezone.asia.taipei"><![CDATA[(UTC+08:00) Taipeh]]></item>\r
-               <item name="wcf.global.date.timezone.asia.ulaanbaatar"><![CDATA[(UTC+08:00) Ulan-Bator]]></item>\r
-               <item name="wcf.global.date.timezone.asia.yakutsk"><![CDATA[(UTC+09:00) Jakutsk]]></item>\r
-               <item name="wcf.global.date.timezone.asia.tokyo"><![CDATA[(UTC+09:00) Osaka, Sapporo, Tokio]]></item>\r
-               <item name="wcf.global.date.timezone.asia.seoul"><![CDATA[(UTC+09:00) Seoul]]></item>\r
-               <item name="wcf.global.date.timezone.australia.adelaide"><![CDATA[(UTC+09:30) Adelaide]]></item>\r
-               <item name="wcf.global.date.timezone.australia.darwin"><![CDATA[(UTC+09:30) Darwin]]></item>\r
-               <item name="wcf.global.date.timezone.australia.brisbane"><![CDATA[(UTC+10:00) Brisbane]]></item>\r
-               <item name="wcf.global.date.timezone.australia.sydney"><![CDATA[(UTC+10:00) Canberra, Melbourne, Sydney]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.guam"><![CDATA[(UTC+10:00) Guam, Port Moresby]]></item>\r
-               <item name="wcf.global.date.timezone.australia.hobart"><![CDATA[(UTC+10:00) Hobart]]></item>\r
-               <item name="wcf.global.date.timezone.asia.vladivostok"><![CDATA[(UTC+10:00) Wladiwostok]]></item>\r
-               <item name="wcf.global.date.timezone.asia.magadan"><![CDATA[(UTC+11:00) Magadan]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.noumea"><![CDATA[(UTC+11:00) Salomonen, Neu-Kaledonien]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.auckland"><![CDATA[(UTC+12:00) Auckland, Wellington]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.fiji"><![CDATA[(UTC+12:00) Fidschi]]></item>\r
-               <item name="wcf.global.date.timezone.asia.kamchatka"><![CDATA[(UTC+12:00) Kamtschatka]]></item>\r
-               <item name="wcf.global.date.timezone.pacific.tongatapu"><![CDATA[(UTC+13:00) Nuku'alofa]]></item>\r
-       </category>\r
-       <category name="wcf.imageViewer">\r
-               <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Bild " + (this.currentIndex + 1) + " von " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>\r
-               <item name="wcf.imageViewer.close"><![CDATA[Schließen]]></item>\r
-               <item name="wcf.imageViewer.enlarge"><![CDATA[Nur dieses Bild anzeigen (beendet die Bildbetrachtung)]]></item>\r
-               <item name="wcf.imageViewer.next"><![CDATA[Nächstes Bild]]></item>\r
-               <item name="wcf.imageViewer.pause"><![CDATA[Diashow stoppen]]></item>\r
-               <item name="wcf.imageViewer.play"><![CDATA[Diashow starten (Bildwechsel alle 5 Sekunden)]]></item>\r
-               <item name="wcf.imageViewer.previous"><![CDATA[Vorheriges Bild]]></item>\r
-       </category>\r
-       <category name="wcf.option">\r
-               <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Kanarische Inseln, Lissabon, London, Monrovia, Ouagadougou, Reykjav&iacute;k]]></item>\r
-               <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brüssel, Kopenhagen, Madrid, Paris, Prag, Rom, Sarajevo, Stockholm, Tunis, Warschau, Wien]]></item>\r
-               <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athen, Beirut, Bukarest, Helsinki, Istanbul, Jerusalem, Kairo, Kapstadt, Khartum, Kiew, Minsk, Sofia]]></item>\r
-               <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Abeba, Antananarivo, Bagdad, Daressalam, Kampala, Kuwait, Mogadischu, Moskau, Nairobi, Riad]]></item>\r
-               <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Teheran]]></item>\r
-               <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Eriwan, Maskat, R&eacute;union, Tiflis]]></item>\r
-               <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>\r
-               <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Asgabat, Bischkek, Duschanbe, Islamabad, Jekaterinburg, Karatschi, Malediven, Taschkent]]></item>\r
-               <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, Neu-Delhi]]></item>\r
-               <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>\r
-               <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Nowosibirsk]]></item>\r
-               <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Kokosinseln, Rangun]]></item>\r
-               <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnojarsk, Vientiane]]></item>\r
-               <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hongkong, Irkutsk, Kuala Lumpur, Manila, Peking, Perth, Singapur, Taipeh, Ulan Bator]]></item>\r
-               <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Australien)]]></item>\r
-               <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Jakutsk, Osaka, Pjöngjang, Sapporo, Seoul, Tokyo]]></item>\r
-               <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>\r
-               <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Wladiwostok]]></item>\r
-               <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord-Howe-Insel (Australien)]]></item>\r
-               <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, Neukaledonien, Salomonen]]></item>\r
-               <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolkinsel]]></item>\r
-               <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, Bairiki, Fidschi, Kamtschatka, Marshall-Inseln, Wellington]]></item>\r
-               <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham-Inseln (Neuseeland)]]></item>\r
-               <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenixinseln]]></item>\r
-               <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Linieninseln, Weihnachtsinsel]]></item>\r
-               <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azoren, Kapverdische Inseln]]></item>\r
-               <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>\r
-               <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Bras&iacute;lia, Buenos Aires, Cayenne, Georgetown, Grönland, Montevideo]]></item>\r
-               <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Neufundland]]></item>\r
-               <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Asunci&oacute;n, Atlantik (Kanada), La Paz, Port-of-Spain, Santiago]]></item>\r
-               <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>\r
-               <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Atlanta, Bogot&aacute;, Detroit, Lima, Miami, New York, San Francisco de Quito, Toronto]]></item>\r
-               <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Chicago, Dallas, Kansas City, Mexiko-Stadt, Winnipeg, Zentralamerika]]></item>\r
-               <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Arizona, Calgary, Chihuahua, Denver, Mazatlan, Salt Lake City]]></item>\r
-               <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Los Angeles, Seattle, Tijuana, Vancouver]]></item>\r
-               <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>\r
-               <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) Französisch-Polynesien]]></item>\r
-               <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cookinseln, Hawaii]]></item>\r
-               <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midwayinseln, Samoa]]></item>\r
-               <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Eniwetok, Kwajalein]]></item>\r
-       </category>\r
-       <category name="wcf.page">\r
-               <item name="wcf.page.pageNo"><![CDATA[Seite {#$pageNo}]]></item>\r
-       </category>\r
-       <category name="wcf.user">\r
-               <item name="wcf.user.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>\r
-               <item name="wcf.user.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>\r
-               <item name="wcf.user.email"><![CDATA[E-Mail-Adresse]]></item>\r
-               <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch.]]></item>\r
-               <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>\r
-               <item name="wcf.user.error.email.notUnique"><![CDATA[Diese E-Mail-Adresse ist bereits durch einen anderen Benutzer vergeben.]]></item>\r
-               <item name="wcf.user.error.email.notValid"><![CDATA[Sie haben eine ungültige E-Mail-Adresse eingegeben.]]></item>\r
-               <item name="wcf.user.error.password.false"><![CDATA[Dieses Kennwort ist falsch.]]></item>\r
-               <item name="wcf.user.error.username.notFound"><![CDATA[Der Benutzername &raquo;{$username}&laquo; konnte nicht gefunden werden.]]></item>\r
-               <item name="wcf.user.error.username.notUnique"><![CDATA[Dieser Benutzername ist bereits vergeben.]]></item>\r
-               <item name="wcf.user.error.username.notValid"><![CDATA[Sie haben einen ungültigen Benutzernamen eingegeben.]]></item>\r
-               <item name="wcf.user.language"><![CDATA[Sprache]]></item>\r
-               <item name="wcf.user.language.description"><![CDATA[Bitte wählen Sie aus, in welcher Sprache die Benutzeroberfläche erscheinen soll!]]></item>\r
-               <item name="wcf.user.logout"><![CDATA[Abmelden]]></item>\r
-               <item name="wcf.user.password"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.user.registrationDate"><![CDATA[Registrierungsdatum]]></item>\r
-               <item name="wcf.user.userID"><![CDATA[Benutzer-ID]]></item>\r
-               <item name="wcf.user.username"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.user.visibleLanguages"><![CDATA[Zeige Inhalte in folgenden Sprachen an]]></item>\r
-               <item name="wcf.user.visibleLanguages.description"><![CDATA[Geben Sie an, in welchen Sprachen erstellte Inhalte angezeigt werden sollen.]]></item>\r
-       </category>\r
-       <category name="wcf.user.option">\r
-               <item name="wcf.user.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>\r
-       </category>\r
-</language>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de">
+       <category name="wcf.acp">
+               <item name="wcf.acp"><![CDATA[Administrationsoberfläche]]></item>
+               <item name="wcf.acp.help"><![CDATA[Hilfe]]></item>
+               <item name="wcf.acp.help.complete"><![CDATA[Vollständige Hilfe]]></item>
+               <item name="wcf.acp.help.disable"><![CDATA[Hilfe deaktivieren]]></item>
+               <item name="wcf.acp.help.interactive"><![CDATA[Interaktive Hilfe]]></item>
+               <item name="wcf.acp.packageQuickAccess"><![CDATA[Paket wechseln]]></item>
+               <item name="wcf.acp.search.extended"><![CDATA[Erweiterte Suche ...]]></item>
+               <item name="wcf.acp.sitemap"><![CDATA[Sitemap]]></item>
+       </category>
+       <category name="wcf.acp.cache">
+               <item name="wcf.acp.cache.button.clear"><![CDATA[Cache leeren]]></item>
+               <item name="wcf.acp.cache.clear.success"><![CDATA[Der Cache wurde erfolgreich gelöscht.]]></item>
+               <item name="wcf.acp.cache.clear.sure"><![CDATA[Wollen Sie den Cache wirklich komplett leeren?]]></item>
+               <item name="wcf.acp.cache.data"><![CDATA[Eigenschaften]]></item>
+               <item name="wcf.acp.cache.data.files"><![CDATA[Dateien]]></item>
+               <item name="wcf.acp.cache.data.size"><![CDATA[Größe]]></item>
+               <item name="wcf.acp.cache.data.source"><![CDATA[Quelle]]></item>
+               <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>
+               <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.cache.list.mtime"><![CDATA[Letzte Aktualisierung]]></item>
+               <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>
+               <item name="wcf.acp.cache.list.perm"><![CDATA[Zugriffsrechte]]></item>
+               <item name="wcf.acp.cache.list.size"><![CDATA[Größe]]></item>
+       </category>
+       <category name="wcf.acp.cronjob">
+               <item name="wcf.acp.cronjob.active"><![CDATA[Aktiv]]></item>
+               <item name="wcf.acp.cronjob.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>
+               <item name="wcf.acp.cronjob.add.data"><![CDATA[Allgemeine Daten]]></item>
+               <item name="wcf.acp.cronjob.add.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde hinzugefügt.]]></item>
+               <item name="wcf.acp.cronjob.add.timing"><![CDATA[Zeitsteuerung]]></item>
+               <item name="wcf.acp.cronjob.className"><![CDATA[Pfad zur Klasse]]></item>
+               <item name="wcf.acp.cronjob.className.description"><![CDATA[Geben Sie den Pfad zu der PHP-Datei an, die die entsprechende auszuführende Klasse enthält. Die Pfadangabe muss relativ zum Installationsverzeichnis der ausgewählten Endanwendung sein.]]></item>
+               <item name="wcf.acp.cronjob.cronjobID"><![CDATA[ID]]></item>
+               <item name="wcf.acp.cronjob.delete"><![CDATA[Zeitgesteuerte Aufgabe löschen]]></item>
+               <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht gelöscht werden.]]></item>
+               <item name="wcf.acp.cronjob.delete.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde gelöscht.]]></item>
+               <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Sind Sie sicher, dass Sie diese zeitgesteuerte Aufgabe löschen möchten?]]></item>
+               <item name="wcf.acp.cronjob.description"><![CDATA[Beschreibung]]></item>
+               <item name="wcf.acp.cronjob.description.description"><![CDATA[Hier können Sie eine kurze Beschreibung der Aufgabe eintragen.]]></item>
+               <item name="wcf.acp.cronjob.disable"><![CDATA[Deaktivieren]]></item>
+               <item name="wcf.acp.cronjob.edit"><![CDATA[Zeitgesteuerte Aufgabe bearbeiten]]></item>
+               <item name="wcf.acp.cronjob.edit.data"><![CDATA[Allgemeine Daten]]></item>
+               <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht verändert werden.]]></item>
+               <item name="wcf.acp.cronjob.edit.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde erfolgreich geändert.]]></item>
+               <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Zeitsteuerung]]></item>
+               <item name="wcf.acp.cronjob.enable"><![CDATA[Aktivieren]]></item>
+               <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[Der angegebene Pfad ist ungültig.]]></item>
+               <item name="wcf.acp.cronjob.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>
+               <item name="wcf.acp.cronjob.error.notValid"><![CDATA[Das Zeitformat ist ungültig.]]></item>
+               <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Zeitgesteuerte Aufgabe mehrfach ausführen]]></item>
+               <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[Durch Aktivieren dieser Option wird die Aufgabe mehrfach ausgeführt, wenn zwischen dem letzten Ausführungszeitpunkt und dem aktuellen Zeitpunkt weitere Ausführungszeitpunkte liegen.]]></item>
+               <item name="wcf.acp.cronjob.execute"><![CDATA[Aufgabe jetzt ausführen]]></item>
+               <item name="wcf.acp.cronjob.execute.success"><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt.]]></item>
+               <item name="wcf.acp.cronjob.inactive"><![CDATA[Inaktiv]]></item>
+               <item name="wcf.acp.cronjob.info"><![CDATA[Allgemeine Informationen]]></item>
+               <item name="wcf.acp.cronjob.intro"><![CDATA[Das Anlegen von zeitgesteuerten Aufgaben erfordert eine genaue Kenntnis der Crontab-Syntax auf unixähnlichen Systemen. Weiterführende Informationen dazu erhalten Sie auf dieser Website: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>]]></item>
+               <item name="wcf.acp.cronjob.lastExec"><![CDATA[Letzte Ausführung]]></item>
+               <item name="wcf.acp.cronjob.list"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+               <item name="wcf.acp.cronjob.list.count"><![CDATA[Insgesamt {#$items} zeitgesteuerte Aufgabe{if $items != 1}n{/if}]]></item>
+               <item name="wcf.acp.cronjob.log"><![CDATA[Protokoll der ausgeführten zeitgesteuerten Aufgaben]]></item>
+               <item name="wcf.acp.cronjob.log.clear"><![CDATA[Alle löschen]]></item>
+               <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Sind Sie sicher, dass Sie alle Protokoll-Einträge löschen möchten?]]></item>
+               <item name="wcf.acp.cronjob.log.data"><![CDATA[Insgesamt {#$items} {if $items == 1}Eintrag{else}Einträge{/if}]]></item>
+               <item name="wcf.acp.cronjob.log.error"><![CDATA[Fehler:]]></item>
+               <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Ausgeführt]]></item>
+               <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[Derzeit sind keine Einträge vorhanden.]]></item>
+               <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>
+               <item name="wcf.acp.cronjob.nextExec"><![CDATA[Nächste Ausführung]]></item>
+               <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[Derzeit ist keine zeitgesteuerte Aufgabe vorhanden.]]></item>
+               <item name="wcf.acp.cronjob.packageName"><![CDATA[Installiert von]]></item>
+               <item name="wcf.acp.cronjob.runNow"><![CDATA[Jetzt ausführen]]></item>
+               <item name="wcf.acp.cronjob.startDom"><![CDATA[Tag des Monats]]></item>
+               <item name="wcf.acp.cronjob.startDom.description"><![CDATA[An diesen Tagen des Monats (1 - 31) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>
+               <item name="wcf.acp.cronjob.startDow"><![CDATA[Tag der Woche]]></item>
+               <item name="wcf.acp.cronjob.startDow.description"><![CDATA[An diesen Tagen der Woche (0 - 6 mit Sonntag = 0 oder mon - sun) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>
+               <item name="wcf.acp.cronjob.startHour"><![CDATA[Stunde]]></item>
+               <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Zu diesen Stunden (0 - 23) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>
+               <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>
+               <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Zu diesen Minuten (0 - 59) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>
+               <item name="wcf.acp.cronjob.startMonth"><![CDATA[Monat]]></item>
+               <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[In diesen Monaten (1 - 12 oder jan - dec) soll die Aufgabe ausgeführt werden.]]></item>
+               <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>
+               <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>
+               <item name="wcf.acp.cronjob.subtitle"><![CDATA[&raquo;Cronjobs&laquo;]]></item>
+       </category>
+       <category name="wcf.acp.group">
+               <item name="wcf.acp.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>
+               <item name="wcf.acp.group.add.permissions"><![CDATA[Zugriffsrechte]]></item>
+               <item name="wcf.acp.group.add.success"><![CDATA[Die Benutzergruppe wurde erfolgreich angelegt.]]></item>
+               <item name="wcf.acp.group.administrators"><![CDATA[Administratoren]]></item>
+               <item name="wcf.acp.group.data"><![CDATA[Allgemeine Daten]]></item>
+               <item name="wcf.acp.group.delete"><![CDATA[Benutzergruppe löschen]]></item>
+               <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}Die Benutzergruppe wurde{else}{#$deletedGroups} Benutzergruppen wurden{/if} erfolgreich gelöscht.]]></item>
+               <item name="wcf.acp.group.delete.sure"><![CDATA[Wollen Sie diese Benutzergruppe wirklich löschen?]]></item>
+               <item name="wcf.acp.group.edit"><![CDATA[Benutzergruppe bearbeiten]]></item>
+               <item name="wcf.acp.group.edit.success"><![CDATA[Ihre Änderungen an der Benutzergruppe wurde erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[Sie sind selbst Mitglied dieser Benutzergruppe. Änderungen an den Zugriffsrechten dieser Benutzergruppe können womöglich dazu führen, dass Sie aus der Administrationsoberfläche ausgeschlossen werden. Bitte seien Sie entsprechend vorsichtig!]]></item>
+               <item name="wcf.acp.group.everyone"><![CDATA[Jeder]]></item>
+               <item name="wcf.acp.group.groupID"><![CDATA[Gruppen-ID]]></item>
+               <item name="wcf.acp.group.groupName"><![CDATA[Name der Benutzergruppe]]></item>
+               <item name="wcf.acp.group.groupName.description"><![CDATA[Geben Sie einen Namen für die Gruppe an.]]></item>
+               <item name="wcf.acp.group.guests"><![CDATA[Gäste]]></item>
+               <item name="wcf.acp.group.list"><![CDATA[Benutzergruppen]]></item>
+               <item name="wcf.acp.group.list.data"><![CDATA[Insgesamt {#$items} Benutzergruppen]]></item>
+               <item name="wcf.acp.group.members"><![CDATA[Anzahl Mitglieder]]></item>
+               <item name="wcf.acp.group.moderators"><![CDATA[Moderatoren]]></item>
+               <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Kann Administrationsoberfläche betreten]]></item>
+               <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Mitglieder dieser Benutzergruppe können die Administrationsoberfläche betreten und dort abhängig von den weiteren Zugriffsrechten verschiedene Aktionen durchführen. Diese Option muss aktiviert sein, wenn diesen Benutzern andere administrative Funktionen erlaubt werden sollen.]]></item>
+               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Kann versteckte Profilinformationen sehen]]></item>
+               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Mitglieder dieser Benutzergruppe können die versteckten Informationen in Benutzerprofilen sehen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Kann allgemeine Einstellungen vornehmen]]></item>
+               <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Mitglieder dieser Benutzergruppe können die allgemeinen System-Einstellungen sehen und bearbeiten. Z.B. Forum ein-/ausschalten.]]></item>
+               <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Kann Protokolle abrufen]]></item>
+               <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können die System-Protokolle abrufen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Kann neue zeitgesteuerte Aufgaben anlegen]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue zeitgesteuerte Aufgaben anlegen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben löschen]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben löschen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Kann Protokoll der zeitgesteuerten Aufgaben löschen]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Protokoll der zeitgesteuerten Aufgaben löschen. Bei der Ausführung einer zeitgesteuerten Aufgabe wird festgehalten, ob dieser erfolgreich ausgeführt wurde.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben ändern]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben deaktivieren]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben deaktivieren. Diese werden dann nicht mehr ausgeführt, können später jedoch auch wieder aktiviert werden.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Kann Update-Server bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Update-Server bearbeiten und neue hinzufügen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Kann Pakete installieren]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können zusätzliche Pakete installieren.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Kann Pakete deinstallieren]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete entfernen.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Kann Pakete aktualisieren]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete aktualisieren.]]></item>
+               <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Zugängliche Benutzergruppen]]></item>
+               <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Mitglieder dieser Benutzergruppe haben auf diese Gruppen Zugriff. Zusätzlich muss angegeben werden, ob z.B. die Benutzergruppe bearbeitet werden darf.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Kann neue Benutzergruppen erstellen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzergruppen erstellen.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Kann neue Benutzer erstellen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzer erstellen. Ist bei "Zugängliche Benutzergruppen" eine Option aktiviert, kann diese Gruppe beim Erstellen des Benutzers zugewiesen werden.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Kann Benutzergruppen löschen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen löschen.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Kann Benutzer löschen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer löschen.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Kann Benutzergruppen bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Kann E-Mail-Adressen bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Kann Kennwörter bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Kennwort von anderen Benutzern bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Kann Benutzer bearbeiten]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer bearbeiten.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Kann E-Mails an Benutzer senden]]></item>
+               <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern sehen und ihnen E-Mails senden.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Kann Benutzer suchen]]></item>
+               <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer und deren Profile durchsuchen.]]></item>
+               <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrative Rechte]]></item>
+               <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Inhalte]]></item>
+               <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Darstellung]]></item>
+               <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.general"><![CDATA[Allgemeine administrative Rechte]]></item>
+               <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Wartung]]></item>
+               <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System-Funktionen]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Paketverwaltung]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user"><![CDATA[Benutzer-Funktionen]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Gruppenverwaltung]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[Benutzerverwaltung]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderative Rechte]]></item>
+               <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.user"><![CDATA[Allgemeine Rechte]]></item>
+               <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>
+               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Kann deaktivierte Stile benutzen]]></item>
+               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Mitglieder dieser Benutzergruppe können deaktivierte Stile auswählen.]]></item>
+               <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Stil-Verwaltung]]></item>
+               <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.showMembers"><![CDATA[Zeige die Mitglieder dieser Benutzergruppe]]></item>
+               <item name="wcf.acp.group.superModerators"><![CDATA[Super Moderatoren]]></item>
+               <item name="wcf.acp.group.users"><![CDATA[Registrierte Benutzer]]></item>
+       </category>
+       <category name="wcf.acp.login">
+               <item name="wcf.acp.login"><![CDATA[Anmeldung]]></item>
+               <item name="wcf.acp.login.data"><![CDATA[Zugangsdaten]]></item>
+       </category>
+       <category name="wcf.acp.masterPassword">
+               <item name="wcf.acp.masterPassword"><![CDATA[Hauptkennwort]]></item>
+               <item name="wcf.acp.masterPassword.confirm"><![CDATA[Hauptkennwort wiederholen]]></item>
+               <item name="wcf.acp.masterPassword.enter"><![CDATA[Hauptkennwort erforderlich]]></item>
+               <item name="wcf.acp.masterPassword.enter.description"><![CDATA[Die aufgerufene Seite oder Aktion erfordert aus Sicherheitsgründen die Eingabe des Hauptkennwortes. Pro Sitzung ist die Eingabe des Hauptkennwortes nur einmal erforderlich. Falls Sie das Hauptkennwort vergessen haben sollten, können Sie es zurücksetzen, indem Sie die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschen.]]></item>
+               <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[Das Hauptkennwort ist nicht korrekt. Falls Sie das Hauptkennwort vergessen haben sollten, können Sie es zurücksetzen, indem Sie die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschen.]]></item>
+               <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>
+               <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[Das Kennwort wurde als unsicher erkannt. Das Kennwort sollte mindestens acht Zeichen lang sein, große und kleine lateinische Buchstaben, Zahlen und Sonderzeichen enthalten. Es darf nicht mit den Kennwörtern von anderen Administratoren übereinstimmen.]]></item>
+               <item name="wcf.acp.masterPassword.example"><![CDATA[Vorschlag]]></item>
+               <item name="wcf.acp.masterPassword.example.set"><![CDATA[Vorschlag übernehmen]]></item>
+               <item name="wcf.acp.masterPassword.init"><![CDATA[Hauptkennwort festlegen]]></item>
+               <item name="wcf.acp.masterPassword.init.description"><![CDATA[Das Hauptkennwort ist ein zusätzlicher Schutz für sicherheitskritische Funktionen. Sie sollten hier ein möglichst sicheres Kennwort verwenden, dass sich von Ihrem normalen Administrator-Kennwort unterscheidet, Dritten nicht bekannt ist und auch nicht auf anderen Internetseiten verwendet wird.]]></item>
+       </category>
+       <category name="wcf.acp.menu">
+               <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatisches Update]]></item>
+               <item name="wcf.acp.menu.link.content"><![CDATA[Inhalte]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[Zeitgesteuerte Aufgaben auflisten]]></item>
+               <item name="wcf.acp.menu.link.display"><![CDATA[Darstellung]]></item>
+               <item name="wcf.acp.menu.link.group"><![CDATA[Benutzergruppen]]></item>
+               <item name="wcf.acp.menu.link.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>
+               <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-Mail an Gruppenmitglieder]]></item>
+               <item name="wcf.acp.menu.link.group.view"><![CDATA[Benutzergruppen auflisten]]></item>
+               <item name="wcf.acp.menu.link.log"><![CDATA[Protokoll]]></item>
+               <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.menu.link.log.session"><![CDATA[Sitzungen]]></item>
+               <item name="wcf.acp.menu.link.maintenance"><![CDATA[Wartung]]></item>
+               <item name="wcf.acp.menu.link.option"><![CDATA[Optionen]]></item>
+               <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Sichern &amp; Wiederherstellen]]></item>
+               <item name="wcf.acp.menu.link.package"><![CDATA[Paketverwaltung]]></item>
+               <item name="wcf.acp.menu.link.package.database"><![CDATA[Pakete suchen]]></item>
+               <item name="wcf.acp.menu.link.package.install"><![CDATA[Paket installieren]]></item>
+               <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Server hinzufügen]]></item>
+               <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server auflisten]]></item>
+               <item name="wcf.acp.menu.link.package.view"><![CDATA[Pakete auflisten]]></item>
+               <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>
+               <item name="wcf.acp.menu.link.user"><![CDATA[Benutzer]]></item>
+               <item name="wcf.acp.menu.link.user.add"><![CDATA[Benutzer hinzufügen]]></item>
+               <item name="wcf.acp.menu.link.user.list"><![CDATA[Benutzer auflisten]]></item>
+               <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-Mail an alle Benutzer]]></item>
+               <item name="wcf.acp.menu.link.user.management"><![CDATA[Benutzer]]></item>
+               <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>
+               <item name="wcf.acp.menu.link.user.search"><![CDATA[Benutzer suchen]]></item>
+       </category>
+       <category name="wcf.acp.option">
+               <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Hostname ausschließen]]></item>
+               <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Geben Sie pro Zeile einen Hostname an, die Sie von der Seite ausschließen möchten.]]></item>
+               <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[IP-Adresse ausschließen]]></item>
+               <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Geben Sie pro Zeile eine IP-Adresse an, die Sie von der Seite ausschließen möchten.]]></item>
+               <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Browser-Kennung ausschließen]]></item>
+               <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Geben Sie pro Zeile eine Browser-Kennung (User-Agent) an, die Sie von der Seite ausschließen möchten.]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache-Server]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Geben Sie hier die Adresse des Memcache-Servers ein! Mehrere Server können zeilenweise angegeben werden.]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Persistente Verbindungen aktivieren]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[Sollen beim Verbinden mit dem Memcache-Server persistente Verbindungen genutzt werden?]]></item>
+               <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache-Methode]]></item>
+               <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>
+               <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Bitte wählen Sie die gewünschte Cache-Methode aus! Beachten Sie, dass einige Methoden spezielle Anforderungen an das Server-System stellen und nicht auf jedem Server zur Verfügung stehen.]]></item>
+               <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[Dateisystem (Standard)]]></item>
+               <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (Experimentell)]]></item>
+               <item name="wcf.acp.option.category.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.cache.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>
+               <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache speichert häufig benötige Daten im Arbeitsspeicher zwischen. Dies kann die Last auf die Datenbank und das Dateisystem drastisch reduzieren. Lesen Sie mehr über dieses Thema auf der folgenden Seite:
+<ul>
+       <li><a href="http://memcached.org/">memcached.org</a></li>
+</ul>]]></item>
+               <item name="wcf.acp.option.category.general.date"><![CDATA[Datum &amp; Zeit]]></item>
+               <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>
+               <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>
+               <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>
+               <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy-Server]]></item>
+               <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[Hier können Sie optional Proxy-Server für Verbindungen zu externen Servern konfigurieren.]]></item>
+               <item name="wcf.acp.option.category.general.mail"><![CDATA[E-Mails]]></item>
+               <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.mail.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Versand]]></item>
+               <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.offline"><![CDATA[Wartungsmodus]]></item>
+               <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module"><![CDATA[Module an / aus]]></item>
+               <item name="wcf.acp.option.category.module.content"><![CDATA[Inhalte]]></item>
+               <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.display"><![CDATA[Darstellung]]></item>
+               <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>
+               <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.user"><![CDATA[Benutzer]]></item>
+               <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security"><![CDATA[Sicherheit]]></item>
+               <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>
+               <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internetseiten werden häufig durch andere Programme angegriffen. So gibt es beispielsweise die Möglichkeit, automatisiert hunderte von Benutzerkonten zu erstellen. Um sich davor zu schützen, können Sie an verschiedenen Stellen ein sogenanntes <a href="http://de.wikipedia.org/wiki/Captcha" class="externalURL">Captcha-Bild</a> anzeigen lassen. Unregistrierte Benutzer müssen erst den Code eingeben, der auf diesem Bild steht. Roboter können diesen Code nicht lesen. Beachten Sie, dass Captcha-Bilder von blinden und sehbehinderten Benutzern nicht identifiziert werden können.]]></item>
+               <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>
+               <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.censorship"><![CDATA[Zensur]]></item>
+               <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sitzungen]]></item>
+               <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.user"><![CDATA[Mitglieder]]></item>
+               <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookiedomain]]></item>
+               <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Hier können Sie optional eine Domain angeben, unter der der Cookie laufen soll. Standardmäßig sollten Sie dieses Feld frei lassen, da ein Ausfüllen nur in wenigen Fällen notwendig ist.]]></item>
+               <item name="wcf.acp.option.cookie_path"><![CDATA[Cookiepfad]]></item>
+               <item name="wcf.acp.option.cookie_path.description"><![CDATA[Der Cookiepfad wird absolut zum Document Root angegeben - also z.B. "/forum" für http://www.woltlab.de/forum.]]></item>
+               <item name="wcf.acp.option.cookie_prefix"><![CDATA[Präfix für Cookienamen]]></item>
+               <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Geben Sie einen Präfix an, der bei Cookienamen verwendet wird.]]></item>
+               <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Uhr automatisch auf Sommer-/Winterzeit umstellen]]></item>
+               <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Soll die Uhr automatisch auf Sommer-/Winterzeit umgestellt werden?]]></item>
+               <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Cache-Methode für Sitzungsdaten verwenden]]></item>
+               <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Soll für die Speicherung der Sitzungsdaten die ausgewählte Cache-Methode verwendet werden?]]></item>
+               <item name="wcf.acp.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>
+               <item name="wcf.acp.option.export"><![CDATA[Optionen sichern]]></item>
+               <item name="wcf.acp.option.export.download"><![CDATA[Sicherung der Optionen herunterladen]]></item>
+               <item name="wcf.acp.option.export.download.description"><![CDATA[Laden Sie eine Sicherung der Optionen auf Ihren lokalen Rechner herunter.]]></item>
+               <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Gzip-Komprimierung aktivieren]]></item>
+               <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Durch Aktivierung dieser Option werden die Inhalte komprimiert vom Server an den Client gesendet. Dies reduziert den Traffic.]]></item>
+               <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Seitencaching im Client-Browser verhindern]]></item>
+               <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Durch Aktivierung dieser Option können Sie das Caching der Seite im Browser verhindern.]]></item>
+               <item name="wcf.acp.option.http_gzip_level"><![CDATA[Gzip-Komprimierungslevel]]></item>
+               <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[Werte von 1-9 sind zulässig. Als Optimum zwischen Komprimierung und Serverlast empfiehlt sich Level 1.]]></item>
+               <item name="wcf.acp.option.import"><![CDATA[Optionen wiederherstellen]]></item>
+               <item name="wcf.acp.option.import.error.importFailed"><![CDATA[Die Optionen konnten nicht erfolgreich importiert werden.]]></item>
+               <item name="wcf.acp.option.import.success"><![CDATA[Die Optionen wurden erfolgreich importiert.]]></item>
+               <item name="wcf.acp.option.import.upload"><![CDATA[Sicherung der Optionen vom lokalen Computer hochladen]]></item>
+               <item name="wcf.acp.option.import.upload.description"><![CDATA[Geben Sie eine Sicherung der Optionen von Ihrem lokalen Rechner an.]]></item>
+               <item name="wcf.acp.option.importAndExport"><![CDATA[Optionen sichern &amp; wiederherstellen]]></item>
+               <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator-Adresse]]></item>
+               <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Geben Sie die E-Mail-Adresse des Administrators an.]]></item>
+               <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Logfile-Pfad]]></item>
+               <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Geben Sie den Pfad zum Logfile an.]]></item>
+               <item name="wcf.acp.option.mail_from_address"><![CDATA[Absender-Adresse]]></item>
+               <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Geben Sie die Absender-Adresse bei automatisch generierten E-Mails an.]]></item>
+               <item name="wcf.acp.option.mail_from_name"><![CDATA[Absender-Name]]></item>
+               <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Geben Sie den Namen des Absenders bei automatisch generierten E-Mails an.]]></item>
+               <item name="wcf.acp.option.mail_send_method"><![CDATA[Versandmethode]]></item>
+               <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>
+               <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Wählen Sie eine Versandmethode aus.]]></item>
+               <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>
+               <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>
+               <item name="wcf.acp.option.mail_signature"><![CDATA[Signatur]]></item>
+               <item name="wcf.acp.option.mail_signature.description"><![CDATA[Tragen Sie hier eine Signatur ein, die bei System-E-Mails angezeigt werden soll.]]></item>
+               <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP-Server]]></item>
+               <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Tragen Sie hier den SMTP-Server ein.]]></item>
+               <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP-Kennwort]]></item>
+               <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Geben Sie das SMTP-Kennwort an.]]></item>
+               <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP-Port]]></item>
+               <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Geben Sie den SMTP-Port an.]]></item>
+               <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP-Benutzer]]></item>
+               <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Geben Sie den SMTP-Benutzer an.]]></item>
+               <item name="wcf.acp.option.mail_use_f_param"><![CDATA[&raquo;-f&laquo; Parameter verwenden]]></item>
+               <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Manche Server benötigen den &raquo;-f&laquo; Parameter beim Versenden von E-Mails. Falls Sie Probleme mit dem Versand von E-Mails haben, aktivieren Sie diese Einstellung.]]></item>
+               <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Formatierte E-Mail-Adressen verwenden]]></item>
+               <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Absender- und Empfänger-Adressen werden in folgendes Format gebracht: &quot;Name &lt;email@domain.tld&gt;&quot;. Diese Funktion wird nicht von allen Mailservern unterstützt und sollte daher bei Problemen abgeschaltet werden.]]></item>
+               <item name="wcf.acp.option.module_master_password"><![CDATA[Hauptkennwort aktivieren]]></item>
+               <item name="wcf.acp.option.module_master_password.description"><![CDATA[Aktiviert die zusätzliche Eingabe eines Kennworts beim Aufruf von sicherheitskritischen Bereichen.]]></item>
+               <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>
+               <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server für HTTP-Verbindungen]]></item>
+               <item name="wcf.acp.option.session_timeout"><![CDATA[Gültigkeitslänge einer Sitzung]]></item>
+               <item name="wcf.acp.option.session_timeout.description"><![CDATA[Geben Sie an, wie lange die Sitzung gültig ist [Sekunden]. ]]></item>
+               <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[IP-Adresse der Sitzung überprüfen]]></item>
+               <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[Anzahl der Blöcke der IP-Adresse die beim Auslesen der Sitzung überprüft werden sollen. Eine hohe Einstellung kann Benutzer ausschließen, die mit wechselnden IP-Adressen im Internet unterwegs sind.]]></item>
+               <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Browser-Kennung der Sitzung überprüfen]]></item>
+               <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Soll die Browser-Kennung beim Auslesen der Sitzung überprüft werden?]]></item>
+               <item name="wcf.acp.option.success"><![CDATA[Ihre Einstellungsänderungen wurden erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.option.timezone"><![CDATA[Zeitzone]]></item>
+               <item name="wcf.acp.option.timezone.description"><![CDATA[Wählen Sie die Standard Zeitzone Ihrer Seite.]]></item>
+               <item name="wcf.acp.option.user_online_timeout"><![CDATA[Timeout für Benutzer-Online]]></item>
+               <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Geben Sie an, wie lange der Benutzer trotz Inaktivität als online markiert werden soll [Sekunden].]]></item>
+               <item name="wcf.acp.option.category.general.page"><![CDATA[Seite]]></item>
+               <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.meta_description"><![CDATA[Meta Description]]></item>
+               <item name="wcf.acp.option.meta_description.description"><![CDATA[Geben Sie eine Meta Description an.]]></item>
+               <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta Keywords]]></item>
+               <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Tragen Sie die Wörter ein, die im Meta-Tag Keywords stehen sollen.]]></item>
+               <item name="wcf.acp.option.page_description"><![CDATA[Seitenbeschreibung]]></item>
+               <item name="wcf.acp.option.page_description.description"><![CDATA[Fügen Sie hier eine kurze Beschreibung Ihrer Seite ein.]]></item>
+               <item name="wcf.acp.option.page_title"><![CDATA[Titel der Seite]]></item>
+               <item name="wcf.acp.option.page_title.description"><![CDATA[Geben Sie hier den Globalen Titel der Seite an. Dieser Titel wird im Seitenkopf dargestellt, wenn Sie die Anzeige dieses Textes im Stileditor aktiviert haben.]]></item>
+               <item name="wcf.acp.option.page_url"><![CDATA[Adresse (URL) der Seite]]></item>
+               <item name="wcf.acp.option.page_url.description"><![CDATA[Geben Sie an, unter welcher Adresse (URL) die Seite aufzurufen ist (ohne abschließenden Slash).]]></item>
+               <item name="wcf.acp.option.page_urls"><![CDATA[Weitere URLs]]></item>
+               <item name="wcf.acp.option.page_urls.description"><![CDATA[Geben Sie hier weitere URLs an, unter denen Ihre Seite erreichbar ist.]]></item>
+       </category>
+       <category name="wcf.acp.package">
+               <item name="wcf.acp.package.cancel"><![CDATA[Abbruch der Paketinstallation]]></item>
+               <item name="wcf.acp.package.description"><![CDATA[Beschreibung]]></item>
+               <item name="wcf.acp.package.install"><![CDATA[Paketinstallation]]></item>
+               <item name="wcf.acp.package.install.cancel"><![CDATA[Installation abbrechen]]></item>
+               <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Wollen Sie die Installation wirklich abbrechen?]]></item>
+               <item name="wcf.acp.package.install.error"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>
+               <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[Die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} kann aufgrund von Inkompatibilitäten zu {if $excludedPackages|count == 1}folgendem Paket{else}folgenden Paketen{/if} nicht durchgeführt werden:]]></item>
+               <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in Version {$excludedPackage.packageVersion}]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket lässt{else}Folgende Pakete lassen{/if} die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} aufgrund von Inkompatibilitäten nicht zu:]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in Version {$excludingPackage.packageVersion}]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket ist{else}Folgende Pakete sind{/if} mit dem Paket &raquo;{$packageName}&laquo; in Version {$packageVersion} nicht kompatibel. Wenn Sie die Installation fortführen, {if $excludingPackages|count == 1}wird das Paket{else}werden die Pakete{/if} vermutlich nicht mehr korrekt funktionieren.]]></item>
+               <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}ist bereits installiert{else}{if $package.file|isset}liegt dem Paket bei{else}fehlt{/if}{/if})</span>]]></item>
+               <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Wollen Sie die Paketinstallation wirklich abbrechen?]]></item>
+               <item name="wcf.acp.package.install.updatableInstances"><![CDATA[Folgende Pakete können mit diesem Paket aktualisiert werden]]></item>
+               <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Wählen Sie eines der folgenden Pakete aus, um seine Version zu aktualisieren. Falls Sie das Paket neu installieren möchten, klicken Sie unten auf &raquo;Weiter&laquo;.]]></item>
+               <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[Es ist bereits eine Kopie dieses Paketes installiert. Wenn Sie fortfahren, wird eine weitere Kopie dieses Paketes installiert. Falls Sie eine vorhandene Kopie dieses Paketes aktualisieren möchten, wählen Sie die Kopie aus der folgenden Liste aus.]]></item>
+               <item name="wcf.acp.package.install.version"><![CDATA[Version des Paketes:]]></item>
+               <item name="wcf.acp.package.installDate"><![CDATA[Installationsdatum]]></item>
+               <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[Beim Versuch die Dateien des Paketes zu entpacken, ist folgender Fehler aufgetreten:]]></item>
+               <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[Folgende Dateien konnten nicht erfolgreich entpackt werden. Bitte überprüfen Sie, ob der entsprechende Zielort beschreibbar ist.]]></item>
+               <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Tabellen Konflikt]]></item>
+               <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Keine Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>
+               <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Alle Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>
+               <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Notwendige Änderungen]]></item>
+               <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Betroffene Tabelle]]></item>
+               <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Vorhandene Tabellen Ihrer Datenbank stehen im Konflikt mit Tabellen, die für dieses Paket installiert werden müssen. Bitte wählen Sie aus, ob diese Tabellen überschrieben werden sollen.]]></item>
+               <item name="wcf.acp.package.list"><![CDATA[Installierte Pakete]]></item>
+               <item name="wcf.acp.package.list.author"><![CDATA[Hersteller]]></item>
+               <item name="wcf.acp.package.list.count"><![CDATA[Insgesamt sind {#$items} Pakete installiert.]]></item>
+               <item name="wcf.acp.package.list.date"><![CDATA[Herstellungsdatum]]></item>
+               <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>
+               <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>
+               <item name="wcf.acp.package.list.other"><![CDATA[Sonstiges Paket]]></item>
+               <item name="wcf.acp.package.list.plugin"><![CDATA[Zusatzmodul]]></item>
+               <item name="wcf.acp.package.list.standalone"><![CDATA[Endanwendung]]></item>
+               <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>
+               <item name="wcf.acp.package.optionals"><![CDATA[Optionale Zusatzpakete installieren]]></item>
+               <item name="wcf.acp.package.optionals.description"><![CDATA[Das aktuelle Paket bringt folgende optionale Zusatzpakete mit. Bitte wählen Sie aus, welche Zusatzpakete Sie installieren möchten.]]></item>
+               <item name="wcf.acp.package.optionals.installed"><![CDATA[ (Dieses Paket ist bereits installiert.)]]></item>
+               <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (Die Voraussetzungen für dieses Paket werden nicht erfüllt.)]]></item>
+               <item name="wcf.acp.package.packageDir"><![CDATA[Installationsverzeichnis]]></item>
+               <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>
+               <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Es ist bereits eine andere Anwendung in dem angegebenen Verzeichnis installiert.]]></item>
+               <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>
+               <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[Das angegebene Verzeichnis ist nicht beschreibbar.]]></item>
+               <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[Das angegebene Verzeichnis wird bereits von WoltLab Community Framework beansprucht. Bitte wählen Sie ein anderes Verzeichnis.]]></item>
+               <item name="wcf.acp.package.packageDir.input"><![CDATA[Bitte geben Sie hier das Installationsverzeichnis an.]]></item>
+               <item name="wcf.acp.package.packageDir.url"><![CDATA[Nach der Installation in das angegebene Installationsverzeichnis ist die Anwendung über folgende Adresse (URL) erreichbar:]]></item>
+               <item name="wcf.acp.package.requirements"><![CDATA[Abhängigkeiten auswählen]]></item>
+               <item name="wcf.acp.package.requirements.description"><![CDATA[Das aktuelle Paket benötigt Pakete, von denen mehrere Instanzen installiert sind. Bitte wählen Sie aus, zu welcher Instanz jeweils eine Abhängigkeit hergestellt werden soll.]]></item>
+               <item name="wcf.acp.package.rollback"><![CDATA[Paketinstallation zurücksetzen]]></item>
+               <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright &copy; {$packageAuthor}]]></item>
+               <item name="wcf.acp.package.startInstall"><![CDATA[Neues Paket installieren]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[Das angegebene Archiv ist kein gültiges Paket.]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[Paket &raquo;{$package->getName()}&laquo; kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>
+               <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[Es konnte keine Datei unter dem angegebenen Pfad gefunden wurden.]]></item>
+               <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert. Das Paket kann nicht mehrfach installiert werden.]]></item>
+               <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[Das Hochladen der ausgewählten Datei ist fehlgeschlagen.]]></item>
+               <item name="wcf.acp.package.startInstall.source"><![CDATA[Quelle auswählen]]></item>
+               <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Direkten Pfad zum Paket angeben]]></item>
+               <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Geben Sie den direkten Pfad zur Paketdatei an. Dabei kann es sich um die Internet Adresse der Paketdatei oder alternativ den Pfad zur Paketdatei im Dateisystem handeln.]]></item>
+               <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Paket vom lokalen Computer hochladen]]></item>
+               <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Geben Sie eine Paketdatei von Ihrem lokalen Rechner an.]]></item>
+               <item name="wcf.acp.package.startUpdate"><![CDATA[Paket &raquo;{$package->getName()}&laquo; aktualisieren]]></item>
+               <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>
+               <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>
+               <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation abgeschlossen]]></item>
+               <item name="wcf.acp.package.step.install.optionals"><![CDATA[Optionale Pakete werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.package"><![CDATA[Paket wird registriert ...]]></item>
+               <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden installiert ...]]></item>
+               <item name="wcf.acp.package.step.install.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>
+               <item name="wcf.acp.package.step.install.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+               <item name="wcf.acp.package.step.title"><![CDATA[Paket <b>{$packageName|encodeJS}</b>: ]]></item>
+               <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Dateien werden gelöscht ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Deinstallation abgeschlossen]]></item>
+               <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Optionale Pakete werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden deinstalliert ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+               <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>
+               <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+               <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>
+               <item name="wcf.acp.package.step.update.finish"><![CDATA[Paketaktualisierung abgeschlossen]]></item>
+               <item name="wcf.acp.package.step.update.optionals"><![CDATA[Optionale Pakete werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.package"><![CDATA[Paket wird aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden aktualisiert ...]]></item>
+               <item name="wcf.acp.package.step.update.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>
+               <item name="wcf.acp.package.step.update.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+               <item name="wcf.acp.package.uninstall"><![CDATA[Paketdeinstallation]]></item>
+               <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Abbruch der Paketdeinstallation]]></item>
+               <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[Die Deinstallation des Paketes ist nicht möglich, da mindestens ein abhängiges Paket nicht deinstalliert werden kann.]]></item>
+               <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Diese{if $dependentPackages|count == 1}s Paket wird{else} Pakete werden{/if}, nach Ihrer Bestätigung, ohne weitere Sicherheitsabfrage deinstalliert.]]></item>
+               <item name="wcf.acp.package.update"><![CDATA[Paketaktualisierung]]></item>
+               <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>
+               <item name="wcf.acp.package.view.author"><![CDATA[Hersteller:]]></item>
+               <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Zur Administrationsoberfläche wechseln]]></item>
+               <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Paket deinstallieren]]></item>
+               <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Alle Pakete deinstallieren]]></item>
+               <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Wollen Sie dieses Paket wirklich deinstallieren?]]></item>
+               <item name="wcf.acp.package.view.button.update"><![CDATA[Paket aktualisieren]]></item>
+               <item name="wcf.acp.package.view.date"><![CDATA[Herstellungsdatum:]]></item>
+               <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Abhängige Pakete]]></item>
+               <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[Dieses Paket wird von {#$dependentPackages|count} {if $dependentPackages|count == 1}anderen Paket{else}anderen Paketen{/if} benötigt.]]></item>
+               <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}Dieses Paket wird von 1 anderen Paket benötigt{else}{#$dependentPackages|count} Pakete sind direkt oder indirekt von diesem Paket abhängig{/if}.]]></item>
+               <item name="wcf.acp.package.view.dir"><![CDATA[Installationsverzeichnis:]]></item>
+               <item name="wcf.acp.package.view.identifier"><![CDATA[Bezeichner:]]></item>
+               <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installierte Instanz:]]></item>
+               <item name="wcf.acp.package.view.parent"><![CDATA[Übergeordnetes Paket:]]></item>
+               <item name="wcf.acp.package.view.properties"><![CDATA[Eigenschaften]]></item>
+               <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Benötigte Pakete]]></item>
+               <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[Dieses Paket benötigt {#$requiredPackages|count} {if $requiredPackages|count == 1}anderes Paket{else}andere Pakete{/if}.]]></item>
+               <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>
+               <item name="wcf.acp.package.view.version"><![CDATA[Installierte Version:]]></item>
+       </category>
+       <category name="wcf.acp.packageUpdate">
+               <item name="wcf.acp.packageUpdate"><![CDATA[Pakete aktualisieren]]></item>
+               <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentifizierung mit Update-Server]]></item>
+               <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Verbindungs-Daten]]></item>
+               <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Benutzername und Kennwort wurden nicht akzeptiert.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Kennwort]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Geben Sie ein Kennwort an, das zur Authentifizierung benötigt wird.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Benutzername]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Geben Sie einen Benutzernamen an, der zur Authentifizierung benötigt wird.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[Benutzeranmeldung]]></item>
+               <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server-Meldung]]></item>
+               <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server-Name]]></item>
+               <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Benutzerdaten dauerhaft speichern]]></item>
+               <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[Speichert die eingegebenen Benutzerdaten dauerhaft, sodass Sie die Daten zu einem späteren Zeitpunkt nicht erneut eingeben müssen.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Adresse]]></item>
+               <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installierte Version]]></item>
+               <item name="wcf.acp.packageUpdate.error"><![CDATA[Es ist folgender Fehler aufgetreten: ]]></item>
+               <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[Das Herunterladen des Paketes {$package} ist fehlgeschlagen.]]></item>
+               <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[Beim Versuch die Paketliste herunterzuladen, ist ein Fehler aufgetreten.]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[Es {if $excludedPackages|count == 1}ist folgender Konflikt{else}sind folgende Konflikte{/if} aufgetreten:]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[Das installierte Paket &raquo;{$excludedPackage.existingPackageName}&laquo; ist mit dem Paket &raquo;{$excludedPackage.packageName}&laquo; in Version {$excludedPackage.packageVersion} nicht kompatibel.]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[Das Paket &raquo;{$excludedPackage.packageName}&laquo; in Version {$excludedPackage.packageVersion} ist mit dem installierten Paket &raquo;{$excludedPackage.existingPackageName}&laquo; nicht kompatibel.]]></item>
+               <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} wird installiert]]></item>
+               <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[Derzeit sind keine Updates verfügbar.]]></item>
+               <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[Sie haben kein Update ausgewählt.]]></item>
+               <item name="wcf.acp.packageUpdate.options"><![CDATA[Optionen]]></item>
+               <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[Paket ist bereits installiert und kann kein weiteres Mal installiert werden.]]></item>
+               <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Paket installieren]]></item>
+               <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Weitere Paket-Instanz installieren (Paket ist bereits {#$package.instances} mal installiert)]]></item>
+               <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Installiertes Paket {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} Version {$updatableInstance.packageVersion} aktualisieren]]></item>
+               <item name="wcf.acp.packageUpdate.search"><![CDATA[Pakete suchen]]></item>
+               <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Autor]]></item>
+               <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Suche nach ...]]></item>
+               <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Bereits installierte einzigartige Pakete ausblenden]]></item>
+               <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Paketname]]></item>
+               <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Paketname und -beschreibung durchsuchen]]></item>
+               <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update-Server]]></item>
+               <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Alle Update-Server durchsuchen]]></item>
+               <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Art des Paketes]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Sonstige Pakete]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Zusatzmodul für bereits installierte Pakete]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Endanwendung]]></item>
+               <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Alle Pakete auswählen]]></item>
+               <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} wird aktualisiert auf {$package.toVersion}]]></item>
+               <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[Neue Version]]></item>
+               <item name="wcf.acp.packageUpdate.updates"><![CDATA[Folgende Paket-Aktualisierungen/-Installationen werden durchgeführt:]]></item>
+       </category>
+       <category name="wcf.acp.sessionLog">
+               <item name="wcf.acp.sessionLog.access.view"><![CDATA[Aktionen der protokollierten Sitzung von &raquo;{$sessionLog->username}&laquo;]]></item>
+               <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[Insgesamt {#$items} protokollierte Aktion{if $items != 1}en{/if}]]></item>
+               <item name="wcf.acp.sessionLog.accesses"><![CDATA[Aktionen]]></item>
+               <item name="wcf.acp.sessionLog.className"><![CDATA[Klasse]]></item>
+               <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP-Adresse]]></item>
+               <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Letzte Aktion]]></item>
+               <item name="wcf.acp.sessionLog.packageName"><![CDATA[Paket]]></item>
+               <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Methode]]></item>
+               <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>
+               <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>
+               <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>
+               <item name="wcf.acp.sessionLog.time"><![CDATA[Datum]]></item>
+               <item name="wcf.acp.sessionLog.userAgent"><![CDATA[Browser-Kennung]]></item>
+               <item name="wcf.acp.sessionLog.view"><![CDATA[Protokollierte Sitzungen]]></item>
+               <item name="wcf.acp.sessionLog.view.count"><![CDATA[Insgesamt {#$items} protokollierte Sitzung{if $items != 1}en{/if}]]></item>
+       </category>
+       <category name="wcf.acp.updateServer">
+               <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>
+               <item name="wcf.acp.updateServer.add.success"><![CDATA[Der Server wurde erfolgreich angelegt.]]></item>
+               <item name="wcf.acp.updateServer.data"><![CDATA[Server-Daten]]></item>
+               <item name="wcf.acp.updateServer.delete"><![CDATA[Server löschen]]></item>
+               <item name="wcf.acp.updateServer.delete.success"><![CDATA[Der Server wurde erfolgreich gelöscht.]]></item>
+               <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Wollen Sie den Server wirklich löschen?]]></item>
+               <item name="wcf.acp.updateServer.disable"><![CDATA[Deaktivieren]]></item>
+               <item name="wcf.acp.updateServer.edit"><![CDATA[Server bearbeiten]]></item>
+               <item name="wcf.acp.updateServer.edit.success"><![CDATA[Ihre Änderungen wurden erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.updateServer.enable"><![CDATA[Aktivieren]]></item>
+               <item name="wcf.acp.updateServer.errorText"><![CDATA[Fehlermeldungen]]></item>
+               <item name="wcf.acp.updateServer.htPassword"><![CDATA[Kennwort]]></item>
+               <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Geben Sie ein Kennwort an, das zur Authentifizierung benötigt wird (optional).]]></item>
+               <item name="wcf.acp.updateServer.htUsername"><![CDATA[Benutzername]]></item>
+               <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Geben Sie einen Benutzernamen an, der zur Authentifizierung benötigt wird (optional).]]></item>
+               <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[Beim letzten Verbindungsversuch trat folgende Fehlermeldungen auf:]]></item>
+               <item name="wcf.acp.updateServer.list.available"><![CDATA[Insgesamt {#$items} Server eingetragen]]></item>
+               <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server-ID]]></item>
+               <item name="wcf.acp.updateServer.packages"><![CDATA[Pakete]]></item>
+               <item name="wcf.acp.updateServer.server"><![CDATA[Adresse]]></item>
+               <item name="wcf.acp.updateServer.server.description"><![CDATA[Geben Sie die Adresse (URL) zu einem Paketserver an.]]></item>
+               <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[Die eingetragene Adresse ist ungültig.]]></item>
+               <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>
+               <item name="wcf.acp.updateServer.timestamp"><![CDATA[Letzter Zugriff]]></item>
+               <item name="wcf.acp.updateServer.view"><![CDATA[Verfügbare Update-Server]]></item>
+               <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[Es sind keine Update-Server eingetragen.]]></item>
+       </category>
+       <category name="wcf.acp.user">
+               <item name="wcf.acp.user.add"><![CDATA[Benutzer hinzufügen]]></item>
+               <item name="wcf.acp.user.add.data"><![CDATA[Benutzerdaten]]></item>
+               <item name="wcf.acp.user.add.success"><![CDATA[Der neue Benutzer wurde erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.user.assignToGroup"><![CDATA[Benutzergruppe zuweisen]]></item>
+               <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Folgende Benutzer den unten ausgewählten Benutzergruppen zuweisen]]></item>
+               <item name="wcf.acp.user.assignToGroup.success"><![CDATA[Die Zuweisung wurde erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.user.button.assignGroup"><![CDATA[Benutzergruppe zuweisen]]></item>
+               <item name="wcf.acp.user.button.exportMail"><![CDATA[E-Mail-Adressen exportieren]]></item>
+               <item name="wcf.acp.user.button.sendMail"><![CDATA[E-Mail senden]]></item>
+               <item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>
+               <item name="wcf.acp.user.delete.error"><![CDATA[Es konnte kein Benutzer gelöscht werden.]]></item>
+               <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}Der Benutzer wurde{else}{#$deletedUsers} Benutzer wurden{/if} erfolgreich gelöscht.]]></item>
+               <item name="wcf.acp.user.delete.sure"><![CDATA[Wollen Sie diesen Benutzer wirklich löschen?]]></item>
+               <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Wollen Sie die markierten Benutzer wirklich löschen?]]></item>
+               <item name="wcf.acp.user.edit"><![CDATA[Benutzer bearbeiten]]></item>
+               <item name="wcf.acp.user.edit.success"><![CDATA[Die Änderungen an diesem Benutzer wurden erfolgreich gespeichert.]]></item>
+               <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[Sie bearbeiten Ihr eigenes Benutzerkonto. Änderungen an den Mitgliedschaften in Benutzergruppen können womöglich dazu führen, dass Sie aus der Administrationsoberfläche ausgeschlossen werden. Bitte seien Sie entsprechend vorsichtig!]]></item>
+               <item name="wcf.acp.user.exportEmailAddress"><![CDATA[E-Mail-Adressen exportieren]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Exportformat]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Exporteinstellungen]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[E-Mail-Adressen von folgenden Benutzern exportieren]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Trennzeichen]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Texttrenner]]></item>
+               <item name="wcf.acp.user.groups"><![CDATA[Benutzergruppe(n)]]></item>
+               <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Finde Benutzer, die in den ausgewählten Benutzergruppen nicht Mitglied sind.]]></item>
+               <item name="wcf.acp.user.list"><![CDATA[Benutzer]]></item>
+               <item name="wcf.acp.user.list.all"><![CDATA[Alle Benutzer]]></item>
+               <item name="wcf.acp.user.list.count"><![CDATA[Insgesamt {#$items} Benutzer]]></item>
+               <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "Einen Benutzer markiert" : this.count+" Benutzer markiert"]]></item>
+               <item name="wcf.acp.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>
+               <item name="wcf.acp.user.massProcessing.action"><![CDATA[Aktion]]></item>
+               <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Bedingungen]]></item>
+               <item name="wcf.acp.user.massProcessing.success"><![CDATA[Die gewählte Aktion wurde erfolgreich auf {#$affectedUsers} Benutzer ausgeführt.]]></item>
+               <item name="wcf.acp.user.massProcessing.warning"><![CDATA[Die Massenverarbeitung von Benutzern führt die unten ausgewählte Aktion <b>ohne zusätzliche Sicherheitsabfrage</b> auf alle Benutzer aus, die unter die eingestellten Bedingungen fallen. Die Bearbeitungen können unter Umständen sehr rechenintensiv werden und sollten deshalb möglichst nur dann ausgeführt werden, wenn sich die Seite im Wartungsmodus befindet! Die Veränderungen können nicht rückgängig gemacht werden. Bitte benutzen Sie diese Funktion mit der nötigen Vorsicht!]]></item>
+               <item name="wcf.acp.user.search"><![CDATA[Benutzer suchen]]></item>
+               <item name="wcf.acp.user.search.conditions"><![CDATA[Kriterien der Suche]]></item>
+               <item name="wcf.acp.user.search.conditions.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profil]]></item>
+               <item name="wcf.acp.user.search.display"><![CDATA[Darstellung]]></item>
+               <item name="wcf.acp.user.search.display.columns"><![CDATA[Angezeigte Informationen]]></item>
+               <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Sonstiges]]></item>
+               <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profil]]></item>
+               <item name="wcf.acp.user.search.display.general"><![CDATA[Allgemein]]></item>
+               <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Benutzer pro Seite]]></item>
+               <item name="wcf.acp.user.search.display.sort"><![CDATA[Sortierung]]></item>
+               <item name="wcf.acp.user.search.error.noMatches"><![CDATA[Zu den angegebenen Kriterien wurde kein Benutzer gefunden.]]></item>
+               <item name="wcf.acp.user.search.matches"><![CDATA[{if $items == 1}Ein Ergebnis{else}{#$items} Ergebnisse{/if}]]></item>
+               <item name="wcf.acp.user.search.withinResults"><![CDATA[In den Ergebnissen suchen]]></item>
+               <item name="wcf.acp.user.sendMail"><![CDATA[E-Mail an Benutzer senden]]></item>
+               <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail an alle Benutzer]]></item>
+               <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[E-Mail als HTML verschicken]]></item>
+               <item name="wcf.acp.user.sendMail.from"><![CDATA[Absender]]></item>
+               <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Hier können Sie die E-Mail-Adresse des Absenders definieren.{if MAIL_USE_FORMATTED_ADDRESS} Es ist auch folgendes Format möglich:{/if}</p>
+{if MAIL_USE_FORMATTED_ADDRESS}<p style="text-align: center; line-height: 2em;"><code>Absender Name &lt;email@absender.tld&gt;</code></p>{/if}
+<p>Wenn Sie unter System -> Optionen -> E-Mail alles ausgefüllt haben, wird dieses Feld automatisch ausgefüllt. Sollten Sie E-Mails per SMTP senden, so achten Sie darauf, dass die E-Mail-Adresse des Absenders auch vom Server akzeptiert werden muss.</p>]]></item>
+               <item name="wcf.acp.user.sendMail.group"><![CDATA[E-Mail an Gruppenmitglieder]]></item>
+               <item name="wcf.acp.user.sendMail.groups"><![CDATA[E-Mail an die Mitglieder folgender Benutzergruppen senden]]></item>
+               <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-Mail]]></item>
+               <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[E-Mail an folgende Benutzer senden]]></item>
+               <item name="wcf.acp.user.sendMail.subject"><![CDATA[Betreff]]></item>
+               <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Geben Sie hier die Betreffzeile der E-Mail an.]]></item>
+               <item name="wcf.acp.user.sendMail.text"><![CDATA[Nachricht]]></item>
+               <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Tragen Sie hier die Nachricht ein, die Sie den Benutzern senden möchten.]]></item>
+               <item name="wcf.acp.user.userNote"><![CDATA[Angemeldet als {$this->user->username}.]]></item>
+       </category>
+       <category name="wcf.acp.worker">
+               <item name="wcf.acp.worker.currentStep"><![CDATA[Aktueller Schritt]]></item>
+               <item name="wcf.acp.worker.description"><![CDATA[Bitte lassen Sie dieses Browser-Fenster offen, bis der Prozess abgeschlossen ist und melden Sie sich auf keinen Fall in einem anderen Browser-Fenster separat in der Administrationsoberfläche an, da dies den Prozess behindern könnte.]]></item>
+               <item name="wcf.acp.worker.progress.finish"><![CDATA[Vorgang erfolgreich abgeschlossen]]></item>
+               <item name="wcf.acp.worker.progress.working"><![CDATA[Vorgang läuft ...]]></item>
+               <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>
+               <item name="wcf.acp.worker.title"><![CDATA[Prozess läuft ...]]></item>
+       </category>
+       <category name="wcf.global">
+               <item name="wcf.global.button.back"><![CDATA[&laquo; Zurück]]></item>
+               <item name="wcf.global.button.close"><![CDATA[Schließen]]></item>
+               <item name="wcf.global.button.collapse"><![CDATA[Zuklappen]]></item>
+               <item name="wcf.global.button.collapsible"><![CDATA[Auf- und Zuklappen]]></item>
+               <item name="wcf.global.button.delete"><![CDATA[Löschen]]></item>
+               <item name="wcf.global.button.delete.confirm"><![CDATA[Möchten Sie das Element wirklich löschen?]]></item>
+               <item name="wcf.global.button.deleteCompletely"><![CDATA[Endgültig löschen]]></item>
+               <item name="wcf.global.button.edit"><![CDATA[Bearbeiten]]></item>
+               <item name="wcf.global.button.editor.jump"><![CDATA[Zum Editor wechseln]]></item>
+               <item name="wcf.global.button.expand"><![CDATA[Aufklappen]]></item>
+               <item name="wcf.global.button.mark"><![CDATA[Markieren]]></item>
+               <item name="wcf.global.button.next"><![CDATA[Weiter &raquo;]]></item>
+               <item name="wcf.global.button.preview"><![CDATA[Vorschau]]></item>
+               <item name="wcf.global.button.reset"><![CDATA[Zurücksetzen]]></item>
+               <item name="wcf.global.button.submit"><![CDATA[Absenden]]></item>
+               <item name="wcf.global.button.unmark"><![CDATA[Demarkieren]]></item>
+               <item name="wcf.global.date.day"><![CDATA[Tag]]></item>
+               <item name="wcf.global.date.days"><![CDATA[Tage]]></item>
+               <item name="wcf.global.date.hour"><![CDATA[Stunde]]></item>
+               <item name="wcf.global.date.hours"><![CDATA[Stunden]]></item>
+               <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>
+               <item name="wcf.global.date.minutes"><![CDATA[Minuten]]></item>
+               <item name="wcf.global.date.month"><![CDATA[Monat]]></item>
+               <item name="wcf.global.date.months"><![CDATA[Monate]]></item>
+               <item name="wcf.global.date.second"><![CDATA[Sekunde]]></item>
+               <item name="wcf.global.date.seconds"><![CDATA[Sekunden]]></item>
+               <item name="wcf.global.date.week"><![CDATA[Woche]]></item>
+               <item name="wcf.global.date.weeks"><![CDATA[Wochen]]></item>
+               <item name="wcf.global.date.year"><![CDATA[Jahr]]></item>
+               <item name="wcf.global.date.year.notRequired"><![CDATA[Die Angabe des Jahres ist optional.]]></item>
+               <item name="wcf.global.date.years"><![CDATA[Jahre]]></item>
+               <item name="wcf.global.dateInputOrder"><![CDATA[day-month-year]]></item>
+               <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>
+               <item name="wcf.global.defaultValue"><![CDATA[Standard]]></item>
+               <item name="wcf.global.error.backward"><![CDATA[Zurück zur vorherigen Seite]]></item>
+               <item name="wcf.global.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>
+               <item name="wcf.global.error.file.notFound"><![CDATA[Die Datei konnte nicht gefunden werden.]]></item>
+               <item name="wcf.global.error.illegalLink"><![CDATA[Sie haben einen ungültigen oder nicht mehr gültigen Link aufgerufen.]]></item>
+               <item name="wcf.global.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist Ihnen leider verwehrt. Sie besitzen nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>
+               <item name="wcf.global.error.permissionDenied.title"><![CDATA[Zutritt verwehrt]]></item>
+               <item name="wcf.global.error.title"><![CDATA[Fehlermeldung]]></item>
+               <item name="wcf.global.form.error"><![CDATA[Ihre Angaben sind ungültig. Bitte überprüfen Sie die markierten Eingabefelder.]]></item>
+               <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>
+               <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>
+               <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>
+               <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>
+               <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>
+               <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede &raquo;Du&laquo;)]]></item>
+               <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>
+               <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>
+               <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>
+               <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>
+               <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>
+               <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>
+               <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>
+               <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>
+               <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>
+               <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>
+               <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>
+               <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>
+               <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>
+               <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>
+               <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>
+               <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>
+               <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>
+               <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>
+               <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>
+               <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>
+               <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>
+               <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>
+               <item name="wcf.global.language.th"><![CDATA[Thailändisch]]></item>
+               <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>
+               <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>
+               <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>
+               <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>
+               <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>
+               <item name="wcf.global.multiSelect"><![CDATA[Mehrfache Markierungen sind durch zusätzliches Drücken der Taste &raquo;Strg/Ctrl&laquo; (Windows) oder &raquo;Befehl/Command&laquo; (Mac OS) möglich.]]></item>
+               <item name="wcf.global.page.input"><![CDATA[Zu folgender Seite springen]]></item>
+               <item name="wcf.global.page.next"><![CDATA[nächste Seite]]></item>
+               <item name="wcf.global.page.previous"><![CDATA[vorherige Seite]]></item>
+               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>
+               <item name="wcf.global.pageTitle"><![CDATA[WoltLab&reg; Community Framework&trade;]]></item>
+               <item name="wcf.global.redirect.title"><![CDATA[Weiterleitung]]></item>
+               <item name="wcf.global.redirect.url"><![CDATA[Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!]]></item>
+               <item name="wcf.global.scrollDown"><![CDATA[Zum Seitenende]]></item>
+               <item name="wcf.global.scrollUp"><![CDATA[Zum Seitenanfang]]></item>
+               <item name="wcf.global.search.matchesExactly"><![CDATA[Exakter Treffer]]></item>
+               
+               <item name="wcf.global.skipToContent"><![CDATA[Zum Seiteninhalt springen]]></item>
+               <item name="wcf.global.sortOrder.ascending"><![CDATA[in aufsteigender Reihenfolge]]></item>
+               <item name="wcf.global.sortOrder.descending"><![CDATA[in absteigender Reihenfolge]]></item>
+               <item name="wcf.global.thousandsSeparator"><![CDATA[&nbsp;]]></item>
+               
+               <item name="wcf.global.date.dateFormat"><![CDATA[j. F Y]]></item>
+               <item name="wcf.global.date.timeFormat"><![CDATA[H:i]]></item>
+               <item name="wcf.global.date.dateTimeFormat"><![CDATA[%date%, %time%]]></item>
+               
+               <!--  variables for dynamic javascript datetime -->
+               <item name="wcf.global.date.relative.minutes"><![CDATA['Vor ' + (($minutes > 1) ? $minutes + ' Minuten' : 'einer Minute' )]]></item>
+               <item name="wcf.global.date.relative.hours"><![CDATA['Vor ' + (($hours > 1) ? $hours + ' Stunden' : 'einer Stunde' )]]></item>
+               <item name="wcf.global.date.relative.pastDays"><![CDATA[(($days > 1) ? '%day%' : 'Gestern' ) + ', %time%']]></item>
+               
+               <!-- variables for localized date formats; unnecessary in english -->
+               <item name="wcf.global.date.month.january"><![CDATA[Januar]]></item>
+               <item name="wcf.global.date.month.february"><![CDATA[Februar]]></item>
+               <item name="wcf.global.date.month.march"><![CDATA[März]]></item>
+               <item name="wcf.global.date.month.april"><![CDATA[April]]></item>
+               <item name="wcf.global.date.month.may"><![CDATA[Mai]]></item>
+               <item name="wcf.global.date.month.june"><![CDATA[Juni]]></item>
+               <item name="wcf.global.date.month.july"><![CDATA[Juli]]></item>
+               <item name="wcf.global.date.month.august"><![CDATA[August]]></item>
+               <item name="wcf.global.date.month.september"><![CDATA[September]]></item>
+               <item name="wcf.global.date.month.october"><![CDATA[Oktober]]></item>
+               <item name="wcf.global.date.month.november"><![CDATA[November]]></item>
+               <item name="wcf.global.date.month.december"><![CDATA[Dezember]]></item>
+               <item name="wcf.global.date.month.jan"><![CDATA[Jan]]></item>
+               <item name="wcf.global.date.month.feb"><![CDATA[Feb]]></item>
+               <item name="wcf.global.date.month.mar"><![CDATA[Mär]]></item>
+               <item name="wcf.global.date.month.apr"><![CDATA[Apr]]></item>
+               <item name="wcf.global.date.month.may"><![CDATA[Mai]]></item>
+               <item name="wcf.global.date.month.jun"><![CDATA[Jun]]></item>
+               <item name="wcf.global.date.month.jul"><![CDATA[Jul]]></item>
+               <item name="wcf.global.date.month.aug"><![CDATA[Aug]]></item>
+               <item name="wcf.global.date.month.sep"><![CDATA[Sep]]></item>
+               <item name="wcf.global.date.month.oct"><![CDATA[Okt]]></item>
+               <item name="wcf.global.date.month.nov"><![CDATA[Nov]]></item>
+               <item name="wcf.global.date.month.dec"><![CDATA[Dez]]></item>
+               <item name="wcf.global.date.day.sunday"><![CDATA[Sonntag]]></item>
+               <item name="wcf.global.date.day.monday"><![CDATA[Montag]]></item>
+               <item name="wcf.global.date.day.tuesday"><![CDATA[Dienstag]]></item>
+               <item name="wcf.global.date.day.wednesday"><![CDATA[Mittwoch]]></item>
+               <item name="wcf.global.date.day.thursday"><![CDATA[Donnerstag]]></item>
+               <item name="wcf.global.date.day.friday"><![CDATA[Freitag]]></item>
+               <item name="wcf.global.date.day.saturday"><![CDATA[Samstag]]></item>
+               <item name="wcf.global.date.day.sun"><![CDATA[Son]]></item>
+               <item name="wcf.global.date.day.mon"><![CDATA[Mon]]></item>
+               <item name="wcf.global.date.day.tue"><![CDATA[Die]]></item>
+               <item name="wcf.global.date.day.wed"><![CDATA[Mit]]></item>
+               <item name="wcf.global.date.day.thu"><![CDATA[Don]]></item>
+               <item name="wcf.global.date.day.fri"><![CDATA[Fre]]></item>
+               <item name="wcf.global.date.day.sat"><![CDATA[Sam]]></item>
+               <item name="wcf.global.date.timezone.pacific.kwajalein"><![CDATA[(UTC-12:00) Kwajalein]]></item>
+               <item name="wcf.global.date.timezone.pacific.midway"><![CDATA[(UTC-11:00) Midway]]></item>
+               <item name="wcf.global.date.timezone.pacific.samoa"><![CDATA[(UTC-11:00) Samoa]]></item>
+               <item name="wcf.global.date.timezone.pacific.honolulu"><![CDATA[(UTC-10:00) Hawaii]]></item>
+               <item name="wcf.global.date.timezone.america.anchorage"><![CDATA[(UTC-09:00) Alaska]]></item>
+               <item name="wcf.global.date.timezone.america.tijuana"><![CDATA[(UTC-08:00) Tijuana, Niederkalifornien]]></item>
+               <item name="wcf.global.date.timezone.america.los_angeles"><![CDATA[(UTC-08:00) Pacific Zeit]]></item>
+               <item name="wcf.global.date.timezone.america.phoenix"><![CDATA[(UTC-07:00) Arizona]]></item>
+               <item name="wcf.global.date.timezone.america.chihuahua"><![CDATA[(UTC-07:00) Chihuahua, La Paz, Mazatlan]]></item>
+               <item name="wcf.global.date.timezone.america.denver"><![CDATA[(UTC-07:00) Mountain Zeit]]></item>
+               <item name="wcf.global.date.timezone.america.chicago"><![CDATA[(UTC-06:00) Central Zeit]]></item>
+               <item name="wcf.global.date.timezone.america.mexico_city"><![CDATA[(UTC-06:00) Guadalajara, Mexiko-Stadt, Monterrey]]></item>
+               <item name="wcf.global.date.timezone.america.tegucigalpa"><![CDATA[(UTC-06:00) Mittelamerika]]></item>
+               <item name="wcf.global.date.timezone.america.regina"><![CDATA[(UTC-06:00) Saskatchewan]]></item>
+               <item name="wcf.global.date.timezone.america.bogota"><![CDATA[(UTC-05:00) Bogotá, Lima, Quito]]></item>
+               <item name="wcf.global.date.timezone.america.new_york"><![CDATA[(UTC-05:00) Eastern Zeit]]></item>
+               <item name="wcf.global.date.timezone.america.indiana.indianapolis"><![CDATA[(UTC-05:00) Indiana (Ost)]]></item>
+               <item name="wcf.global.date.timezone.america.rio_branco"><![CDATA[(UTC-05:00) Rio Branco]]></item>
+               <item name="wcf.global.date.timezone.america.caracas"><![CDATA[(UTC-04:30) Caracas]]></item>
+               <item name="wcf.global.date.timezone.america.asuncion"><![CDATA[(UTC-04:00) Asuncion]]></item>
+               <item name="wcf.global.date.timezone.america.halifax"><![CDATA[(UTC-04:00) Atlantic (Kanada)]]></item>
+               <item name="wcf.global.date.timezone.america.cuiaba"><![CDATA[(UTC-04:00) Cuiaba]]></item>
+               <item name="wcf.global.date.timezone.america.la_paz"><![CDATA[(UTC-04:00) Georgetown, La Paz, Manaus, San Juan]]></item>
+               <item name="wcf.global.date.timezone.america.santiago"><![CDATA[(UTC-04:00) Santiago]]></item>
+               <item name="wcf.global.date.timezone.america.st_johns"><![CDATA[(UTC-03:30) Neufundland]]></item>
+               <item name="wcf.global.date.timezone.america.sao_paulo"><![CDATA[(UTC-03:00) Brasilia]]></item>
+               <item name="wcf.global.date.timezone.america.argentina.buenos_aires"><![CDATA[(UTC-03:00) Buenos Aires]]></item>
+               <item name="wcf.global.date.timezone.america.cayenne"><![CDATA[(UTC-03:00) Cayenne, Fortaleza]]></item>
+               <item name="wcf.global.date.timezone.america.godthab"><![CDATA[(UTC-03:00) Grönland]]></item>
+               <item name="wcf.global.date.timezone.america.montevideo"><![CDATA[(UTC-03:00) Montevideo]]></item>
+               <item name="wcf.global.date.timezone.atlantic.south_georgia"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>
+               <item name="wcf.global.date.timezone.atlantic.azores"><![CDATA[(UTC-01:00) Azoren]]></item>
+               <item name="wcf.global.date.timezone.atlantic.cape_verde"><![CDATA[(UTC-01:00) Kap Verde]]></item>
+               <item name="wcf.global.date.timezone.africa.casablanca"><![CDATA[(UTC) Casablanca]]></item>
+               <item name="wcf.global.date.timezone.europe.london"><![CDATA[(UTC) Dublin, Edinburgh, Lissabon, London]]></item>
+               <item name="wcf.global.date.timezone.africa.monrovia"><![CDATA[(UTC) Monrovia, Reykjavik]]></item>
+               <item name="wcf.global.date.timezone.europe.berlin"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien]]></item>
+               <item name="wcf.global.date.timezone.europe.belgrade"><![CDATA[(UTC+01:00) Belgrad, Bratislava, Bupdapest, Ljubljana, Prag]]></item>
+               <item name="wcf.global.date.timezone.europe.paris"><![CDATA[(UTC+01:00) Brüssel, Kopenhagen, Madrid, Paris]]></item>
+               <item name="wcf.global.date.timezone.europe.sarajevo"><![CDATA[(UTC+01:00) Sarajevo, Skopje, Warschau, Zagreb]]></item>
+               <item name="wcf.global.date.timezone.africa.algiers"><![CDATA[(UTC+01:00) West-Zentralafrika]]></item>
+               <item name="wcf.global.date.timezone.africa.windhoek"><![CDATA[(UTC+01:00) Windhuk]]></item>
+               <item name="wcf.global.date.timezone.asia.amman"><![CDATA[(UTC+02:00) Amman]]></item>
+               <item name="wcf.global.date.timezone.europe.athens"><![CDATA[(UTC+02:00) Athen, Bukarest, Istanbul]]></item>
+               <item name="wcf.global.date.timezone.asia.beirut"><![CDATA[(UTC+02:00) Beirut]]></item>
+               <item name="wcf.global.date.timezone.asia.damascus"><![CDATA[(UTC+02:00) Damaskus]]></item>
+               <item name="wcf.global.date.timezone.africa.harare"><![CDATA[(UTC+02:00) Harare, Pretoria]]></item>
+               <item name="wcf.global.date.timezone.europe.helsinki"><![CDATA[(UTC+02:00) Helsinki, Kiew, Riga, Sofia, Tallinn, Wilna]]></item>
+               <item name="wcf.global.date.timezone.asia.jerusalem"><![CDATA[(UTC+02:00) Jerusalem]]></item>
+               <item name="wcf.global.date.timezone.africa.cairo"><![CDATA[(UTC+02:00) Kairo]]></item>
+               <item name="wcf.global.date.timezone.europe.minsk"><![CDATA[(UTC+02:00) Minsk]]></item>
+               <item name="wcf.global.date.timezone.asia.baghdad"><![CDATA[(UTC+03:00) Bagdad]]></item>
+               <item name="wcf.global.date.timezone.asia.kuwait"><![CDATA[(UTC+03:00) Kuwait, Riad]]></item>
+               <item name="wcf.global.date.timezone.europe.moscow"><![CDATA[(UTC+03:00) Moskau, St. Petersburg, Wolgograd]]></item>
+               <item name="wcf.global.date.timezone.africa.nairobi"><![CDATA[(UTC+03:00) Nairobi]]></item>
+               <item name="wcf.global.date.timezone.asia.tehran"><![CDATA[(UTC+03:30) Teheran]]></item>
+               <item name="wcf.global.date.timezone.asia.muscat"><![CDATA[(UTC+04:00) Abu Dhabi, Muskat]]></item>
+               <item name="wcf.global.date.timezone.asia.baku"><![CDATA[(UTC+04:00) Baku]]></item>
+               <item name="wcf.global.date.timezone.asia.yerevan"><![CDATA[(UTC+04:00) Eriwan]]></item>
+               <item name="wcf.global.date.timezone.indian.mauritius"><![CDATA[(UTC+04:00) Port Louis]]></item>
+               <item name="wcf.global.date.timezone.asia.tbilisi"><![CDATA[(UTC+04:00) Tiflis]]></item>
+               <item name="wcf.global.date.timezone.asia.kabul"><![CDATA[(UTC+04:30) Kabul]]></item>
+               <item name="wcf.global.date.timezone.asia.karachi"><![CDATA[(UTC+05:00) Islamabad, Karatschi]]></item>
+               <item name="wcf.global.date.timezone.asia.yekaterinburg"><![CDATA[(UTC+05:00) Jekaterinburg]]></item>
+               <item name="wcf.global.date.timezone.asia.tashkent"><![CDATA[(UTC+05:00) Taschkent]]></item>
+               <item name="wcf.global.date.timezone.asia.kolkata"><![CDATA[(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi]]></item>
+               <item name="wcf.global.date.timezone.asia.colombo"><![CDATA[(UTC+05:30) Sri Jayawardenepura]]></item>
+               <item name="wcf.global.date.timezone.asia.katmandu"><![CDATA[(UTC+05:45) Katmandu]]></item>
+               <item name="wcf.global.date.timezone.asia.almaty"><![CDATA[(UTC+06:00) Astana]]></item>
+               <item name="wcf.global.date.timezone.asia.dhaka"><![CDATA[(UTC+06:00) Dakka]]></item>
+               <item name="wcf.global.date.timezone.asia.novosibirsk"><![CDATA[(UTC+06:00) Nowosibirsk]]></item>
+               <item name="wcf.global.date.timezone.asia.rangoon"><![CDATA[(UTC+06:30) Yangon (Rangun)]]></item>
+               <item name="wcf.global.date.timezone.asia.bangkok"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta]]></item>
+               <item name="wcf.global.date.timezone.asia.krasnoyarsk"><![CDATA[(UTC+07:00) Krasnojarsk]]></item>
+               <item name="wcf.global.date.timezone.asia.irkutsk"><![CDATA[(UTC+08:00) Irkutsk]]></item>
+               <item name="wcf.global.date.timezone.asia.kuala_lumpur"><![CDATA[(UTC+08:00) Kuala Lumpur, Singapur]]></item>
+               <item name="wcf.global.date.timezone.asia.chongqing"><![CDATA[(UTC+08:00) Peking, Chongqing, Hongkong, Urumchi]]></item>
+               <item name="wcf.global.date.timezone.australia.perth"><![CDATA[(UTC+08:00) Perth]]></item>
+               <item name="wcf.global.date.timezone.asia.taipei"><![CDATA[(UTC+08:00) Taipeh]]></item>
+               <item name="wcf.global.date.timezone.asia.ulaanbaatar"><![CDATA[(UTC+08:00) Ulan-Bator]]></item>
+               <item name="wcf.global.date.timezone.asia.yakutsk"><![CDATA[(UTC+09:00) Jakutsk]]></item>
+               <item name="wcf.global.date.timezone.asia.tokyo"><![CDATA[(UTC+09:00) Osaka, Sapporo, Tokio]]></item>
+               <item name="wcf.global.date.timezone.asia.seoul"><![CDATA[(UTC+09:00) Seoul]]></item>
+               <item name="wcf.global.date.timezone.australia.adelaide"><![CDATA[(UTC+09:30) Adelaide]]></item>
+               <item name="wcf.global.date.timezone.australia.darwin"><![CDATA[(UTC+09:30) Darwin]]></item>
+               <item name="wcf.global.date.timezone.australia.brisbane"><![CDATA[(UTC+10:00) Brisbane]]></item>
+               <item name="wcf.global.date.timezone.australia.sydney"><![CDATA[(UTC+10:00) Canberra, Melbourne, Sydney]]></item>
+               <item name="wcf.global.date.timezone.pacific.guam"><![CDATA[(UTC+10:00) Guam, Port Moresby]]></item>
+               <item name="wcf.global.date.timezone.australia.hobart"><![CDATA[(UTC+10:00) Hobart]]></item>
+               <item name="wcf.global.date.timezone.asia.vladivostok"><![CDATA[(UTC+10:00) Wladiwostok]]></item>
+               <item name="wcf.global.date.timezone.asia.magadan"><![CDATA[(UTC+11:00) Magadan]]></item>
+               <item name="wcf.global.date.timezone.pacific.noumea"><![CDATA[(UTC+11:00) Salomonen, Neu-Kaledonien]]></item>
+               <item name="wcf.global.date.timezone.pacific.auckland"><![CDATA[(UTC+12:00) Auckland, Wellington]]></item>
+               <item name="wcf.global.date.timezone.pacific.fiji"><![CDATA[(UTC+12:00) Fidschi]]></item>
+               <item name="wcf.global.date.timezone.asia.kamchatka"><![CDATA[(UTC+12:00) Kamtschatka]]></item>
+               <item name="wcf.global.date.timezone.pacific.tongatapu"><![CDATA[(UTC+13:00) Nuku'alofa]]></item>
+       </category>
+       <category name="wcf.imageViewer">
+               <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Bild " + (this.currentIndex + 1) + " von " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>
+               <item name="wcf.imageViewer.close"><![CDATA[Schließen]]></item>
+               <item name="wcf.imageViewer.enlarge"><![CDATA[Nur dieses Bild anzeigen (beendet die Bildbetrachtung)]]></item>
+               <item name="wcf.imageViewer.next"><![CDATA[Nächstes Bild]]></item>
+               <item name="wcf.imageViewer.pause"><![CDATA[Diashow stoppen]]></item>
+               <item name="wcf.imageViewer.play"><![CDATA[Diashow starten (Bildwechsel alle 5 Sekunden)]]></item>
+               <item name="wcf.imageViewer.previous"><![CDATA[Vorheriges Bild]]></item>
+       </category>
+       <category name="wcf.option">
+               <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Kanarische Inseln, Lissabon, London, Monrovia, Ouagadougou, Reykjav&iacute;k]]></item>
+               <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brüssel, Kopenhagen, Madrid, Paris, Prag, Rom, Sarajevo, Stockholm, Tunis, Warschau, Wien]]></item>
+               <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athen, Beirut, Bukarest, Helsinki, Istanbul, Jerusalem, Kairo, Kapstadt, Khartum, Kiew, Minsk, Sofia]]></item>
+               <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Abeba, Antananarivo, Bagdad, Daressalam, Kampala, Kuwait, Mogadischu, Moskau, Nairobi, Riad]]></item>
+               <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Teheran]]></item>
+               <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Eriwan, Maskat, R&eacute;union, Tiflis]]></item>
+               <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>
+               <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Asgabat, Bischkek, Duschanbe, Islamabad, Jekaterinburg, Karatschi, Malediven, Taschkent]]></item>
+               <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, Neu-Delhi]]></item>
+               <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>
+               <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Nowosibirsk]]></item>
+               <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Kokosinseln, Rangun]]></item>
+               <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnojarsk, Vientiane]]></item>
+               <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hongkong, Irkutsk, Kuala Lumpur, Manila, Peking, Perth, Singapur, Taipeh, Ulan Bator]]></item>
+               <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Australien)]]></item>
+               <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Jakutsk, Osaka, Pjöngjang, Sapporo, Seoul, Tokyo]]></item>
+               <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>
+               <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Wladiwostok]]></item>
+               <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord-Howe-Insel (Australien)]]></item>
+               <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, Neukaledonien, Salomonen]]></item>
+               <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolkinsel]]></item>
+               <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, Bairiki, Fidschi, Kamtschatka, Marshall-Inseln, Wellington]]></item>
+               <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham-Inseln (Neuseeland)]]></item>
+               <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenixinseln]]></item>
+               <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Linieninseln, Weihnachtsinsel]]></item>
+               <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azoren, Kapverdische Inseln]]></item>
+               <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>
+               <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Bras&iacute;lia, Buenos Aires, Cayenne, Georgetown, Grönland, Montevideo]]></item>
+               <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Neufundland]]></item>
+               <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Asunci&oacute;n, Atlantik (Kanada), La Paz, Port-of-Spain, Santiago]]></item>
+               <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>
+               <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Atlanta, Bogot&aacute;, Detroit, Lima, Miami, New York, San Francisco de Quito, Toronto]]></item>
+               <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Chicago, Dallas, Kansas City, Mexiko-Stadt, Winnipeg, Zentralamerika]]></item>
+               <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Arizona, Calgary, Chihuahua, Denver, Mazatlan, Salt Lake City]]></item>
+               <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Los Angeles, Seattle, Tijuana, Vancouver]]></item>
+               <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>
+               <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) Französisch-Polynesien]]></item>
+               <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cookinseln, Hawaii]]></item>
+               <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midwayinseln, Samoa]]></item>
+               <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Eniwetok, Kwajalein]]></item>
+       </category>
+       <category name="wcf.page">
+               <item name="wcf.page.pageNo"><![CDATA[Seite {#$pageNo}]]></item>
+       </category>
+       <category name="wcf.user">
+               <item name="wcf.user.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>
+               <item name="wcf.user.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>
+               <item name="wcf.user.email"><![CDATA[E-Mail-Adresse]]></item>
+               <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch.]]></item>
+               <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>
+               <item name="wcf.user.error.email.notUnique"><![CDATA[Diese E-Mail-Adresse ist bereits durch einen anderen Benutzer vergeben.]]></item>
+               <item name="wcf.user.error.email.notValid"><![CDATA[Sie haben eine ungültige E-Mail-Adresse eingegeben.]]></item>
+               <item name="wcf.user.error.password.false"><![CDATA[Dieses Kennwort ist falsch.]]></item>
+               <item name="wcf.user.error.username.notFound"><![CDATA[Der Benutzername &raquo;{$username}&laquo; konnte nicht gefunden werden.]]></item>
+               <item name="wcf.user.error.username.notUnique"><![CDATA[Dieser Benutzername ist bereits vergeben.]]></item>
+               <item name="wcf.user.error.username.notValid"><![CDATA[Sie haben einen ungültigen Benutzernamen eingegeben.]]></item>
+               <item name="wcf.user.language"><![CDATA[Sprache]]></item>
+               <item name="wcf.user.language.description"><![CDATA[Bitte wählen Sie aus, in welcher Sprache die Benutzeroberfläche erscheinen soll!]]></item>
+               <item name="wcf.user.logout"><![CDATA[Abmelden]]></item>
+               <item name="wcf.user.password"><![CDATA[Kennwort]]></item>
+               <item name="wcf.user.registrationDate"><![CDATA[Registrierungsdatum]]></item>
+               <item name="wcf.user.userID"><![CDATA[Benutzer-ID]]></item>
+               <item name="wcf.user.username"><![CDATA[Benutzername]]></item>
+               <item name="wcf.user.visibleLanguages"><![CDATA[Zeige Inhalte in folgenden Sprachen an]]></item>
+               <item name="wcf.user.visibleLanguages.description"><![CDATA[Geben Sie an, in welchen Sprachen erstellte Inhalte angezeigt werden sollen.]]></item>
+       </category>
+       <category name="wcf.user.option">
+               <item name="wcf.user.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>
+       </category>
+</language>
index 8c580da668d1f2e284e01f7c05ba384feb18acf6..877c1f72c852f14ad94484a0f8b1ea752b5bd3bd 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="en">\r
-       <category name="wcf.acp">\r
-               <item name="wcf.acp"><![CDATA[Administration Control Panel]]></item>\r
-               <item name="wcf.acp.help"><![CDATA[Help]]></item>\r
-               <item name="wcf.acp.help.complete"><![CDATA[Complete Help]]></item>\r
-               <item name="wcf.acp.help.disable"><![CDATA[Disable online Help]]></item>\r
-               <item name="wcf.acp.help.interactive"><![CDATA[Interactive Help]]></item>\r
-               <item name="wcf.acp.packageQuickAccess"><![CDATA[Change Package]]></item>\r
-               <item name="wcf.acp.search.extended"><![CDATA[Extended search ...]]></item>\r
-               <item name="wcf.acp.sitemap"><![CDATA[Site-Map]]></item>\r
-       </category>\r
-       <category name="wcf.acp.cache">\r
-               <item name="wcf.acp.cache.button.clear"><![CDATA[Empty cache]]></item>\r
-               <item name="wcf.acp.cache.clear.success"><![CDATA[The cache has been successfully emptied.]]></item>\r
-               <item name="wcf.acp.cache.clear.sure"><![CDATA[Are you sure that you want to completely empty the cache?]]></item>\r
-               <item name="wcf.acp.cache.data"><![CDATA[Settings]]></item>\r
-               <item name="wcf.acp.cache.data.files"><![CDATA[Files]]></item>\r
-               <item name="wcf.acp.cache.data.size"><![CDATA[Size]]></item>\r
-               <item name="wcf.acp.cache.data.source"><![CDATA[Source]]></item>\r
-               <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>\r
-               <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.cache.list.mtime"><![CDATA[Last updated]]></item>\r
-               <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>\r
-               <item name="wcf.acp.cache.list.perm"><![CDATA[Permissions]]></item>\r
-               <item name="wcf.acp.cache.list.size"><![CDATA[Size]]></item>\r
-       </category>\r
-       <category name="wcf.acp.cronjob">\r
-               <item name="wcf.acp.cronjob.active"><![CDATA[Enabled]]></item>\r
-               <item name="wcf.acp.cronjob.add"><![CDATA[Add a new cron job]]></item>\r
-               <item name="wcf.acp.cronjob.add.data"><![CDATA[General Information]]></item>\r
-               <item name="wcf.acp.cronjob.add.success"><![CDATA[The cron job has been added successfully.]]></item>\r
-               <item name="wcf.acp.cronjob.add.timing"><![CDATA[Schedule]]></item>\r
-               <item name="wcf.acp.cronjob.className"><![CDATA[Class path]]></item>\r
-               <item name="wcf.acp.cronjob.className.description"><![CDATA[Please enter here the path to the PHP file in which the associated cron job class is contained. This path must be relative to the installation folder of the WCF.]]></item>\r
-               <item name="wcf.acp.cronjob.cronjobID"><![CDATA[Job ID]]></item>\r
-               <item name="wcf.acp.cronjob.delete"><![CDATA[Delete]]></item>\r
-               <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[This cron job cannot be deleted.]]></item>\r
-               <item name="wcf.acp.cronjob.delete.success"><![CDATA[The cron job has been deleted successfully.]]></item>\r
-               <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Are you sure that you want to remove this cron job?]]></item>\r
-               <item name="wcf.acp.cronjob.description"><![CDATA[Description]]></item>\r
-               <item name="wcf.acp.cronjob.description.description"><![CDATA[Here you may enter a short description for the cron job (preferably in English).]]></item>\r
-               <item name="wcf.acp.cronjob.disable"><![CDATA[Disable]]></item>\r
-               <item name="wcf.acp.cronjob.edit"><![CDATA[Edit]]></item>\r
-               <item name="wcf.acp.cronjob.edit.data"><![CDATA[General Information]]></item>\r
-               <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[This cron job cannot be edited.]]></item>\r
-               <item name="wcf.acp.cronjob.edit.success"><![CDATA[The cron job has been modified successfully.]]></item>\r
-               <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Schedule]]></item>\r
-               <item name="wcf.acp.cronjob.enable"><![CDATA[Enable]]></item>\r
-               <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[The path you have entered is invalid.]]></item>\r
-               <item name="wcf.acp.cronjob.error.empty"><![CDATA[Please enter a valid entry here.]]></item>\r
-               <item name="wcf.acp.cronjob.error.notValid"><![CDATA[The timings you have set are invalid.]]></item>\r
-               <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Schedule multiple executions?]]></item>\r
-               <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[When enabled, the respective task (cronjob) will be repeatedly executed at all possible dates between the previous specified execution date and the next.]]></item>\r
-               <item name="wcf.acp.cronjob.execute"><![CDATA[Execute now]]></item>\r
-               <item name="wcf.acp.cronjob.execute.success"><![CDATA[The job has been executed successfully.]]></item>\r
-               <item name="wcf.acp.cronjob.inactive"><![CDATA[Disabled]]></item>\r
-               <item name="wcf.acp.cronjob.info"><![CDATA[General Information]]></item>\r
-               <item name="wcf.acp.cronjob.intro"><![CDATA[Configuring cronjobs (automatized scheduled tasks) requires distinct knowledge of the crontab syntax on Unix based systems. More information about this topic can be obtained on the following Webpage: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>.]]></item>\r
-               <item name="wcf.acp.cronjob.lastExec"><![CDATA[Last scheduled execution]]></item>\r
-               <item name="wcf.acp.cronjob.list"><![CDATA[Cron jobs]]></item>\r
-               <item name="wcf.acp.cronjob.list.count"><![CDATA[There is a total of {#$items} cronjob{if $items != 1}s{/if}]]></item>\r
-               <item name="wcf.acp.cronjob.log"><![CDATA[Log of executed cronjobs]]></item>\r
-               <item name="wcf.acp.cronjob.log.clear"><![CDATA[Delete all]]></item>\r
-               <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Are you sure that you want to remove all log entries?]]></item>\r
-               <item name="wcf.acp.cronjob.log.data"><![CDATA[There is a total of {#$items} {if $items == 1}entry{else}entries{/if}]]></item>\r
-               <item name="wcf.acp.cronjob.log.error"><![CDATA[Error:]]></item>\r
-               <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Successfully executed]]></item>\r
-               <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[There are currently no log entries available.]]></item>\r
-               <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>\r
-               <item name="wcf.acp.cronjob.nextExec"><![CDATA[Next scheduled execution]]></item>\r
-               <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[There are currently no cronjobs available.]]></item>\r
-               <item name="wcf.acp.cronjob.packageName"><![CDATA[Installed by]]></item>\r
-               <item name="wcf.acp.cronjob.runNow"><![CDATA[Run now]]></item>\r
-               <item name="wcf.acp.cronjob.startDom"><![CDATA[Day of month]]></item>\r
-               <item name="wcf.acp.cronjob.startDom.description"><![CDATA[Day of the month (1 - 31) in which the cron job should be executed.]]></item>\r
-               <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>\r
-               <item name="wcf.acp.cronjob.startDow"><![CDATA[Weekday]]></item>\r
-               <item name="wcf.acp.cronjob.startDow.description"><![CDATA[Weekday (0 - 6 with Sunday = 0 or mon - sun) in which the cron job should be executed.]]></item>\r
-               <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>\r
-               <item name="wcf.acp.cronjob.startHour"><![CDATA[Hour]]></item>\r
-               <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Hours (0 - 23) in which the cron job should be executed.]]></item>\r
-               <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>\r
-               <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>\r
-               <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Minutes (0 - 59) in which the cron job should be executed.]]></item>\r
-               <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>\r
-               <item name="wcf.acp.cronjob.startMonth"><![CDATA[Month]]></item>\r
-               <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[Month (1 - 12 or jan - dec) in which the cron job should be executed.]]></item>\r
-               <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>\r
-               <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>\r
-               <item name="wcf.acp.cronjob.subtitle"><![CDATA[]]></item>\r
-       </category>\r
-       <category name="wcf.acp.group">\r
-               <item name="wcf.acp.group.add"><![CDATA[Add new user group]]></item>\r
-               <item name="wcf.acp.group.add.permissions"><![CDATA[Permissions]]></item>\r
-               <item name="wcf.acp.group.add.success"><![CDATA[The user group has been successfully added.]]></item>\r
-               <item name="wcf.acp.group.administrators"><![CDATA[Administrators]]></item>\r
-               <item name="wcf.acp.group.data"><![CDATA[General group information]]></item>\r
-               <item name="wcf.acp.group.delete"><![CDATA[Delete this user group]]></item>\r
-               <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}This user group has{else}{#$deletedGroups} These user groups have{/if} been successfully deleted.]]></item>\r
-               <item name="wcf.acp.group.delete.sure"><![CDATA[Are you sure you would like to remove this user group?]]></item>\r
-               <item name="wcf.acp.group.edit"><![CDATA[Edit this user group]]></item>\r
-               <item name="wcf.acp.group.edit.success"><![CDATA[Your user group changes have been successfully saved.]]></item>\r
-               <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[You are currently a member of this user group. Changing the permissions of this user group could result in locking yourself out of the Administration Control Panel. Please be careful!]]></item>\r
-               <item name="wcf.acp.group.everyone"><![CDATA[Everyone]]></item>\r
-               <item name="wcf.acp.group.groupID"><![CDATA[Group ID]]></item>\r
-               <item name="wcf.acp.group.groupName"><![CDATA[Name of this user group]]></item>\r
-               <item name="wcf.acp.group.groupName.description"><![CDATA[Enter here a name for this group.]]></item>\r
-               <item name="wcf.acp.group.guests"><![CDATA[Guests]]></item>\r
-               <item name="wcf.acp.group.list"><![CDATA[User groups]]></item>\r
-               <item name="wcf.acp.group.list.data"><![CDATA[A total of {#$items} user groups]]></item>\r
-               <item name="wcf.acp.group.members"><![CDATA[Number of members]]></item>\r
-               <item name="wcf.acp.group.moderators"><![CDATA[Moderators]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Can enter Administration Control Panel?]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Activating this option will allow members of this user group to enter the Administration Control Panel and, dependent upon their permissions, run certain actions.]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Can view private user options]]></item>\r
-               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Members of this user group can view private user options.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Can change the system options?]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Activating this option will allow members of this user group to view and change the system options - e.g. Forum on/offline.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Can view logs]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Members of this user group can view the system logs.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Can add new cronjobs]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Members of this user group can add new cronjobs.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Can delete existing cronjobs]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Members of this user group can delete existing cronjobs.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Can delete log files of running cronjobs]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Members of this user group can delete log files of running cronjobs. The log files are also checked by the associated cronjob if the log file was successfully written.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Can edit existing cronjobs]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Members of this user group can edit existing cronjobs.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Can disable existing cronjobs]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Members of this user group can disable existing cronjobs. Disabling a cronjob only stops the actual cronjob from running, but does not remove it.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Can edit existing update servers]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Members of this user group can edit existing update servers and add new update servers.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Can install new packages]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Members of this user group can install additional packages.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Can remove existing packages]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Members of this user group can remove existing packages.]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Can update existing packages]]></item>\r
-               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Members of this user group can update existing packages.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Accessible user groups]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Members of this user group have access to the following groups. For example, here you can set if the user group has permission to edit themselves.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Can add new user groups]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Members of this user group can add new user groups.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Can add new users]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Members of this user group can add new users. If the option for &quot;Accessible User groups&quot; has been enabled, then on creation of the user, the appropriate accessible user groups can also be assigned.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Can delete existing user groups]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Members of this user group can remove existing user groups.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Can delete existing users]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Members of this user group can delete existing users.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Can edit existing user groups]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Members of this user group can edit existing user groups.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Can edit user e-mail addresses]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Members of this user group can edit user e-mail addresses.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Can edit user passwords]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Members of this user group can edit user passwords.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Can edit existing users]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Members of this user group can edit existing users.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Can send e-mails to users]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Members of this user group can view other members' e-mail addresses and consequently send them e-mails.]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Can search users]]></item>\r
-               <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Members of this user group can search existing users and their profiles.]]></item>\r
-               <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrator permissions]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Content]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Design]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.general"><![CDATA[General administrative permissions]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Maintenance]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System functions]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Cronjobs]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Package management]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user"><![CDATA[User functions]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Group management]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[User management]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderator permissions]]></item>\r
-               <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.category.user"><![CDATA[General permissions]]></item>\r
-               <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>\r
-               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Can view disabled styles]]></item>\r
-               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Members of this user group can choose to view disabled styles.]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Style management]]></item>\r
-               <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.group.showMembers"><![CDATA[Show the members of this user group]]></item>\r
-               <item name="wcf.acp.group.superModerators"><![CDATA[Super moderators]]></item>\r
-               <item name="wcf.acp.group.users"><![CDATA[Registered users]]></item>\r
-       </category>\r
-       <category name="wcf.acp.login">\r
-               <item name="wcf.acp.login"><![CDATA[Login]]></item>\r
-               <item name="wcf.acp.login.data"><![CDATA[Login details]]></item>\r
-       </category>\r
-       <category name="wcf.acp.masterPassword">\r
-               <item name="wcf.acp.masterPassword"><![CDATA[Master password]]></item>\r
-               <item name="wcf.acp.masterPassword.confirm"><![CDATA[Confirm master password]]></item>\r
-               <item name="wcf.acp.masterPassword.enter"><![CDATA[Master password required]]></item>\r
-               <item name="wcf.acp.masterPassword.enter.description"><![CDATA[This page or action requires you to enter the master password due to security reasons. You only need to do so once within a session. If you have forgotten the master password you can reset it by deleting the file <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em>.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[The master password is not correct.If you have forgotten the master password you can reset it by deleting the file <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em>.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[The entered passwords are not identical.]]></item>\r
-               <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[The password is not secure. It has to contain at least eight characters, small and capital latin letters as well as numbers and special characters. It must not be identically with passwords of administrators of this page.]]></item>\r
-               <item name="wcf.acp.masterPassword.example"><![CDATA[Suggestion]]></item>\r
-               <item name="wcf.acp.masterPassword.example.set"><![CDATA[Use suggestion]]></item>\r
-               <item name="wcf.acp.masterPassword.init"><![CDATA[Set master password]]></item>\r
-               <item name="wcf.acp.masterPassword.init.description"><![CDATA[The master password is an additional protection for functions that are relevant to security. You should use a very secure password that must not be identically with your normal administrator password, unknown to others and not used on other websites.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.menu">\r
-               <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatic update]]></item>\r
-               <item name="wcf.acp.menu.link.content"><![CDATA[Content]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Add new cronjob]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[View cronjob logs]]></item>\r
-               <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[List cronjobs]]></item>\r
-               <item name="wcf.acp.menu.link.display"><![CDATA[Design]]></item>\r
-               <item name="wcf.acp.menu.link.group"><![CDATA[User groups]]></item>\r
-               <item name="wcf.acp.menu.link.group.add"><![CDATA[Add new group]]></item>\r
-               <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-mail all group members]]></item>\r
-               <item name="wcf.acp.menu.link.group.view"><![CDATA[Group overview]]></item>\r
-               <item name="wcf.acp.menu.link.log"><![CDATA[Log]]></item>\r
-               <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.menu.link.log.session"><![CDATA[Session]]></item>\r
-               <item name="wcf.acp.menu.link.maintenance"><![CDATA[Maintenance]]></item>\r
-               <item name="wcf.acp.menu.link.option"><![CDATA[Options]]></item>\r
-               <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Import &amp; export]]></item>\r
-               <item name="wcf.acp.menu.link.package"><![CDATA[Packages]]></item>\r
-               <item name="wcf.acp.menu.link.package.database"><![CDATA[Search packages]]></item>\r
-               <item name="wcf.acp.menu.link.package.install"><![CDATA[Install new package]]></item>\r
-               <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Add new server]]></item>\r
-               <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server overview]]></item>\r
-               <item name="wcf.acp.menu.link.package.view"><![CDATA[List installed packages]]></item>\r
-               <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>\r
-               <item name="wcf.acp.menu.link.user"><![CDATA[User]]></item>\r
-               <item name="wcf.acp.menu.link.user.add"><![CDATA[Add user]]></item>\r
-               <item name="wcf.acp.menu.link.user.list"><![CDATA[List users]]></item>\r
-               <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-mail all users]]></item>\r
-               <item name="wcf.acp.menu.link.user.management"><![CDATA[Users]]></item>\r
-               <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Bulk processing of users]]></item>\r
-               <item name="wcf.acp.menu.link.user.search"><![CDATA[Search for users]]></item>\r
-       </category>\r
-       <category name="wcf.acp.option">\r
-               <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Exclude hostnames]]></item>\r
-               <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Enter one hostname each row you want to exclude from this site.]]></item>\r
-               <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[Exclude IP addresses]]></item>\r
-               <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Enter one IP address each row you want to exclude from this site.]]></item>\r
-               <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Exclude user agents]]></item>\r
-               <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Enter one user agent each row you want to exclude from this site.]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache server]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Enter the address of the memcache server. You can enter one server each row.]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Use persistent connections]]></item>\r
-               <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[By enabling this option a persistent connection to the memcache server will be used.]]></item>\r
-               <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache type]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Please select the type of cache you want to use. Some of the types have special requirements to the server system and cannot be used in your environment.]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[File system (default)]]></item>\r
-               <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (experimental)]]></item>\r
-               <item name="wcf.acp.option.category.general"><![CDATA[General]]></item>\r
-               <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.general"><![CDATA[General]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>\r
-               <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache stores data in the memory that is often accessed. This may reduce the database load dramatically. Read more about the memcache on the following site:\r
-<ul>\r
-       <li><a href="http://memcached.org/">memcached.org</a></li>\r
-</ul>]]></item>\r
-               <item name="wcf.acp.option.category.general.date"><![CDATA[Date and time]]></item>\r
-               <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>\r
-               <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>\r
-               <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>\r
-               <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy server]]></item>\r
-               <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[You can configure optional proxy servers for connections to external servers.]]></item>\r
-               <item name="wcf.acp.option.category.general.mail"><![CDATA[E-mails]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.general"><![CDATA[General]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Transmission]]></item>\r
-               <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.general.offline"><![CDATA[Disable forum temporarily]]></item>\r
-               <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module"><![CDATA[Modules on / off]]></item>\r
-               <item name="wcf.acp.option.category.module.content"><![CDATA[Content]]></item>\r
-               <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.display"><![CDATA[Display]]></item>\r
-               <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>\r
-               <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.module.user"><![CDATA[User]]></item>\r
-               <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security"><![CDATA[Security]]></item>\r
-               <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>\r
-               <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internet pages are often attacked by programs and robots. E.g. it is possible to create hundreds of user accounts automatically. You can protect yourself against these spam bots with so called <a href="http://en.wikipedia.org/wiki/Captcha" class="externalURL">Captcha images</a> on every place where web forms can be submitted. Unregistered users then first have to identify the code on the Captcha before they can submit the form. Robots cannot read the code. Please not that Captcha images cannot be read by blind and visually impaired people.]]></item>\r
-               <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>\r
-               <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.censorship"><![CDATA[Censorship]]></item>\r
-               <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.general"><![CDATA[General]]></item>\r
-               <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sessions]]></item>\r
-               <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.category.user"><![CDATA[Users]]></item>\r
-               <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookie domain]]></item>\r
-               <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Enter here the domain in which the cookie should be used. This is optional, so in most cases you don't need to specify the cookie domain.]]></item>\r
-               <item name="wcf.acp.option.cookie_path"><![CDATA[Cookie path]]></item>\r
-               <item name="wcf.acp.option.cookie_path.description"><![CDATA[The cookie path is concurrent to the document root of your site - e.g. &quot;/forum&quot; for http://www.woltlab.com/forum.]]></item>\r
-               <item name="wcf.acp.option.cookie_prefix"><![CDATA[Cookie prefix]]></item>\r
-               <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Enter a prefix to be used for the cookie name here.]]></item>\r
-               <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Enable automatic Daylight Savings Time]]></item>\r
-               <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Should the clock automatically change according to the summer/winter time?]]></item>\r
-               <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Use cache method for session data]]></item>\r
-               <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Should the selected cache method be used to save the session data?]]></item>\r
-               <item name="wcf.acp.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>\r
-               <item name="wcf.acp.option.export"><![CDATA[Export options]]></item>\r
-               <item name="wcf.acp.option.export.download"><![CDATA[Download the exported options]]></item>\r
-               <item name="wcf.acp.option.export.download.description"><![CDATA[Download the exported options as a backup file to your local machine.]]></item>\r
-               <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Enable Gzip compression]]></item>\r
-               <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Enable this option to send content from the server to clients in a compressed form. This option reduces traffic.]]></item>\r
-               <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Disable caching of pages in browsers]]></item>\r
-               <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Enabling this option will prevent browsers from caching the pages.]]></item>\r
-               <item name="wcf.acp.option.http_gzip_level"><![CDATA[Compression level]]></item>\r
-               <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[A value of 1 to 9 is required. For optimum output for compression and server performance, we recommend a value of 1.]]></item>\r
-               <item name="wcf.acp.option.import"><![CDATA[Import options]]></item>\r
-               <item name="wcf.acp.option.import.error.importFailed"><![CDATA[The import of the chosen file has failed.]]></item>\r
-               <item name="wcf.acp.option.import.success"><![CDATA[The options have been imported successfully.]]></item>\r
-               <item name="wcf.acp.option.import.upload"><![CDATA[Upload the options]]></item>\r
-               <item name="wcf.acp.option.import.upload.description"><![CDATA[Upload the options to be imported from your local machine.]]></item>\r
-               <item name="wcf.acp.option.importAndExport"><![CDATA[Import &amp; Export options]]></item>\r
-               <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator's e-mail address]]></item>\r
-               <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Enter the administrator's e-mail address here.]]></item>\r
-               <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Path to the debug log file]]></item>\r
-               <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Enter the path to the log file here]]></item>\r
-               <item name="wcf.acp.option.mail_from_address"><![CDATA[Sender's e-mail address]]></item>\r
-               <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Enter the sender's e-mail address that should be used for automated e-mails here.]]></item>\r
-               <item name="wcf.acp.option.mail_from_name"><![CDATA[Sender's name]]></item>\r
-               <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Enter the sender's name that should be used for automated e-mails here.]]></item>\r
-               <item name="wcf.acp.option.mail_send_method"><![CDATA[E-mail method]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Choose an e-mail transmission method.]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>\r
-               <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>\r
-               <item name="wcf.acp.option.mail_signature"><![CDATA[Sender's signature]]></item>\r
-               <item name="wcf.acp.option.mail_signature.description"><![CDATA[Enter a signature that should be sent with system e-mails here.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP host]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Enter the SMTP server name here.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP password]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Enter the SMTP password here.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP port]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Enter the SMTP server port here.]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP username]]></item>\r
-               <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Enter the SMTP user name here.]]></item>\r
-               <item name="wcf.acp.option.mail_use_f_param"><![CDATA[Enable the &quot;-f&quot; parameter]]></item>\r
-               <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Some servers may require the &quot;-f&quot; parameter to be used when sending e-mails. If your users experience problems with receiving e-mails, try enabling this option.]]></item>\r
-               <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Use formatted e-mail addresses]]></item>\r
-               <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Sender's and receiver's addresses are formatted in &quot;Name &lt;email@domain.tld&gt;&quot;. This option is not supported by all mail servers and should be turned off in case of any problems.]]></item>\r
-               <item name="wcf.acp.option.module_master_password"><![CDATA[Enable master password]]></item>\r
-               <item name="wcf.acp.option.module_master_password.description"><![CDATA[Pages and forms within the admin panel that are relevant to security can be protected with an additional master password.]]></item>\r
-               <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>\r
-               <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server for HTTP connections]]></item>\r
-               <item name="wcf.acp.option.session_timeout"><![CDATA[Session timeout]]></item>\r
-               <item name="wcf.acp.option.session_timeout.description"><![CDATA[Enter how long a session should remain valid for here [seconds].]]></item>\r
-               <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[Check IP address of session]]></item>\r
-               <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[The number or block of an IP address that should be checked while reading the session data. A high number can exclude users that use changing IP addresses.]]></item>\r
-               <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Check user agent of session]]></item>\r
-               <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Should the user agent be checked while reading the session data?]]></item>\r
-               <item name="wcf.acp.option.success"><![CDATA[Your option changes have been successfully saved.]]></item>\r
-               <item name="wcf.acp.option.timezone"><![CDATA[Time zone offset]]></item>\r
-               <item name="wcf.acp.option.timezone.description"><![CDATA[Choose your default time zone for your site.]]></item>\r
-               <item name="wcf.acp.option.user_online_timeout"><![CDATA[Users online timeout]]></item>\r
-               <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Enter here how long users should remain marked as online after they are inactive [seconds].]]></item>\r
-               <item name="wcf.acp.option.category.general.page"><![CDATA[Page]]></item>\r
-               <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.option.meta_description"><![CDATA[Meta description]]></item>\r
-               <item name="wcf.acp.option.meta_description.description"><![CDATA[Enter a meta description here.]]></item>\r
-               <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta keywords]]></item>\r
-               <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Enter some meta keywords here.]]></item>\r
-               <item name="wcf.acp.option.page_description"><![CDATA[Page description]]></item>\r
-               <item name="wcf.acp.option.page_description.description"><![CDATA[Enter a short description of the page.]]></item>\r
-               <item name="wcf.acp.option.page_title"><![CDATA[Page title]]></item>\r
-               <item name="wcf.acp.option.page_title.description"><![CDATA[Enter the global title of the page here. That title will show up inside the board header, if you have enabled it with the style editor.]]></item>\r
-               <item name="wcf.acp.option.page_url"><![CDATA[Page URL]]></item>\r
-               <item name="wcf.acp.option.page_url.description"><![CDATA[Please enter the URL of the page (without trailing slash).]]></item>\r
-               <item name="wcf.acp.option.page_urls"><![CDATA[Further URLs]]></item>\r
-               <item name="wcf.acp.option.page_urls.description"><![CDATA[Enter further URLs which are also directed at your site.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.package">\r
-               <item name="wcf.acp.package.cancel"><![CDATA[Cancel package installation]]></item>\r
-               <item name="wcf.acp.package.description"><![CDATA[Description]]></item>\r
-               <item name="wcf.acp.package.install"><![CDATA[Package Installation]]></item>\r
-               <item name="wcf.acp.package.install.cancel"><![CDATA[Cancel the installation]]></item>\r
-               <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Are you sure you would like to cancel this installation?]]></item>\r
-               <item name="wcf.acp.package.install.error"><![CDATA[Package dependencies could not be satisfied for this Package.]]></item>\r
-               <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[The {if $action == 'install'}package installation{else}package update{/if} of package &quot;{$packageName}&quot; in version {$packageVersion} cannot be executed due to incompatibilities with the following {if $excludedPackages|count == 1}package{else}packages{/if}:]]></item>\r
-               <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in version {$excludedPackage.packageVersion}]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Following package doesn't{else}Following packages don't{/if} allow the {if $action == 'install'}package installation{else}package update{/if} of package &quot;{$packageName}&quot; in version {$packageVersion} due to incompatibilities:]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in version {$excludingPackage.packageVersion}]]></item>\r
-               <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Following package is{else}Following packages are{/if} incompatible with package &quot;{$packageName}&quot; in version {$packageVersion}. If you proceed installation the {if $excludingPackages|count == 1}package{else}packages{/if} probably won't work anymore.]]></item>\r
-\r
-               <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}Installed{else}{if $package.file|isset}is located within this Package{else}Not available{/if}{/if})</span>]]></item>\r
-               <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Are you sure you would like to cancel the installation of this package?]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances"><![CDATA[The following packages can be updated with this package]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Select one of the following packages, in order to update its version. If you would like to install the package again, please click on &quot;{lang}wcf.global.button.next{/lang}&quot;.]]></item>\r
-               <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[A copy of this package is already installed. If you continue, a further copy of this package will be installed. If you would like to update an available copy of this package, please select the copy from the following list.]]></item>\r
-               <item name="wcf.acp.package.install.version"><![CDATA[Package Version:]]></item>\r
-               <item name="wcf.acp.package.installDate"><![CDATA[Installation date]]></item>\r
-               <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[While unpacking the files of this package the following error occured:]]></item>\r
-               <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[The following files could not be unpacked successfully. Please check if the destination folder is writable.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Conflicting Tables]]></item>\r
-               <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Do not overwrite these tables and do not ask me again for this installation.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Overwrite the existing tables and do not ask me again for this installation.]]></item>\r
-               <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Required changes]]></item>\r
-               <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Tables affected]]></item>\r
-               <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Existing database tables conflict with the tables required to be installed by this package. Please choose whether to overwrite these tables.]]></item>\r
-               <item name="wcf.acp.package.list"><![CDATA[Installed packages]]></item>\r
-               <item name="wcf.acp.package.list.author"><![CDATA[Author]]></item>\r
-               <item name="wcf.acp.package.list.count"><![CDATA[A total of {#$items} packages installed]]></item>\r
-               <item name="wcf.acp.package.list.date"><![CDATA[Date]]></item>\r
-               <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>\r
-               <item name="wcf.acp.package.list.other"><![CDATA[Package]]></item>\r
-               <item name="wcf.acp.package.list.plugin"><![CDATA[Plugin]]></item>\r
-               <item name="wcf.acp.package.list.standalone"><![CDATA[Standalone application]]></item>\r
-               <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>\r
-               <item name="wcf.acp.package.optionals"><![CDATA[Install optional packages]]></item>\r
-               <item name="wcf.acp.package.optionals.description"><![CDATA[The selected package brings the following options. Please select those you would like to install.]]></item>\r
-               <item name="wcf.acp.package.optionals.installed"><![CDATA[ (This Package is already installed.)]]></item>\r
-               <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (The requirements of this Package have not been fulfilled.)]]></item>\r
-               <item name="wcf.acp.package.packageDir"><![CDATA[Installation folder]]></item>\r
-               <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Another application is already installed in this folder.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[This folder is not valid.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[This folder is not writable.]]></item>\r
-               <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[This folder is already in use by the WoltLab Community Framework. Please choose a different location.]]></item>\r
-               <item name="wcf.acp.package.packageDir.input"><![CDATA[Please enter the installation folder name here.]]></item>\r
-               <item name="wcf.acp.package.packageDir.url"><![CDATA[This application is accessible through the following URL after installation in this folder:]]></item>\r
-               <item name="wcf.acp.package.requirements"><![CDATA[Select dependencies]]></item>\r
-               <item name="wcf.acp.package.requirements.description"><![CDATA[The current package requires another package that is already installed several times. Please choose the instance that is required.]]></item>\r
-               <item name="wcf.acp.package.rollback"><![CDATA[Rollback package installation]]></item>\r
-               <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright &copy; {$packageAuthor}]]></item>\r
-               <item name="wcf.acp.package.startInstall"><![CDATA[Install new package]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[The chosen package has no valid installation routine.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[The archive you have given is not a valid package.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[The package &quot;{$package->getName()}&quot; could not be updated with the supplied archive.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[No files were found within the specified directory.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[The chosen package is already installed. Packages can not be installed more than one time.]]></item>\r
-               <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[The upload of the chosen archive has failed.]]></item>\r
-               <item name="wcf.acp.package.startInstall.source"><![CDATA[Select package source]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Enter the path of the package located on your server]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Enter a direct path to the package-file here. An internet address can be used or alternatively the path to the package file using the server's file system.]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Upload package from your local computer]]></item>\r
-               <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Enter the package file to be uploaded from your computer here.]]></item>\r
-               <item name="wcf.acp.package.startUpdate"><![CDATA[Update Package &quot;{$package->getName()}&quot;]]></item>\r
-               <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Installing menu entries for the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.install.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Installing template patches for the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Installing templates for the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Installing cronjobs ...]]></item>\r
-               <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Installing event listener ...]]></item>\r
-               <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Unpacking package files ...]]></item>\r
-               <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Installing user group options ...]]></item>\r
-               <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Installing package languages ...]]></item>\r
-               <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Installing package options ...]]></item>\r
-               <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Executing special scripts ...]]></item>\r
-               <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Installing database entries...]]></item>\r
-               <item name="wcf.acp.package.step.install.TemplatePatchPackageInstallationPlugin"><![CDATA[Installing template patches ...]]></item>\r
-               <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Installing package templates ...]]></item>\r
-               <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Installing user profile fields ...]]></item>\r
-               <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Checking for possible conflicts ...]]></item>\r
-               <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>\r
-               <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation is complete]]></item>\r
-               <item name="wcf.acp.package.step.install.optionals"><![CDATA[Installing optional packages ...]]></item>\r
-               <item name="wcf.acp.package.step.install.package"><![CDATA[Registering package ...]]></item>\r
-               <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Installing package plugins ...]]></item>\r
-               <item name="wcf.acp.package.step.install.parent"><![CDATA[Parent package allocation is being done ...]]></item>\r
-               <item name="wcf.acp.package.step.install.requirements"><![CDATA[Checking dependencies ...]]></item>\r
-               <item name="wcf.acp.package.step.title"><![CDATA[Package <b>{$packageName|encodeJS}</b>: ]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Removing menu items from the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Removing template patches of the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Removing templates from the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Uninstalling cronjobs ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Removing event listener ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Removing package files ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Removing user group options ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Removing package languages ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Removing package options ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Removing database entries...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.TemplatePatchPackageInstallationPlugin"><![CDATA[Removing template patches ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Removing package templates ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Removing user profile fields ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Package removal finished]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Removing optional packages ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Removing package plugins ...]]></item>\r
-               <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Removing package requirements ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Updating menu items in the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Updating template patches in the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Updating templates in the Administration Control Panel ...]]></item>\r
-               <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Updating cronjobs ...]]></item>\r
-               <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Updating event listener ...]]></item>\r
-               <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Unpacking package files ...]]></item>\r
-               <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Updating user group options ...]]></item>\r
-               <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Updating package languages ...]]></item>\r
-               <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Updating package options ...]]></item>\r
-               <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Executing special scripts ...]]></item>\r
-               <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Updating database entries ...]]></item>\r
-               <item name="wcf.acp.package.step.update.TemplatePatchPackageInstallationPlugin"><![CDATA[Updating template patches ...]]></item>\r
-               <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Updating package templates ...]]></item>\r
-               <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Updating user profile fields ...]]></item>\r
-               <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>\r
-               <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Checking for possible conflicts ...]]></item>\r
-               <item name="wcf.acp.package.step.update.finish"><![CDATA[Package update finished]]></item>\r
-               <item name="wcf.acp.package.step.update.optionals"><![CDATA[Updating optional packages ...]]></item>\r
-               <item name="wcf.acp.package.step.update.package"><![CDATA[Updating package ...]]></item>\r
-               <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Updating package plugins ...]]></item>\r
-               <item name="wcf.acp.package.step.update.parent"><![CDATA[Parent package allocation is being done ...]]></item>\r
-               <item name="wcf.acp.package.step.update.requirements"><![CDATA[Checking dependencies ...]]></item>\r
-               <item name="wcf.acp.package.templatePatch.install.failed"><![CDATA[The patch that this package is trying to apply has failed because this patch is not compliant to its target file. Therefore this package cannot be installed. Please click the &quot;{lang}wcf.acp.package.install.cancel{/lang}&quot; button.]]></item>\r
-               <item name="wcf.acp.package.templatePatch.repatch.failed"><![CDATA[Re-patching of the following templates has failed:<br />{foreach from=$failures item=$failure}{$failure.templateName} (Originally patched by: {$failure.packageName})<br />{/foreach}The original patch package that was previously applied may no longer function. You should still continue with this update by clicking on the &quot;{lang}wcf.global.button.next{/lang}&quot; button.]]></item>\r
-               <item name="wcf.acp.package.templatePatch.uninstall.failed"><![CDATA[The patch that this package is trying to remove has failed because its target file has been externally amended. Therefore this package cannot be removed. Please click the &quot;{lang}wcf.acp.package.uninstall.cancel{/lang}&quot; button.]]></item>\r
-               <item name="wcf.acp.package.uninstall"><![CDATA[Package removal]]></item>\r
-               <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Cancel package-removal]]></item>\r
-               <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[It is not possible to uninstall these packages, because there is at least one dependent package, that cannot be uninstalled.]]></item>\r
-               <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Upon final confirmation {if $dependentPackages|count == 1}this package{else}these packages{/if} will be removed without any further promting.]]></item>\r
-               <item name="wcf.acp.package.update"><![CDATA[Package update]]></item>\r
-               <item name="wcf.acp.package.updateDate"><![CDATA[Date of update]]></item>\r
-               <item name="wcf.acp.package.view.author"><![CDATA[Author:]]></item>\r
-               <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Go to the Administration Control Panel]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Remove package]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Remove all packages]]></item>\r
-               <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Are you sure that you would like to remove this package?]]></item>\r
-               <item name="wcf.acp.package.view.button.update"><![CDATA[Update package]]></item>\r
-               <item name="wcf.acp.package.view.date"><![CDATA[Date:]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Dependent packages]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[This package has a requirement from {if $dependentPackages|count == 1}one other package.{else}{#$dependentPackages|count} other packages.{/if}]]></item>\r
-               <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}This package is required by one other Package{else}{#$dependentPackages|count} Packages are directly or indirectly dependent upon this package{/if}.]]></item>\r
-               <item name="wcf.acp.package.view.dir"><![CDATA[Installation folder:]]></item>\r
-               <item name="wcf.acp.package.view.identifier"><![CDATA[Identifier:]]></item>\r
-               <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installed instance:]]></item>\r
-               <item name="wcf.acp.package.view.parent"><![CDATA[Parent package:]]></item>\r
-               <item name="wcf.acp.package.view.properties"><![CDATA[Properties]]></item>\r
-               <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Required packages]]></item>\r
-               <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[This package has a requirement of {if $requiredPackages|count == 1}one other package.{else}{#$requiredPackages|count} other packages.{/if}]]></item>\r
-               <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>\r
-               <item name="wcf.acp.package.view.version"><![CDATA[Installed version:]]></item>\r
-       </category>\r
-       <category name="wcf.acp.packageUpdate">\r
-               <item name="wcf.acp.packageUpdate"><![CDATA[Update packages]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentication with update server]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Connection data]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Username and password have not been accepted.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Password]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Please enter a valid password.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Username]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Please enter a valid username.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[User login]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server message]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server name]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Save user data permanantly]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[The entered user data will be saved permanently, so you do not have to input them again.]]></item>\r
-               <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Address]]></item>\r
-               <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installed version]]></item>\r
-               <item name="wcf.acp.packageUpdate.error"><![CDATA[An error occured: ]]></item>\r
-               <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[The download of the package {$package} has been failed.]]></item>\r
-               <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[An error occured while trying to download the package list.]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[The following {if $excludedPackages|count == 1}conflict{else}conflicts{/if} occured:]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[The installed package &quot;{$excludedPackage.existingPackageName}&quot; is incompatible with the package &quot;{$excludedPackage.packageName}&quot; in version {$excludedPackage.packageVersion}.]]></item>\r
-               <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[The package &quot;{$excludedPackage.packageName}&quot; in version {$excludedPackage.packageVersion} is not compatible with the installed package &quot;{$excludedPackage.existingPackageName}&quot;.]]></item>\r
-               <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} will be installed]]></item>\r
-               <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[There are currently no updates available.]]></item>\r
-               <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[You have not selected any update.]]></item>\r
-               <item name="wcf.acp.packageUpdate.options"><![CDATA[Options]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[This package is already installed and unique. Therefore it cannot be installed another time.]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Install package]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Install another package instance (packages is already installed {#$package.instances} time{if $package.instances > 1}s{/if})]]></item>\r
-               <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Update installed package {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} version {$updatableInstance.packageVersion}]]></item>\r
-               <item name="wcf.acp.packageUpdate.search"><![CDATA[Search packages]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Author]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Search for ...]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Hide already installed unique packages]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Package name]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Package name and description]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update server]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Search all update server]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Type of package]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Other packages]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Plugin for already installed packages]]></item>\r
-               <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Standalone application]]></item>\r
-               <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Select all packages]]></item>\r
-               <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} is updated to {$package.toVersion}]]></item>\r
-               <item name="wcf.acp.packageUpdate.updates"><![CDATA[The following package updates and installations will be processed:]]></item>\r
-               <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[New version]]></item>\r
-       </category>\r
-       <category name="wcf.acp.sessionLog">\r
-               <item name="wcf.acp.sessionLog.access.view"><![CDATA[Actions of the logged session of &quot;{$sessionLog->username}&quot;]]></item>\r
-               <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[There is a total of {#$items} logged action{if $items != 1}s{/if}]]></item>\r
-               <item name="wcf.acp.sessionLog.accesses"><![CDATA[Actions]]></item>\r
-               <item name="wcf.acp.sessionLog.className"><![CDATA[Class name]]></item>\r
-               <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP address]]></item>\r
-               <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Last action]]></item>\r
-               <item name="wcf.acp.sessionLog.packageName"><![CDATA[Package]]></item>\r
-               <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Method]]></item>\r
-               <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>\r
-               <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>\r
-               <item name="wcf.acp.sessionLog.time"><![CDATA[Date]]></item>\r
-               <item name="wcf.acp.sessionLog.userAgent"><![CDATA[User agent]]></item>\r
-               <item name="wcf.acp.sessionLog.view"><![CDATA[Logged sessions]]></item>\r
-               <item name="wcf.acp.sessionLog.view.count"><![CDATA[There is a total of {#$items} logged session{if $items != 1}s{/if}]]></item>\r
-       </category>\r
-       <category name="wcf.acp.updateServer">\r
-               <item name="wcf.acp.updateServer.add"><![CDATA[Add server]]></item>\r
-               <item name="wcf.acp.updateServer.add.success"><![CDATA[The server has been successfully added.]]></item>\r
-               <item name="wcf.acp.updateServer.data"><![CDATA[Server data]]></item>\r
-               <item name="wcf.acp.updateServer.delete"><![CDATA[Delete server]]></item>\r
-               <item name="wcf.acp.updateServer.delete.success"><![CDATA[The server has been successfully deleted.]]></item>\r
-               <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Do you really want to delete this server?]]></item>\r
-               <item name="wcf.acp.updateServer.disable"><![CDATA[Disable]]></item>\r
-               <item name="wcf.acp.updateServer.edit"><![CDATA[Edit server]]></item>\r
-               <item name="wcf.acp.updateServer.edit.success"><![CDATA[Your changes have been successfully saved.]]></item>\r
-               <item name="wcf.acp.updateServer.enable"><![CDATA[Enable]]></item>\r
-               <item name="wcf.acp.updateServer.errorText"><![CDATA[Error messages]]></item>\r
-               <item name="wcf.acp.updateServer.htPassword"><![CDATA[Password]]></item>\r
-               <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Please enter a valid password (optional).]]></item>\r
-               <item name="wcf.acp.updateServer.htUsername"><![CDATA[Username]]></item>\r
-               <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Please enter a valid user name (optional).]]></item>\r
-               <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[The following error occured while trying to connect:]]></item>\r
-               <item name="wcf.acp.updateServer.list.available"><![CDATA[{#$items} server available]]></item>\r
-               <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server id]]></item>\r
-               <item name="wcf.acp.updateServer.packages"><![CDATA[Packages]]></item>\r
-               <item name="wcf.acp.updateServer.server"><![CDATA[Address]]></item>\r
-               <item name="wcf.acp.updateServer.server.description"><![CDATA[Please enter the URL to a package server.]]></item>\r
-               <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[The entered address is invalid.]]></item>\r
-               <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>\r
-               <item name="wcf.acp.updateServer.timestamp"><![CDATA[Last access]]></item>\r
-               <item name="wcf.acp.updateServer.view"><![CDATA[Available update server]]></item>\r
-               <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[There are no update server available.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.user">\r
-               <item name="wcf.acp.user.add"><![CDATA[Add new user]]></item>\r
-               <item name="wcf.acp.user.add.data"><![CDATA[User details]]></item>\r
-               <item name="wcf.acp.user.add.success"><![CDATA[The new user has been successfully saved.]]></item>\r
-               <item name="wcf.acp.user.assignToGroup"><![CDATA[Group assignment]]></item>\r
-               <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Assign the following users to the selected group(s)]]></item>\r
-               <item name="wcf.acp.user.assignToGroup.success"><![CDATA[The users have been successfully assigned to your chosen groups.]]></item>\r
-               <item name="wcf.acp.user.button.assignGroup"><![CDATA[Group assignment]]></item>\r
-               <item name="wcf.acp.user.button.exportMail"><![CDATA[Export e-mail addresses]]></item>\r
-               <item name="wcf.acp.user.button.sendMail"><![CDATA[Send an e-mail]]></item>\r
-               <item name="wcf.acp.user.delete"><![CDATA[Delete user(s)]]></item>\r
-               <item name="wcf.acp.user.delete.error"><![CDATA[No user could be deleted.]]></item>\r
-               <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}The user has {else}{#$deletedUsers} users have{/if} been successfully deleted.]]></item>\r
-               <item name="wcf.acp.user.delete.sure"><![CDATA[Are you sure that you would like to delete this user?]]></item>\r
-               <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Are you sure that you would like to delete the selected User(s)?]]></item>\r
-               <item name="wcf.acp.user.edit"><![CDATA[Edit user]]></item>\r
-               <item name="wcf.acp.user.edit.success"><![CDATA[The changes for this user have been successfully saved.]]></item>\r
-               <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[You are currently editing your own user account. Changing the permissions of this user group might lead to locking yourself out of the Administration Control Panel. Please be careful!]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress"><![CDATA[Export e-mail addresses]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Export file format]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Export options]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[Export the e-mail addresses from the following users]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Separate the addresses with a ]]></item>\r
-               <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Enclose the addresses with ]]></item>\r
-               <item name="wcf.acp.user.groups"><![CDATA[Group memberships]]></item>\r
-               <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Find users that are not members of the chosen user groups.]]></item>\r
-               <item name="wcf.acp.user.list"><![CDATA[Users]]></item>\r
-               <item name="wcf.acp.user.list.all"><![CDATA[All users]]></item>\r
-               <item name="wcf.acp.user.list.count"><![CDATA[A total of {#$items} user{if $items > 1}s{/if}]]></item>\r
-               <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "1 user selected" : this.count+" users selected"]]></item>\r
-               <item name="wcf.acp.user.massProcessing"><![CDATA[Bulk processing of users]]></item>\r
-               <item name="wcf.acp.user.massProcessing.action"><![CDATA[Action]]></item>\r
-               <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Conditions]]></item>\r
-               <item name="wcf.acp.user.massProcessing.success"><![CDATA[The chosen action has been executed successfully on {#$affectedUsers} users.]]></item>\r
-               <item name="wcf.acp.user.massProcessing.warning"><![CDATA[The bulk processor will perform the following tasks <strong>without additional security notification</strong>, on all users matching the set conditions. Bulk processing can be very performance intensive, so it should only be executed when the forum is offline. To have a correct display of your content you should update the counters. The processing can not be reversed, so please be attentive when using this function.]]></item>\r
-               <item name="wcf.acp.user.search"><![CDATA[Search for users]]></item>\r
-               <item name="wcf.acp.user.search.conditions"><![CDATA[Search criteria]]></item>\r
-               <item name="wcf.acp.user.search.conditions.general"><![CDATA[General search criteria]]></item>\r
-               <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profile search criteria]]></item>\r
-               <item name="wcf.acp.user.search.display"><![CDATA[Display]]></item>\r
-               <item name="wcf.acp.user.search.display.columns"><![CDATA[Columns]]></item>\r
-               <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Other]]></item>\r
-               <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profile]]></item>\r
-               <item name="wcf.acp.user.search.display.general"><![CDATA[General]]></item>\r
-               <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Users per page]]></item>\r
-               <item name="wcf.acp.user.search.display.sort"><![CDATA[Sorting]]></item>\r
-               <item name="wcf.acp.user.search.error.noMatches"><![CDATA[No users have been found.]]></item>\r
-               <item name="wcf.acp.user.search.matches"><![CDATA[Your search produced {if $items == 1}one result{else}{#$items} results{/if}]]></item>\r
-               <item name="wcf.acp.user.search.withinResults"><![CDATA[Search within results]]></item>\r
-               <item name="wcf.acp.user.sendMail"><![CDATA[Send an e-mail]]></item>\r
-               <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail all Users]]></item>\r
-               <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[Send e-mail as HTML]]></item>\r
-               <item name="wcf.acp.user.sendMail.from"><![CDATA[Sender]]></item>\r
-               <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Here you can enter the sender's e-mail address in the following format:</p>\r
-<p style="text-align: center; line-height: 2em;"><code>{if MAIL_USE_FORMATTED_ADDRESS}Senders name &lt;email@sender.tld&gt;{else}email@sender.tld{/if}</code></p>\r
-<p>If you have completely filled in the section under System -> Options -> E-mail, then this field will automatically be filled in. If you are sending e-mails using SMTP, then the sender's e-mail-Address must also be accepted by the server.</p>]]></item>\r
-               <item name="wcf.acp.user.sendMail.group"><![CDATA[E-mail all group members]]></item>\r
-               <item name="wcf.acp.user.sendMail.groups"><![CDATA[Send an e-mail to the members of the following user groups:]]></item>\r
-               <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-mail]]></item>\r
-               <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[Send an e-mail to the following users]]></item>\r
-               <item name="wcf.acp.user.sendMail.subject"><![CDATA[Subject]]></item>\r
-               <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Enter here the e-mail subject.]]></item>\r
-               <item name="wcf.acp.user.sendMail.text"><![CDATA[Message]]></item>\r
-               <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Enter here the message you want to send to users.]]></item>\r
-               <item name="wcf.acp.user.userNote"><![CDATA[Welcome {$this->user->username}.]]></item>\r
-       </category>\r
-       <category name="wcf.acp.worker">\r
-               <item name="wcf.acp.worker.currentStep"><![CDATA[Current process]]></item>\r
-               <item name="wcf.acp.worker.description"><![CDATA[Please leave this browser window open until the process has successfully completed. Do NOT try to login to your administrations area using a separate browser window, as doing so may damage the current process.]]></item>\r
-               <item name="wcf.acp.worker.progress.finish"><![CDATA[Process completed successfully]]></item>\r
-               <item name="wcf.acp.worker.progress.working"><![CDATA[Processing ...]]></item>\r
-               <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% complete]]></item>\r
-               <item name="wcf.acp.worker.title"><![CDATA[Processing ...]]></item>\r
-       </category>\r
-       <category name="wcf.global">\r
-               <item name="wcf.global.button.back"><![CDATA[&laquo; Back]]></item>\r
-               <item name="wcf.global.button.close"><![CDATA[Close]]></item>\r
-               <item name="wcf.global.button.collapse"><![CDATA[Collapse]]></item>\r
-               <item name="wcf.global.button.collapsible"><![CDATA[Expand or collapse]]></item>\r
-               <item name="wcf.global.button.delete"><![CDATA[Delete]]></item>\r
-               <item name="wcf.global.button.delete.confirm"><![CDATA[Do you really want to delete this item?]]></item>\r
-               <item name="wcf.global.button.deleteCompletely"><![CDATA[Delete completely]]></item>\r
-               <item name="wcf.global.button.edit"><![CDATA[Edit]]></item>\r
-               <item name="wcf.global.button.editor.jump"><![CDATA[Use full editor]]></item>\r
-               <item name="wcf.global.button.expand"><![CDATA[Expand]]></item>\r
-               <item name="wcf.global.button.mark"><![CDATA[Select]]></item>\r
-               <item name="wcf.global.button.next"><![CDATA[Next &raquo;]]></item>\r
-               <item name="wcf.global.button.preview"><![CDATA[Preview]]></item>\r
-               <item name="wcf.global.button.reset"><![CDATA[Reset]]></item>\r
-               <item name="wcf.global.button.submit"><![CDATA[Submit]]></item>\r
-               <item name="wcf.global.button.unmark"><![CDATA[Unselect]]></item>\r
-               <item name="wcf.global.date.day"><![CDATA[Day]]></item>\r
-               <item name="wcf.global.date.days"><![CDATA[Days]]></item>\r
-               <item name="wcf.global.date.hour"><![CDATA[Hour]]></item>\r
-               <item name="wcf.global.date.hours"><![CDATA[Hours]]></item>\r
-               <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>\r
-               <item name="wcf.global.date.minutes"><![CDATA[Minutes]]></item>\r
-               <item name="wcf.global.date.month"><![CDATA[Month]]></item>\r
-               <item name="wcf.global.date.months"><![CDATA[Months]]></item>\r
-               <item name="wcf.global.date.second"><![CDATA[Second]]></item>\r
-               <item name="wcf.global.date.seconds"><![CDATA[Seconds]]></item>\r
-               <item name="wcf.global.date.week"><![CDATA[Week]]></item>\r
-               <item name="wcf.global.date.weeks"><![CDATA[Weeks]]></item>\r
-               <item name="wcf.global.date.year"><![CDATA[Year]]></item>\r
-               <item name="wcf.global.date.year.notRequired"><![CDATA[Specifying the year is optional.]]></item>\r
-               <item name="wcf.global.date.years"><![CDATA[Years]]></item>\r
-               <item name="wcf.global.dateFormat"><![CDATA[M jS Y]]></item>\r
-               <item name="wcf.global.dateFormatToday"><![CDATA[<b>\T\o\d\a\y</b>, g:ia]]></item>\r
-               <item name="wcf.global.dateFormatYesterday"><![CDATA[\Y\e\s\t\e\r\d\a\y, g:ia]]></item>\r
-               <item name="wcf.global.dateInputOrder"><![CDATA[month-day-year]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.dateMethod"><![CDATA[date]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.decimalPoint"><![CDATA[.]]></item>\r
-               <item name="wcf.global.defaultValue"><![CDATA[Default]]></item>\r
-               <item name="wcf.global.error.backward"><![CDATA[Back to last page]]></item>\r
-               <item name="wcf.global.error.empty"><![CDATA[Please enter the required information for this field.]]></item>\r
-               <item name="wcf.global.error.file.notFound"><![CDATA[The file could not be found.]]></item>\r
-               <item name="wcf.global.error.illegalLink"><![CDATA[The link you are trying to reach is no longer available or is invalid.]]></item>\r
-               <item name="wcf.global.error.permissionDenied"><![CDATA[You are not allowed to enter this page. You do not have the required permissions to enter this page.]]></item>\r
-               <item name="wcf.global.error.permissionDenied.title"><![CDATA[You are not allowed to enter this page.]]></item>\r
-               <item name="wcf.global.error.title"><![CDATA[Error message]]></item>\r
-               <item name="wcf.global.form.error"><![CDATA[The data you have entered are invalid. Please check the information you have given in the marked fields.]]></item>\r
-               <item name="wcf.global.language.ar"><![CDATA[Arabic]]></item>\r
-               <item name="wcf.global.language.bs"><![CDATA[Bosnian]]></item>\r
-               <item name="wcf.global.language.cs"><![CDATA[Czech]]></item>\r
-               <item name="wcf.global.language.da"><![CDATA[Danish]]></item>\r
-               <item name="wcf.global.language.de"><![CDATA[German]]></item>\r
-               <item name="wcf.global.language.de-informal"><![CDATA[German (Informal)]]></item>\r
-               <item name="wcf.global.language.el"><![CDATA[Greek]]></item>\r
-               <item name="wcf.global.language.en"><![CDATA[English]]></item>\r
-               <item name="wcf.global.language.es"><![CDATA[Spanish]]></item>\r
-               <item name="wcf.global.language.fa"><![CDATA[Persian (Farsi)]]></item>\r
-               <item name="wcf.global.language.fi"><![CDATA[Finnish]]></item>\r
-               <item name="wcf.global.language.fr"><![CDATA[French]]></item>\r
-               <item name="wcf.global.language.he"><![CDATA[Hebrew]]></item>\r
-               <item name="wcf.global.language.hr"><![CDATA[Croatian]]></item>\r
-               <item name="wcf.global.language.hu"><![CDATA[Hungarian]]></item>\r
-               <item name="wcf.global.language.it"><![CDATA[Italian]]></item>\r
-               <item name="wcf.global.language.ja"><![CDATA[Japanese]]></item>\r
-               <item name="wcf.global.language.ko"><![CDATA[Korean]]></item>\r
-               <item name="wcf.global.language.nl"><![CDATA[Dutch]]></item>\r
-               <item name="wcf.global.language.no"><![CDATA[Norwegian]]></item>\r
-               <item name="wcf.global.language.pl"><![CDATA[Polish]]></item>\r
-               <item name="wcf.global.language.pt"><![CDATA[Portuguese]]></item>\r
-               <item name="wcf.global.language.pt-BR"><![CDATA[Portuguese (Brazil)]]></item>\r
-               <item name="wcf.global.language.ro"><![CDATA[Romanian]]></item>\r
-               <item name="wcf.global.language.ru"><![CDATA[Russian]]></item>\r
-               <item name="wcf.global.language.sk"><![CDATA[Slovak]]></item>\r
-               <item name="wcf.global.language.sr"><![CDATA[Serbian]]></item>\r
-               <item name="wcf.global.language.sv"><![CDATA[Swedish]]></item>\r
-               <item name="wcf.global.language.th"><![CDATA[Thai]]></item>\r
-               <item name="wcf.global.language.tr"><![CDATA[Turkish]]></item>\r
-               <item name="wcf.global.language.zh-CN"><![CDATA[Chinese (Simplified)]]></item>\r
-               <item name="wcf.global.language.zh-TW"><![CDATA[Chinese (Traditional)]]></item>\r
-               <item name="wcf.global.locale.unix"><![CDATA[en_US]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.locale.win"><![CDATA[english]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.multiSelect"><![CDATA[Multiple items can be selected by holding the &quot;Ctrl/Shift&quot; key (Windows) or &quot;Command&quot; (Mac OS) key and clicking the items required.]]></item>\r
-               <item name="wcf.global.page.input"><![CDATA[Go to next page]]></item>\r
-               <item name="wcf.global.page.next"><![CDATA[Next page]]></item>\r
-               <item name="wcf.global.page.previous"><![CDATA[Previous page]]></item>\r
-               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.pageTitle"><![CDATA[WoltLab&reg; Community Framework&trade;]]></item>\r
-               <item name="wcf.global.redirect.title"><![CDATA[Redirection]]></item>\r
-               <item name="wcf.global.redirect.url"><![CDATA[Please click here if the automatic redirection does not work!]]></item>\r
-               <item name="wcf.global.scrollDown"><![CDATA[Go to page bottom]]></item>\r
-               <item name="wcf.global.scrollUp"><![CDATA[Go to page end]]></item>\r
-               <item name="wcf.global.search.matchesExactly"><![CDATA[Exact match]]></item>\r
-               <item name="wcf.global.shortTimeFormat"><![CDATA[M jS Y, g:ia]]></item>\r
-               <item name="wcf.global.skipToContent"><![CDATA[Skip navigation]]></item>\r
-               <item name="wcf.global.sortOrder.ascending"><![CDATA[ascending]]></item>\r
-               <item name="wcf.global.sortOrder.descending"><![CDATA[descending]]></item>\r
-               <item name="wcf.global.thousandsSeparator"><![CDATA[,]]></item>\r
-               <item name="wcf.global.timeFormat"><![CDATA[l, F jS Y, g:ia]]></item>\r
-       </category>\r
-       <category name="wcf.imageViewer">\r
-               <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Image " + (this.currentIndex + 1) + " of " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>\r
-               <item name="wcf.imageViewer.close"><![CDATA[Close]]></item>\r
-               <item name="wcf.imageViewer.enlarge"><![CDATA[Show only this image (quits the image viewer)]]></item>\r
-               <item name="wcf.imageViewer.next"><![CDATA[Next image]]></item>\r
-               <item name="wcf.imageViewer.pause"><![CDATA[Stop slideshow]]></item>\r
-               <item name="wcf.imageViewer.play"><![CDATA[Start slideshow (changes the image every 5 seconds)]]></item>\r
-               <item name="wcf.imageViewer.previous"><![CDATA[Previous image]]></item>\r
-       </category>\r
-       <category name="wcf.option">\r
-               <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Canary Islands, Lisbon, London, Monrovia, Ouagadougou, Reykjav&iacute;k]]></item>\r
-               <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brussels, Copenhagen, Madrid, Paris, Prague, Rome, Sarajevo, Stockholm, Tunis, Warsaw, Vienna]]></item>\r
-               <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athens, Beirut, Bucharest, Helsinki, Istanbul, Jerusalem, Cairo, Cape Town, Khartoum, Kiev, Minsk, Sofia]]></item>\r
-               <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Ababa, Antananarivo, Baghdad, Dodoma, Kampala, Kuwait City, Mogadishu, Moscow, Nairobi, Riyadh]]></item>\r
-               <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Tehran]]></item>\r
-               <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Yerevan, Muscat, R&eacute;union, Tbilisi]]></item>\r
-               <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>\r
-               <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Ashgabat, Bishkek, Dushanbe, Islamabad, Yekaterinburg, Karachi, Maldive Islands, Tashkent]]></item>\r
-               <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, New Delhi]]></item>\r
-               <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>\r
-               <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Novosibirsk]]></item>\r
-               <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Cocos (Keeling) Islands, Yangon]]></item>\r
-               <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnoyarsk, Vientiane]]></item>\r
-               <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hong Kong, Irkutsk, Kuala Lumpur, Manila, Beijing, Perth, Singapore, Taipei, Ulaanbaatar]]></item>\r
-               <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Western Australia)]]></item>\r
-               <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Yakutsk, Osaka, Pyongyang, Sapporo, Seoul, Tokyo]]></item>\r
-               <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>\r
-               <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Vladivostok]]></item>\r
-               <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord Howe Island (Australia)]]></item>\r
-               <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, New Caledonia, Solomon Islands]]></item>\r
-               <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolk Island]]></item>\r
-               <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, South Tarawa, Fiji, Kamchatka, Marshall Islands, Wellington]]></item>\r
-               <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham Islands (New Zealand)]]></item>\r
-               <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenix Islands]]></item>\r
-               <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Line Islands, Christmas Island]]></item>\r
-               <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azores, Cape Verde Islands]]></item>\r
-               <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mid-Atlantic]]></item>\r
-               <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Bras&iacute;lia, Buenos Aires, Cayenne, Georgetown, Greenland, Montevideo]]></item>\r
-               <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Newfoundland]]></item>\r
-               <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Atlantic Time (Canada), Asunci&oacute;n, La Paz, Port-of-Spain, Santiago]]></item>\r
-               <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>\r
-               <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Eastern Time (US &amp; Canada), Bogot&aacute;, Lima, San Francisco de Quito]]></item>\r
-               <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Central Time (US &amp; Canada), Central America, Mexico City]]></item>\r
-               <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Mountain Time (US &amp; Canada), Chihuahua, Mazatlan]]></item>\r
-               <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Pacific Time (US &amp; Canada), Tijuana]]></item>\r
-               <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>\r
-               <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) French Polynesia]]></item>\r
-               <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cook Islands, Hawaii]]></item>\r
-               <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midway Islands, Samoa]]></item>\r
-               <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Enewetak, Kwajalein]]></item>\r
-       </category>\r
-       <category name="wcf.page">\r
-               <item name="wcf.page.pageNo"><![CDATA[Page {#$pageNo}]]></item>\r
-       </category>\r
-       <category name="wcf.user">\r
-               <item name="wcf.user.confirmEmail"><![CDATA[Confirm E-mail Address]]></item>\r
-               <item name="wcf.user.confirmPassword"><![CDATA[Confirm password]]></item>\r
-               <item name="wcf.user.email"><![CDATA[E-mail Address]]></item>\r
-               <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[The given e-mail address and confirmation e-mail address are not identical.]]></item>\r
-               <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[The given password and confirmation password are not identical.]]></item>\r
-               <item name="wcf.user.error.email.notUnique"><![CDATA[The e-mail address you have entered has already been used by another user.]]></item>\r
-               <item name="wcf.user.error.email.notValid"><![CDATA[The e-mail address you have entered is not valid.]]></item>\r
-               <item name="wcf.user.error.password.false"><![CDATA[The password is not correct.]]></item>\r
-               <item name="wcf.user.error.username.notFound"><![CDATA[The user name &quot;{$username}&quot; could not be found.]]></item>\r
-               <item name="wcf.user.error.username.notUnique"><![CDATA[The user name you have entered is already in use.]]></item>\r
-               <item name="wcf.user.error.username.notValid"><![CDATA[The username you have entered is not valid.]]></item>\r
-               <item name="wcf.user.language"><![CDATA[Language]]></item>\r
-               <item name="wcf.user.language.description"><![CDATA[Please select the user interface language to be shown in!]]></item>\r
-               <item name="wcf.user.logout"><![CDATA[Logout]]></item>\r
-               <item name="wcf.user.password"><![CDATA[Password]]></item>\r
-               <item name="wcf.user.registrationDate"><![CDATA[Date of registration]]></item>\r
-               <item name="wcf.user.userID"><![CDATA[User ID]]></item>\r
-               <item name="wcf.user.username"><![CDATA[Username]]></item>\r
-               <item name="wcf.user.visibleLanguages"><![CDATA[Show content in the following languages]]></item>\r
-               <item name="wcf.user.visibleLanguages.description"><![CDATA[Select the content languages that should be shown here.]]></item>\r
-       </category>\r
-       <category name="wcf.user.option">\r
-               <item name="wcf.user.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>\r
-       </category>\r
-</language>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="en">
+       <category name="wcf.acp">
+               <item name="wcf.acp"><![CDATA[Administration Control Panel]]></item>
+               <item name="wcf.acp.help"><![CDATA[Help]]></item>
+               <item name="wcf.acp.help.complete"><![CDATA[Complete Help]]></item>
+               <item name="wcf.acp.help.disable"><![CDATA[Disable online Help]]></item>
+               <item name="wcf.acp.help.interactive"><![CDATA[Interactive Help]]></item>
+               <item name="wcf.acp.packageQuickAccess"><![CDATA[Change Package]]></item>
+               <item name="wcf.acp.search.extended"><![CDATA[Extended search ...]]></item>
+               <item name="wcf.acp.sitemap"><![CDATA[Site-Map]]></item>
+       </category>
+       <category name="wcf.acp.cache">
+               <item name="wcf.acp.cache.button.clear"><![CDATA[Empty cache]]></item>
+               <item name="wcf.acp.cache.clear.success"><![CDATA[The cache has been successfully emptied.]]></item>
+               <item name="wcf.acp.cache.clear.sure"><![CDATA[Are you sure that you want to completely empty the cache?]]></item>
+               <item name="wcf.acp.cache.data"><![CDATA[Settings]]></item>
+               <item name="wcf.acp.cache.data.files"><![CDATA[Files]]></item>
+               <item name="wcf.acp.cache.data.size"><![CDATA[Size]]></item>
+               <item name="wcf.acp.cache.data.source"><![CDATA[Source]]></item>
+               <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>
+               <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.cache.list.mtime"><![CDATA[Last updated]]></item>
+               <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>
+               <item name="wcf.acp.cache.list.perm"><![CDATA[Permissions]]></item>
+               <item name="wcf.acp.cache.list.size"><![CDATA[Size]]></item>
+       </category>
+       <category name="wcf.acp.cronjob">
+               <item name="wcf.acp.cronjob.active"><![CDATA[Enabled]]></item>
+               <item name="wcf.acp.cronjob.add"><![CDATA[Add a new cron job]]></item>
+               <item name="wcf.acp.cronjob.add.data"><![CDATA[General Information]]></item>
+               <item name="wcf.acp.cronjob.add.success"><![CDATA[The cron job has been added successfully.]]></item>
+               <item name="wcf.acp.cronjob.add.timing"><![CDATA[Schedule]]></item>
+               <item name="wcf.acp.cronjob.className"><![CDATA[Class path]]></item>
+               <item name="wcf.acp.cronjob.className.description"><![CDATA[Please enter here the path to the PHP file in which the associated cron job class is contained. This path must be relative to the installation folder of the WCF.]]></item>
+               <item name="wcf.acp.cronjob.cronjobID"><![CDATA[Job ID]]></item>
+               <item name="wcf.acp.cronjob.delete"><![CDATA[Delete]]></item>
+               <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[This cron job cannot be deleted.]]></item>
+               <item name="wcf.acp.cronjob.delete.success"><![CDATA[The cron job has been deleted successfully.]]></item>
+               <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Are you sure that you want to remove this cron job?]]></item>
+               <item name="wcf.acp.cronjob.description"><![CDATA[Description]]></item>
+               <item name="wcf.acp.cronjob.description.description"><![CDATA[Here you may enter a short description for the cron job (preferably in English).]]></item>
+               <item name="wcf.acp.cronjob.disable"><![CDATA[Disable]]></item>
+               <item name="wcf.acp.cronjob.edit"><![CDATA[Edit]]></item>
+               <item name="wcf.acp.cronjob.edit.data"><![CDATA[General Information]]></item>
+               <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[This cron job cannot be edited.]]></item>
+               <item name="wcf.acp.cronjob.edit.success"><![CDATA[The cron job has been modified successfully.]]></item>
+               <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Schedule]]></item>
+               <item name="wcf.acp.cronjob.enable"><![CDATA[Enable]]></item>
+               <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[The path you have entered is invalid.]]></item>
+               <item name="wcf.acp.cronjob.error.empty"><![CDATA[Please enter a valid entry here.]]></item>
+               <item name="wcf.acp.cronjob.error.notValid"><![CDATA[The timings you have set are invalid.]]></item>
+               <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Schedule multiple executions?]]></item>
+               <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[When enabled, the respective task (cronjob) will be repeatedly executed at all possible dates between the previous specified execution date and the next.]]></item>
+               <item name="wcf.acp.cronjob.execute"><![CDATA[Execute now]]></item>
+               <item name="wcf.acp.cronjob.execute.success"><![CDATA[The job has been executed successfully.]]></item>
+               <item name="wcf.acp.cronjob.inactive"><![CDATA[Disabled]]></item>
+               <item name="wcf.acp.cronjob.info"><![CDATA[General Information]]></item>
+               <item name="wcf.acp.cronjob.intro"><![CDATA[Configuring cronjobs (automatized scheduled tasks) requires distinct knowledge of the crontab syntax on Unix based systems. More information about this topic can be obtained on the following Webpage: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>.]]></item>
+               <item name="wcf.acp.cronjob.lastExec"><![CDATA[Last scheduled execution]]></item>
+               <item name="wcf.acp.cronjob.list"><![CDATA[Cron jobs]]></item>
+               <item name="wcf.acp.cronjob.list.count"><![CDATA[There is a total of {#$items} cronjob{if $items != 1}s{/if}]]></item>
+               <item name="wcf.acp.cronjob.log"><![CDATA[Log of executed cronjobs]]></item>
+               <item name="wcf.acp.cronjob.log.clear"><![CDATA[Delete all]]></item>
+               <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Are you sure that you want to remove all log entries?]]></item>
+               <item name="wcf.acp.cronjob.log.data"><![CDATA[There is a total of {#$items} {if $items == 1}entry{else}entries{/if}]]></item>
+               <item name="wcf.acp.cronjob.log.error"><![CDATA[Error:]]></item>
+               <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Successfully executed]]></item>
+               <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[There are currently no log entries available.]]></item>
+               <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>
+               <item name="wcf.acp.cronjob.nextExec"><![CDATA[Next scheduled execution]]></item>
+               <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[There are currently no cronjobs available.]]></item>
+               <item name="wcf.acp.cronjob.packageName"><![CDATA[Installed by]]></item>
+               <item name="wcf.acp.cronjob.runNow"><![CDATA[Run now]]></item>
+               <item name="wcf.acp.cronjob.startDom"><![CDATA[Day of month]]></item>
+               <item name="wcf.acp.cronjob.startDom.description"><![CDATA[Day of the month (1 - 31) in which the cron job should be executed.]]></item>
+               <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>
+               <item name="wcf.acp.cronjob.startDow"><![CDATA[Weekday]]></item>
+               <item name="wcf.acp.cronjob.startDow.description"><![CDATA[Weekday (0 - 6 with Sunday = 0 or mon - sun) in which the cron job should be executed.]]></item>
+               <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>
+               <item name="wcf.acp.cronjob.startHour"><![CDATA[Hour]]></item>
+               <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Hours (0 - 23) in which the cron job should be executed.]]></item>
+               <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>
+               <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>
+               <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Minutes (0 - 59) in which the cron job should be executed.]]></item>
+               <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>
+               <item name="wcf.acp.cronjob.startMonth"><![CDATA[Month]]></item>
+               <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[Month (1 - 12 or jan - dec) in which the cron job should be executed.]]></item>
+               <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>
+               <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>
+               <item name="wcf.acp.cronjob.subtitle"><![CDATA[]]></item>
+       </category>
+       <category name="wcf.acp.group">
+               <item name="wcf.acp.group.add"><![CDATA[Add new user group]]></item>
+               <item name="wcf.acp.group.add.permissions"><![CDATA[Permissions]]></item>
+               <item name="wcf.acp.group.add.success"><![CDATA[The user group has been successfully added.]]></item>
+               <item name="wcf.acp.group.administrators"><![CDATA[Administrators]]></item>
+               <item name="wcf.acp.group.data"><![CDATA[General group information]]></item>
+               <item name="wcf.acp.group.delete"><![CDATA[Delete this user group]]></item>
+               <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}This user group has{else}{#$deletedGroups} These user groups have{/if} been successfully deleted.]]></item>
+               <item name="wcf.acp.group.delete.sure"><![CDATA[Are you sure you would like to remove this user group?]]></item>
+               <item name="wcf.acp.group.edit"><![CDATA[Edit this user group]]></item>
+               <item name="wcf.acp.group.edit.success"><![CDATA[Your user group changes have been successfully saved.]]></item>
+               <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[You are currently a member of this user group. Changing the permissions of this user group could result in locking yourself out of the Administration Control Panel. Please be careful!]]></item>
+               <item name="wcf.acp.group.everyone"><![CDATA[Everyone]]></item>
+               <item name="wcf.acp.group.groupID"><![CDATA[Group ID]]></item>
+               <item name="wcf.acp.group.groupName"><![CDATA[Name of this user group]]></item>
+               <item name="wcf.acp.group.groupName.description"><![CDATA[Enter here a name for this group.]]></item>
+               <item name="wcf.acp.group.guests"><![CDATA[Guests]]></item>
+               <item name="wcf.acp.group.list"><![CDATA[User groups]]></item>
+               <item name="wcf.acp.group.list.data"><![CDATA[A total of {#$items} user groups]]></item>
+               <item name="wcf.acp.group.members"><![CDATA[Number of members]]></item>
+               <item name="wcf.acp.group.moderators"><![CDATA[Moderators]]></item>
+               <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Can enter Administration Control Panel?]]></item>
+               <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Activating this option will allow members of this user group to enter the Administration Control Panel and, dependent upon their permissions, run certain actions.]]></item>
+               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Can view private user options]]></item>
+               <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Members of this user group can view private user options.]]></item>
+               <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Can change the system options?]]></item>
+               <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Activating this option will allow members of this user group to view and change the system options - e.g. Forum on/offline.]]></item>
+               <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Can view logs]]></item>
+               <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Members of this user group can view the system logs.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Can add new cronjobs]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Members of this user group can add new cronjobs.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Can delete existing cronjobs]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Members of this user group can delete existing cronjobs.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Can delete log files of running cronjobs]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Members of this user group can delete log files of running cronjobs. The log files are also checked by the associated cronjob if the log file was successfully written.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Can edit existing cronjobs]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Members of this user group can edit existing cronjobs.]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Can disable existing cronjobs]]></item>
+               <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Members of this user group can disable existing cronjobs. Disabling a cronjob only stops the actual cronjob from running, but does not remove it.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Can edit existing update servers]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Members of this user group can edit existing update servers and add new update servers.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Can install new packages]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Members of this user group can install additional packages.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Can remove existing packages]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Members of this user group can remove existing packages.]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Can update existing packages]]></item>
+               <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Members of this user group can update existing packages.]]></item>
+               <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Accessible user groups]]></item>
+               <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Members of this user group have access to the following groups. For example, here you can set if the user group has permission to edit themselves.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Can add new user groups]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Members of this user group can add new user groups.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Can add new users]]></item>
+               <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Members of this user group can add new users. If the option for &quot;Accessible User groups&quot; has been enabled, then on creation of the user, the appropriate accessible user groups can also be assigned.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Can delete existing user groups]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Members of this user group can remove existing user groups.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Can delete existing users]]></item>
+               <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Members of this user group can delete existing users.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Can edit existing user groups]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Members of this user group can edit existing user groups.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Can edit user e-mail addresses]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Members of this user group can edit user e-mail addresses.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Can edit user passwords]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Members of this user group can edit user passwords.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Can edit existing users]]></item>
+               <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Members of this user group can edit existing users.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Can send e-mails to users]]></item>
+               <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Members of this user group can view other members' e-mail addresses and consequently send them e-mails.]]></item>
+               <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Can search users]]></item>
+               <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Members of this user group can search existing users and their profiles.]]></item>
+               <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrator permissions]]></item>
+               <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Content]]></item>
+               <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Design]]></item>
+               <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.general"><![CDATA[General administrative permissions]]></item>
+               <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Maintenance]]></item>
+               <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System functions]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Cronjobs]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Package management]]></item>
+               <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user"><![CDATA[User functions]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Group management]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[User management]]></item>
+               <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderator permissions]]></item>
+               <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.category.user"><![CDATA[General permissions]]></item>
+               <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>
+               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Can view disabled styles]]></item>
+               <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Members of this user group can choose to view disabled styles.]]></item>
+               <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Style management]]></item>
+               <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>
+               <item name="wcf.acp.group.showMembers"><![CDATA[Show the members of this user group]]></item>
+               <item name="wcf.acp.group.superModerators"><![CDATA[Super moderators]]></item>
+               <item name="wcf.acp.group.users"><![CDATA[Registered users]]></item>
+       </category>
+       <category name="wcf.acp.login">
+               <item name="wcf.acp.login"><![CDATA[Login]]></item>
+               <item name="wcf.acp.login.data"><![CDATA[Login details]]></item>
+       </category>
+       <category name="wcf.acp.masterPassword">
+               <item name="wcf.acp.masterPassword"><![CDATA[Master password]]></item>
+               <item name="wcf.acp.masterPassword.confirm"><![CDATA[Confirm master password]]></item>
+               <item name="wcf.acp.masterPassword.enter"><![CDATA[Master password required]]></item>
+               <item name="wcf.acp.masterPassword.enter.description"><![CDATA[This page or action requires you to enter the master password due to security reasons. You only need to do so once within a session. If you have forgotten the master password you can reset it by deleting the file <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em>.]]></item>
+               <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[The master password is not correct.If you have forgotten the master password you can reset it by deleting the file <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em>.]]></item>
+               <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[The entered passwords are not identical.]]></item>
+               <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[The password is not secure. It has to contain at least eight characters, small and capital latin letters as well as numbers and special characters. It must not be identically with passwords of administrators of this page.]]></item>
+               <item name="wcf.acp.masterPassword.example"><![CDATA[Suggestion]]></item>
+               <item name="wcf.acp.masterPassword.example.set"><![CDATA[Use suggestion]]></item>
+               <item name="wcf.acp.masterPassword.init"><![CDATA[Set master password]]></item>
+               <item name="wcf.acp.masterPassword.init.description"><![CDATA[The master password is an additional protection for functions that are relevant to security. You should use a very secure password that must not be identically with your normal administrator password, unknown to others and not used on other websites.]]></item>
+       </category>
+       <category name="wcf.acp.menu">
+               <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatic update]]></item>
+               <item name="wcf.acp.menu.link.content"><![CDATA[Content]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Add new cronjob]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[View cronjob logs]]></item>
+               <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[List cronjobs]]></item>
+               <item name="wcf.acp.menu.link.display"><![CDATA[Design]]></item>
+               <item name="wcf.acp.menu.link.group"><![CDATA[User groups]]></item>
+               <item name="wcf.acp.menu.link.group.add"><![CDATA[Add new group]]></item>
+               <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-mail all group members]]></item>
+               <item name="wcf.acp.menu.link.group.view"><![CDATA[Group overview]]></item>
+               <item name="wcf.acp.menu.link.log"><![CDATA[Log]]></item>
+               <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.menu.link.log.session"><![CDATA[Session]]></item>
+               <item name="wcf.acp.menu.link.maintenance"><![CDATA[Maintenance]]></item>
+               <item name="wcf.acp.menu.link.option"><![CDATA[Options]]></item>
+               <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Import &amp; export]]></item>
+               <item name="wcf.acp.menu.link.package"><![CDATA[Packages]]></item>
+               <item name="wcf.acp.menu.link.package.database"><![CDATA[Search packages]]></item>
+               <item name="wcf.acp.menu.link.package.install"><![CDATA[Install new package]]></item>
+               <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Add new server]]></item>
+               <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server overview]]></item>
+               <item name="wcf.acp.menu.link.package.view"><![CDATA[List installed packages]]></item>
+               <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>
+               <item name="wcf.acp.menu.link.user"><![CDATA[User]]></item>
+               <item name="wcf.acp.menu.link.user.add"><![CDATA[Add user]]></item>
+               <item name="wcf.acp.menu.link.user.list"><![CDATA[List users]]></item>
+               <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-mail all users]]></item>
+               <item name="wcf.acp.menu.link.user.management"><![CDATA[Users]]></item>
+               <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Bulk processing of users]]></item>
+               <item name="wcf.acp.menu.link.user.search"><![CDATA[Search for users]]></item>
+       </category>
+       <category name="wcf.acp.option">
+               <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Exclude hostnames]]></item>
+               <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Enter one hostname each row you want to exclude from this site.]]></item>
+               <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[Exclude IP addresses]]></item>
+               <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Enter one IP address each row you want to exclude from this site.]]></item>
+               <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Exclude user agents]]></item>
+               <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Enter one user agent each row you want to exclude from this site.]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache server]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Enter the address of the memcache server. You can enter one server each row.]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Use persistent connections]]></item>
+               <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[By enabling this option a persistent connection to the memcache server will be used.]]></item>
+               <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache type]]></item>
+               <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>
+               <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Please select the type of cache you want to use. Some of the types have special requirements to the server system and cannot be used in your environment.]]></item>
+               <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[File system (default)]]></item>
+               <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (experimental)]]></item>
+               <item name="wcf.acp.option.category.general"><![CDATA[General]]></item>
+               <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>
+               <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.cache.general"><![CDATA[General]]></item>
+               <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>
+               <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache stores data in the memory that is often accessed. This may reduce the database load dramatically. Read more about the memcache on the following site:
+<ul>
+       <li><a href="http://memcached.org/">memcached.org</a></li>
+</ul>]]></item>
+               <item name="wcf.acp.option.category.general.date"><![CDATA[Date and time]]></item>
+               <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>
+               <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>
+               <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>
+               <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy server]]></item>
+               <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[You can configure optional proxy servers for connections to external servers.]]></item>
+               <item name="wcf.acp.option.category.general.mail"><![CDATA[E-mails]]></item>
+               <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.mail.general"><![CDATA[General]]></item>
+               <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Transmission]]></item>
+               <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.general.offline"><![CDATA[Disable forum temporarily]]></item>
+               <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module"><![CDATA[Modules on / off]]></item>
+               <item name="wcf.acp.option.category.module.content"><![CDATA[Content]]></item>
+               <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.display"><![CDATA[Display]]></item>
+               <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>
+               <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.module.user"><![CDATA[User]]></item>
+               <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security"><![CDATA[Security]]></item>
+               <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>
+               <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internet pages are often attacked by programs and robots. E.g. it is possible to create hundreds of user accounts automatically. You can protect yourself against these spam bots with so called <a href="http://en.wikipedia.org/wiki/Captcha" class="externalURL">Captcha images</a> on every place where web forms can be submitted. Unregistered users then first have to identify the code on the Captcha before they can submit the form. Robots cannot read the code. Please not that Captcha images cannot be read by blind and visually impaired people.]]></item>
+               <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>
+               <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.censorship"><![CDATA[Censorship]]></item>
+               <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.general"><![CDATA[General]]></item>
+               <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sessions]]></item>
+               <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.category.user"><![CDATA[Users]]></item>
+               <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookie domain]]></item>
+               <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Enter here the domain in which the cookie should be used. This is optional, so in most cases you don't need to specify the cookie domain.]]></item>
+               <item name="wcf.acp.option.cookie_path"><![CDATA[Cookie path]]></item>
+               <item name="wcf.acp.option.cookie_path.description"><![CDATA[The cookie path is concurrent to the document root of your site - e.g. &quot;/forum&quot; for http://www.woltlab.com/forum.]]></item>
+               <item name="wcf.acp.option.cookie_prefix"><![CDATA[Cookie prefix]]></item>
+               <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Enter a prefix to be used for the cookie name here.]]></item>
+               <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Enable automatic Daylight Savings Time]]></item>
+               <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Should the clock automatically change according to the summer/winter time?]]></item>
+               <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Use cache method for session data]]></item>
+               <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Should the selected cache method be used to save the session data?]]></item>
+               <item name="wcf.acp.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>
+               <item name="wcf.acp.option.export"><![CDATA[Export options]]></item>
+               <item name="wcf.acp.option.export.download"><![CDATA[Download the exported options]]></item>
+               <item name="wcf.acp.option.export.download.description"><![CDATA[Download the exported options as a backup file to your local machine.]]></item>
+               <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Enable Gzip compression]]></item>
+               <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Enable this option to send content from the server to clients in a compressed form. This option reduces traffic.]]></item>
+               <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Disable caching of pages in browsers]]></item>
+               <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Enabling this option will prevent browsers from caching the pages.]]></item>
+               <item name="wcf.acp.option.http_gzip_level"><![CDATA[Compression level]]></item>
+               <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[A value of 1 to 9 is required. For optimum output for compression and server performance, we recommend a value of 1.]]></item>
+               <item name="wcf.acp.option.import"><![CDATA[Import options]]></item>
+               <item name="wcf.acp.option.import.error.importFailed"><![CDATA[The import of the chosen file has failed.]]></item>
+               <item name="wcf.acp.option.import.success"><![CDATA[The options have been imported successfully.]]></item>
+               <item name="wcf.acp.option.import.upload"><![CDATA[Upload the options]]></item>
+               <item name="wcf.acp.option.import.upload.description"><![CDATA[Upload the options to be imported from your local machine.]]></item>
+               <item name="wcf.acp.option.importAndExport"><![CDATA[Import &amp; Export options]]></item>
+               <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator's e-mail address]]></item>
+               <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Enter the administrator's e-mail address here.]]></item>
+               <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Path to the debug log file]]></item>
+               <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Enter the path to the log file here]]></item>
+               <item name="wcf.acp.option.mail_from_address"><![CDATA[Sender's e-mail address]]></item>
+               <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Enter the sender's e-mail address that should be used for automated e-mails here.]]></item>
+               <item name="wcf.acp.option.mail_from_name"><![CDATA[Sender's name]]></item>
+               <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Enter the sender's name that should be used for automated e-mails here.]]></item>
+               <item name="wcf.acp.option.mail_send_method"><![CDATA[E-mail method]]></item>
+               <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>
+               <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Choose an e-mail transmission method.]]></item>
+               <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>
+               <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>
+               <item name="wcf.acp.option.mail_signature"><![CDATA[Sender's signature]]></item>
+               <item name="wcf.acp.option.mail_signature.description"><![CDATA[Enter a signature that should be sent with system e-mails here.]]></item>
+               <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP host]]></item>
+               <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Enter the SMTP server name here.]]></item>
+               <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP password]]></item>
+               <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Enter the SMTP password here.]]></item>
+               <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP port]]></item>
+               <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Enter the SMTP server port here.]]></item>
+               <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP username]]></item>
+               <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Enter the SMTP user name here.]]></item>
+               <item name="wcf.acp.option.mail_use_f_param"><![CDATA[Enable the &quot;-f&quot; parameter]]></item>
+               <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Some servers may require the &quot;-f&quot; parameter to be used when sending e-mails. If your users experience problems with receiving e-mails, try enabling this option.]]></item>
+               <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Use formatted e-mail addresses]]></item>
+               <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Sender's and receiver's addresses are formatted in &quot;Name &lt;email@domain.tld&gt;&quot;. This option is not supported by all mail servers and should be turned off in case of any problems.]]></item>
+               <item name="wcf.acp.option.module_master_password"><![CDATA[Enable master password]]></item>
+               <item name="wcf.acp.option.module_master_password.description"><![CDATA[Pages and forms within the admin panel that are relevant to security can be protected with an additional master password.]]></item>
+               <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>
+               <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server for HTTP connections]]></item>
+               <item name="wcf.acp.option.session_timeout"><![CDATA[Session timeout]]></item>
+               <item name="wcf.acp.option.session_timeout.description"><![CDATA[Enter how long a session should remain valid for here [seconds].]]></item>
+               <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[Check IP address of session]]></item>
+               <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[The number or block of an IP address that should be checked while reading the session data. A high number can exclude users that use changing IP addresses.]]></item>
+               <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Check user agent of session]]></item>
+               <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Should the user agent be checked while reading the session data?]]></item>
+               <item name="wcf.acp.option.success"><![CDATA[Your option changes have been successfully saved.]]></item>
+               <item name="wcf.acp.option.timezone"><![CDATA[Time zone offset]]></item>
+               <item name="wcf.acp.option.timezone.description"><![CDATA[Choose your default time zone for your site.]]></item>
+               <item name="wcf.acp.option.user_online_timeout"><![CDATA[Users online timeout]]></item>
+               <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Enter here how long users should remain marked as online after they are inactive [seconds].]]></item>
+               <item name="wcf.acp.option.category.general.page"><![CDATA[Page]]></item>
+               <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>
+               <item name="wcf.acp.option.meta_description"><![CDATA[Meta description]]></item>
+               <item name="wcf.acp.option.meta_description.description"><![CDATA[Enter a meta description here.]]></item>
+               <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta keywords]]></item>
+               <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Enter some meta keywords here.]]></item>
+               <item name="wcf.acp.option.page_description"><![CDATA[Page description]]></item>
+               <item name="wcf.acp.option.page_description.description"><![CDATA[Enter a short description of the page.]]></item>
+               <item name="wcf.acp.option.page_title"><![CDATA[Page title]]></item>
+               <item name="wcf.acp.option.page_title.description"><![CDATA[Enter the global title of the page here. That title will show up inside the board header, if you have enabled it with the style editor.]]></item>
+               <item name="wcf.acp.option.page_url"><![CDATA[Page URL]]></item>
+               <item name="wcf.acp.option.page_url.description"><![CDATA[Please enter the URL of the page (without trailing slash).]]></item>
+               <item name="wcf.acp.option.page_urls"><![CDATA[Further URLs]]></item>
+               <item name="wcf.acp.option.page_urls.description"><![CDATA[Enter further URLs which are also directed at your site.]]></item>
+       </category>
+       <category name="wcf.acp.package">
+               <item name="wcf.acp.package.cancel"><![CDATA[Cancel package installation]]></item>
+               <item name="wcf.acp.package.description"><![CDATA[Description]]></item>
+               <item name="wcf.acp.package.install"><![CDATA[Package Installation]]></item>
+               <item name="wcf.acp.package.install.cancel"><![CDATA[Cancel the installation]]></item>
+               <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Are you sure you would like to cancel this installation?]]></item>
+               <item name="wcf.acp.package.install.error"><![CDATA[Package dependencies could not be satisfied for this Package.]]></item>
+               <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[The {if $action == 'install'}package installation{else}package update{/if} of package &quot;{$packageName}&quot; in version {$packageVersion} cannot be executed due to incompatibilities with the following {if $excludedPackages|count == 1}package{else}packages{/if}:]]></item>
+               <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in version {$excludedPackage.packageVersion}]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Following package doesn't{else}Following packages don't{/if} allow the {if $action == 'install'}package installation{else}package update{/if} of package &quot;{$packageName}&quot; in version {$packageVersion} due to incompatibilities:]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in version {$excludingPackage.packageVersion}]]></item>
+               <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Following package is{else}Following packages are{/if} incompatible with package &quot;{$packageName}&quot; in version {$packageVersion}. If you proceed installation the {if $excludingPackages|count == 1}package{else}packages{/if} probably won't work anymore.]]></item>
+
+               <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}Installed{else}{if $package.file|isset}is located within this Package{else}Not available{/if}{/if})</span>]]></item>
+               <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Are you sure you would like to cancel the installation of this package?]]></item>
+               <item name="wcf.acp.package.install.updatableInstances"><![CDATA[The following packages can be updated with this package]]></item>
+               <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Select one of the following packages, in order to update its version. If you would like to install the package again, please click on &quot;{lang}wcf.global.button.next{/lang}&quot;.]]></item>
+               <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[A copy of this package is already installed. If you continue, a further copy of this package will be installed. If you would like to update an available copy of this package, please select the copy from the following list.]]></item>
+               <item name="wcf.acp.package.install.version"><![CDATA[Package Version:]]></item>
+               <item name="wcf.acp.package.installDate"><![CDATA[Installation date]]></item>
+               <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[While unpacking the files of this package the following error occured:]]></item>
+               <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[The following files could not be unpacked successfully. Please check if the destination folder is writable.]]></item>
+               <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Conflicting Tables]]></item>
+               <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Do not overwrite these tables and do not ask me again for this installation.]]></item>
+               <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Overwrite the existing tables and do not ask me again for this installation.]]></item>
+               <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Required changes]]></item>
+               <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Tables affected]]></item>
+               <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Existing database tables conflict with the tables required to be installed by this package. Please choose whether to overwrite these tables.]]></item>
+               <item name="wcf.acp.package.list"><![CDATA[Installed packages]]></item>
+               <item name="wcf.acp.package.list.author"><![CDATA[Author]]></item>
+               <item name="wcf.acp.package.list.count"><![CDATA[A total of {#$items} packages installed]]></item>
+               <item name="wcf.acp.package.list.date"><![CDATA[Date]]></item>
+               <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>
+               <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>
+               <item name="wcf.acp.package.list.other"><![CDATA[Package]]></item>
+               <item name="wcf.acp.package.list.plugin"><![CDATA[Plugin]]></item>
+               <item name="wcf.acp.package.list.standalone"><![CDATA[Standalone application]]></item>
+               <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>
+               <item name="wcf.acp.package.optionals"><![CDATA[Install optional packages]]></item>
+               <item name="wcf.acp.package.optionals.description"><![CDATA[The selected package brings the following options. Please select those you would like to install.]]></item>
+               <item name="wcf.acp.package.optionals.installed"><![CDATA[ (This Package is already installed.)]]></item>
+               <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (The requirements of this Package have not been fulfilled.)]]></item>
+               <item name="wcf.acp.package.packageDir"><![CDATA[Installation folder]]></item>
+               <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>
+               <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Another application is already installed in this folder.]]></item>
+               <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[This folder is not valid.]]></item>
+               <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[This folder is not writable.]]></item>
+               <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[This folder is already in use by the WoltLab Community Framework. Please choose a different location.]]></item>
+               <item name="wcf.acp.package.packageDir.input"><![CDATA[Please enter the installation folder name here.]]></item>
+               <item name="wcf.acp.package.packageDir.url"><![CDATA[This application is accessible through the following URL after installation in this folder:]]></item>
+               <item name="wcf.acp.package.requirements"><![CDATA[Select dependencies]]></item>
+               <item name="wcf.acp.package.requirements.description"><![CDATA[The current package requires another package that is already installed several times. Please choose the instance that is required.]]></item>
+               <item name="wcf.acp.package.rollback"><![CDATA[Rollback package installation]]></item>
+               <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright &copy; {$packageAuthor}]]></item>
+               <item name="wcf.acp.package.startInstall"><![CDATA[Install new package]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[The chosen package has no valid installation routine.]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[The archive you have given is not a valid package.]]></item>
+               <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[The package &quot;{$package->getName()}&quot; could not be updated with the supplied archive.]]></item>
+               <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[No files were found within the specified directory.]]></item>
+               <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[The chosen package is already installed. Packages can not be installed more than one time.]]></item>
+               <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[The upload of the chosen archive has failed.]]></item>
+               <item name="wcf.acp.package.startInstall.source"><![CDATA[Select package source]]></item>
+               <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Enter the path of the package located on your server]]></item>
+               <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Enter a direct path to the package-file here. An internet address can be used or alternatively the path to the package file using the server's file system.]]></item>
+               <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Upload package from your local computer]]></item>
+               <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Enter the package file to be uploaded from your computer here.]]></item>
+               <item name="wcf.acp.package.startUpdate"><![CDATA[Update Package &quot;{$package->getName()}&quot;]]></item>
+               <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Installing menu entries for the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.install.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Installing template patches for the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Installing templates for the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Installing cronjobs ...]]></item>
+               <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Installing event listener ...]]></item>
+               <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Unpacking package files ...]]></item>
+               <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Installing user group options ...]]></item>
+               <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Installing package languages ...]]></item>
+               <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Installing package options ...]]></item>
+               <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Executing special scripts ...]]></item>
+               <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Installing database entries...]]></item>
+               <item name="wcf.acp.package.step.install.TemplatePatchPackageInstallationPlugin"><![CDATA[Installing template patches ...]]></item>
+               <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Installing package templates ...]]></item>
+               <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Installing user profile fields ...]]></item>
+               <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Checking for possible conflicts ...]]></item>
+               <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>
+               <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation is complete]]></item>
+               <item name="wcf.acp.package.step.install.optionals"><![CDATA[Installing optional packages ...]]></item>
+               <item name="wcf.acp.package.step.install.package"><![CDATA[Registering package ...]]></item>
+               <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Installing package plugins ...]]></item>
+               <item name="wcf.acp.package.step.install.parent"><![CDATA[Parent package allocation is being done ...]]></item>
+               <item name="wcf.acp.package.step.install.requirements"><![CDATA[Checking dependencies ...]]></item>
+               <item name="wcf.acp.package.step.title"><![CDATA[Package <b>{$packageName|encodeJS}</b>: ]]></item>
+               <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Removing menu items from the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Removing template patches of the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Removing templates from the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Uninstalling cronjobs ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Removing event listener ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Removing package files ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Removing user group options ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Removing package languages ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Removing package options ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Removing database entries...]]></item>
+               <item name="wcf.acp.package.step.uninstall.TemplatePatchPackageInstallationPlugin"><![CDATA[Removing template patches ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Removing package templates ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Removing user profile fields ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Package removal finished]]></item>
+               <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Removing optional packages ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Removing package plugins ...]]></item>
+               <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Removing package requirements ...]]></item>
+               <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Updating menu items in the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.update.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Updating template patches in the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Updating templates in the Administration Control Panel ...]]></item>
+               <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Updating cronjobs ...]]></item>
+               <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Updating event listener ...]]></item>
+               <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Unpacking package files ...]]></item>
+               <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Updating user group options ...]]></item>
+               <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Updating package languages ...]]></item>
+               <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Updating package options ...]]></item>
+               <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Executing special scripts ...]]></item>
+               <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Updating database entries ...]]></item>
+               <item name="wcf.acp.package.step.update.TemplatePatchPackageInstallationPlugin"><![CDATA[Updating template patches ...]]></item>
+               <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Updating package templates ...]]></item>
+               <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Updating user profile fields ...]]></item>
+               <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>
+               <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Checking for possible conflicts ...]]></item>
+               <item name="wcf.acp.package.step.update.finish"><![CDATA[Package update finished]]></item>
+               <item name="wcf.acp.package.step.update.optionals"><![CDATA[Updating optional packages ...]]></item>
+               <item name="wcf.acp.package.step.update.package"><![CDATA[Updating package ...]]></item>
+               <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Updating package plugins ...]]></item>
+               <item name="wcf.acp.package.step.update.parent"><![CDATA[Parent package allocation is being done ...]]></item>
+               <item name="wcf.acp.package.step.update.requirements"><![CDATA[Checking dependencies ...]]></item>
+               <item name="wcf.acp.package.templatePatch.install.failed"><![CDATA[The patch that this package is trying to apply has failed because this patch is not compliant to its target file. Therefore this package cannot be installed. Please click the &quot;{lang}wcf.acp.package.install.cancel{/lang}&quot; button.]]></item>
+               <item name="wcf.acp.package.templatePatch.repatch.failed"><![CDATA[Re-patching of the following templates has failed:<br />{foreach from=$failures item=$failure}{$failure.templateName} (Originally patched by: {$failure.packageName})<br />{/foreach}The original patch package that was previously applied may no longer function. You should still continue with this update by clicking on the &quot;{lang}wcf.global.button.next{/lang}&quot; button.]]></item>
+               <item name="wcf.acp.package.templatePatch.uninstall.failed"><![CDATA[The patch that this package is trying to remove has failed because its target file has been externally amended. Therefore this package cannot be removed. Please click the &quot;{lang}wcf.acp.package.uninstall.cancel{/lang}&quot; button.]]></item>
+               <item name="wcf.acp.package.uninstall"><![CDATA[Package removal]]></item>
+               <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Cancel package-removal]]></item>
+               <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[It is not possible to uninstall these packages, because there is at least one dependent package, that cannot be uninstalled.]]></item>
+               <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Upon final confirmation {if $dependentPackages|count == 1}this package{else}these packages{/if} will be removed without any further promting.]]></item>
+               <item name="wcf.acp.package.update"><![CDATA[Package update]]></item>
+               <item name="wcf.acp.package.updateDate"><![CDATA[Date of update]]></item>
+               <item name="wcf.acp.package.view.author"><![CDATA[Author:]]></item>
+               <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Go to the Administration Control Panel]]></item>
+               <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Remove package]]></item>
+               <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Remove all packages]]></item>
+               <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Are you sure that you would like to remove this package?]]></item>
+               <item name="wcf.acp.package.view.button.update"><![CDATA[Update package]]></item>
+               <item name="wcf.acp.package.view.date"><![CDATA[Date:]]></item>
+               <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Dependent packages]]></item>
+               <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[This package has a requirement from {if $dependentPackages|count == 1}one other package.{else}{#$dependentPackages|count} other packages.{/if}]]></item>
+               <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}This package is required by one other Package{else}{#$dependentPackages|count} Packages are directly or indirectly dependent upon this package{/if}.]]></item>
+               <item name="wcf.acp.package.view.dir"><![CDATA[Installation folder:]]></item>
+               <item name="wcf.acp.package.view.identifier"><![CDATA[Identifier:]]></item>
+               <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installed instance:]]></item>
+               <item name="wcf.acp.package.view.parent"><![CDATA[Parent package:]]></item>
+               <item name="wcf.acp.package.view.properties"><![CDATA[Properties]]></item>
+               <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Required packages]]></item>
+               <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[This package has a requirement of {if $requiredPackages|count == 1}one other package.{else}{#$requiredPackages|count} other packages.{/if}]]></item>
+               <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>
+               <item name="wcf.acp.package.view.version"><![CDATA[Installed version:]]></item>
+       </category>
+       <category name="wcf.acp.packageUpdate">
+               <item name="wcf.acp.packageUpdate"><![CDATA[Update packages]]></item>
+               <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentication with update server]]></item>
+               <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Connection data]]></item>
+               <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Username and password have not been accepted.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Password]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Please enter a valid password.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Username]]></item>
+               <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Please enter a valid username.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[User login]]></item>
+               <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server message]]></item>
+               <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server name]]></item>
+               <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Save user data permanantly]]></item>
+               <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[The entered user data will be saved permanently, so you do not have to input them again.]]></item>
+               <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Address]]></item>
+               <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installed version]]></item>
+               <item name="wcf.acp.packageUpdate.error"><![CDATA[An error occured: ]]></item>
+               <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[The download of the package {$package} has been failed.]]></item>
+               <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[An error occured while trying to download the package list.]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[The following {if $excludedPackages|count == 1}conflict{else}conflicts{/if} occured:]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[The installed package &quot;{$excludedPackage.existingPackageName}&quot; is incompatible with the package &quot;{$excludedPackage.packageName}&quot; in version {$excludedPackage.packageVersion}.]]></item>
+               <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[The package &quot;{$excludedPackage.packageName}&quot; in version {$excludedPackage.packageVersion} is not compatible with the installed package &quot;{$excludedPackage.existingPackageName}&quot;.]]></item>
+               <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} will be installed]]></item>
+               <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[There are currently no updates available.]]></item>
+               <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[You have not selected any update.]]></item>
+               <item name="wcf.acp.packageUpdate.options"><![CDATA[Options]]></item>
+               <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[This package is already installed and unique. Therefore it cannot be installed another time.]]></item>
+               <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Install package]]></item>
+               <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Install another package instance (packages is already installed {#$package.instances} time{if $package.instances > 1}s{/if})]]></item>
+               <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Update installed package {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} version {$updatableInstance.packageVersion}]]></item>
+               <item name="wcf.acp.packageUpdate.search"><![CDATA[Search packages]]></item>
+               <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Author]]></item>
+               <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Search for ...]]></item>
+               <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Hide already installed unique packages]]></item>
+               <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Package name]]></item>
+               <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Package name and description]]></item>
+               <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update server]]></item>
+               <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Search all update server]]></item>
+               <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Type of package]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Other packages]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Plugin for already installed packages]]></item>
+               <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Standalone application]]></item>
+               <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Select all packages]]></item>
+               <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} is updated to {$package.toVersion}]]></item>
+               <item name="wcf.acp.packageUpdate.updates"><![CDATA[The following package updates and installations will be processed:]]></item>
+               <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[New version]]></item>
+       </category>
+       <category name="wcf.acp.sessionLog">
+               <item name="wcf.acp.sessionLog.access.view"><![CDATA[Actions of the logged session of &quot;{$sessionLog->username}&quot;]]></item>
+               <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[There is a total of {#$items} logged action{if $items != 1}s{/if}]]></item>
+               <item name="wcf.acp.sessionLog.accesses"><![CDATA[Actions]]></item>
+               <item name="wcf.acp.sessionLog.className"><![CDATA[Class name]]></item>
+               <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP address]]></item>
+               <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Last action]]></item>
+               <item name="wcf.acp.sessionLog.packageName"><![CDATA[Package]]></item>
+               <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Method]]></item>
+               <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>
+               <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>
+               <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>
+               <item name="wcf.acp.sessionLog.time"><![CDATA[Date]]></item>
+               <item name="wcf.acp.sessionLog.userAgent"><![CDATA[User agent]]></item>
+               <item name="wcf.acp.sessionLog.view"><![CDATA[Logged sessions]]></item>
+               <item name="wcf.acp.sessionLog.view.count"><![CDATA[There is a total of {#$items} logged session{if $items != 1}s{/if}]]></item>
+       </category>
+       <category name="wcf.acp.updateServer">
+               <item name="wcf.acp.updateServer.add"><![CDATA[Add server]]></item>
+               <item name="wcf.acp.updateServer.add.success"><![CDATA[The server has been successfully added.]]></item>
+               <item name="wcf.acp.updateServer.data"><![CDATA[Server data]]></item>
+               <item name="wcf.acp.updateServer.delete"><![CDATA[Delete server]]></item>
+               <item name="wcf.acp.updateServer.delete.success"><![CDATA[The server has been successfully deleted.]]></item>
+               <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Do you really want to delete this server?]]></item>
+               <item name="wcf.acp.updateServer.disable"><![CDATA[Disable]]></item>
+               <item name="wcf.acp.updateServer.edit"><![CDATA[Edit server]]></item>
+               <item name="wcf.acp.updateServer.edit.success"><![CDATA[Your changes have been successfully saved.]]></item>
+               <item name="wcf.acp.updateServer.enable"><![CDATA[Enable]]></item>
+               <item name="wcf.acp.updateServer.errorText"><![CDATA[Error messages]]></item>
+               <item name="wcf.acp.updateServer.htPassword"><![CDATA[Password]]></item>
+               <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Please enter a valid password (optional).]]></item>
+               <item name="wcf.acp.updateServer.htUsername"><![CDATA[Username]]></item>
+               <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Please enter a valid user name (optional).]]></item>
+               <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[The following error occured while trying to connect:]]></item>
+               <item name="wcf.acp.updateServer.list.available"><![CDATA[{#$items} server available]]></item>
+               <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server id]]></item>
+               <item name="wcf.acp.updateServer.packages"><![CDATA[Packages]]></item>
+               <item name="wcf.acp.updateServer.server"><![CDATA[Address]]></item>
+               <item name="wcf.acp.updateServer.server.description"><![CDATA[Please enter the URL to a package server.]]></item>
+               <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[The entered address is invalid.]]></item>
+               <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>
+               <item name="wcf.acp.updateServer.timestamp"><![CDATA[Last access]]></item>
+               <item name="wcf.acp.updateServer.view"><![CDATA[Available update server]]></item>
+               <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[There are no update server available.]]></item>
+       </category>
+       <category name="wcf.acp.user">
+               <item name="wcf.acp.user.add"><![CDATA[Add new user]]></item>
+               <item name="wcf.acp.user.add.data"><![CDATA[User details]]></item>
+               <item name="wcf.acp.user.add.success"><![CDATA[The new user has been successfully saved.]]></item>
+               <item name="wcf.acp.user.assignToGroup"><![CDATA[Group assignment]]></item>
+               <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Assign the following users to the selected group(s)]]></item>
+               <item name="wcf.acp.user.assignToGroup.success"><![CDATA[The users have been successfully assigned to your chosen groups.]]></item>
+               <item name="wcf.acp.user.button.assignGroup"><![CDATA[Group assignment]]></item>
+               <item name="wcf.acp.user.button.exportMail"><![CDATA[Export e-mail addresses]]></item>
+               <item name="wcf.acp.user.button.sendMail"><![CDATA[Send an e-mail]]></item>
+               <item name="wcf.acp.user.delete"><![CDATA[Delete user(s)]]></item>
+               <item name="wcf.acp.user.delete.error"><![CDATA[No user could be deleted.]]></item>
+               <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}The user has {else}{#$deletedUsers} users have{/if} been successfully deleted.]]></item>
+               <item name="wcf.acp.user.delete.sure"><![CDATA[Are you sure that you would like to delete this user?]]></item>
+               <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Are you sure that you would like to delete the selected User(s)?]]></item>
+               <item name="wcf.acp.user.edit"><![CDATA[Edit user]]></item>
+               <item name="wcf.acp.user.edit.success"><![CDATA[The changes for this user have been successfully saved.]]></item>
+               <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[You are currently editing your own user account. Changing the permissions of this user group might lead to locking yourself out of the Administration Control Panel. Please be careful!]]></item>
+               <item name="wcf.acp.user.exportEmailAddress"><![CDATA[Export e-mail addresses]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Export file format]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Export options]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[Export the e-mail addresses from the following users]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Separate the addresses with a ]]></item>
+               <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Enclose the addresses with ]]></item>
+               <item name="wcf.acp.user.groups"><![CDATA[Group memberships]]></item>
+               <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Find users that are not members of the chosen user groups.]]></item>
+               <item name="wcf.acp.user.list"><![CDATA[Users]]></item>
+               <item name="wcf.acp.user.list.all"><![CDATA[All users]]></item>
+               <item name="wcf.acp.user.list.count"><![CDATA[A total of {#$items} user{if $items > 1}s{/if}]]></item>
+               <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "1 user selected" : this.count+" users selected"]]></item>
+               <item name="wcf.acp.user.massProcessing"><![CDATA[Bulk processing of users]]></item>
+               <item name="wcf.acp.user.massProcessing.action"><![CDATA[Action]]></item>
+               <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Conditions]]></item>
+               <item name="wcf.acp.user.massProcessing.success"><![CDATA[The chosen action has been executed successfully on {#$affectedUsers} users.]]></item>
+               <item name="wcf.acp.user.massProcessing.warning"><![CDATA[The bulk processor will perform the following tasks <strong>without additional security notification</strong>, on all users matching the set conditions. Bulk processing can be very performance intensive, so it should only be executed when the forum is offline. To have a correct display of your content you should update the counters. The processing can not be reversed, so please be attentive when using this function.]]></item>
+               <item name="wcf.acp.user.search"><![CDATA[Search for users]]></item>
+               <item name="wcf.acp.user.search.conditions"><![CDATA[Search criteria]]></item>
+               <item name="wcf.acp.user.search.conditions.general"><![CDATA[General search criteria]]></item>
+               <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profile search criteria]]></item>
+               <item name="wcf.acp.user.search.display"><![CDATA[Display]]></item>
+               <item name="wcf.acp.user.search.display.columns"><![CDATA[Columns]]></item>
+               <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Other]]></item>
+               <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profile]]></item>
+               <item name="wcf.acp.user.search.display.general"><![CDATA[General]]></item>
+               <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Users per page]]></item>
+               <item name="wcf.acp.user.search.display.sort"><![CDATA[Sorting]]></item>
+               <item name="wcf.acp.user.search.error.noMatches"><![CDATA[No users have been found.]]></item>
+               <item name="wcf.acp.user.search.matches"><![CDATA[Your search produced {if $items == 1}one result{else}{#$items} results{/if}]]></item>
+               <item name="wcf.acp.user.search.withinResults"><![CDATA[Search within results]]></item>
+               <item name="wcf.acp.user.sendMail"><![CDATA[Send an e-mail]]></item>
+               <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail all Users]]></item>
+               <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[Send e-mail as HTML]]></item>
+               <item name="wcf.acp.user.sendMail.from"><![CDATA[Sender]]></item>
+               <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Here you can enter the sender's e-mail address in the following format:</p>
+<p style="text-align: center; line-height: 2em;"><code>{if MAIL_USE_FORMATTED_ADDRESS}Senders name &lt;email@sender.tld&gt;{else}email@sender.tld{/if}</code></p>
+<p>If you have completely filled in the section under System -> Options -> E-mail, then this field will automatically be filled in. If you are sending e-mails using SMTP, then the sender's e-mail-Address must also be accepted by the server.</p>]]></item>
+               <item name="wcf.acp.user.sendMail.group"><![CDATA[E-mail all group members]]></item>
+               <item name="wcf.acp.user.sendMail.groups"><![CDATA[Send an e-mail to the members of the following user groups:]]></item>
+               <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-mail]]></item>
+               <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[Send an e-mail to the following users]]></item>
+               <item name="wcf.acp.user.sendMail.subject"><![CDATA[Subject]]></item>
+               <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Enter here the e-mail subject.]]></item>
+               <item name="wcf.acp.user.sendMail.text"><![CDATA[Message]]></item>
+               <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Enter here the message you want to send to users.]]></item>
+               <item name="wcf.acp.user.userNote"><![CDATA[Welcome {$this->user->username}.]]></item>
+       </category>
+       <category name="wcf.acp.worker">
+               <item name="wcf.acp.worker.currentStep"><![CDATA[Current process]]></item>
+               <item name="wcf.acp.worker.description"><![CDATA[Please leave this browser window open until the process has successfully completed. Do NOT try to login to your administrations area using a separate browser window, as doing so may damage the current process.]]></item>
+               <item name="wcf.acp.worker.progress.finish"><![CDATA[Process completed successfully]]></item>
+               <item name="wcf.acp.worker.progress.working"><![CDATA[Processing ...]]></item>
+               <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% complete]]></item>
+               <item name="wcf.acp.worker.title"><![CDATA[Processing ...]]></item>
+       </category>
+       <category name="wcf.global">
+               <item name="wcf.global.button.back"><![CDATA[&laquo; Back]]></item>
+               <item name="wcf.global.button.close"><![CDATA[Close]]></item>
+               <item name="wcf.global.button.collapse"><![CDATA[Collapse]]></item>
+               <item name="wcf.global.button.collapsible"><![CDATA[Expand or collapse]]></item>
+               <item name="wcf.global.button.delete"><![CDATA[Delete]]></item>
+               <item name="wcf.global.button.delete.confirm"><![CDATA[Do you really want to delete this item?]]></item>
+               <item name="wcf.global.button.deleteCompletely"><![CDATA[Delete completely]]></item>
+               <item name="wcf.global.button.edit"><![CDATA[Edit]]></item>
+               <item name="wcf.global.button.editor.jump"><![CDATA[Use full editor]]></item>
+               <item name="wcf.global.button.expand"><![CDATA[Expand]]></item>
+               <item name="wcf.global.button.mark"><![CDATA[Select]]></item>
+               <item name="wcf.global.button.next"><![CDATA[Next &raquo;]]></item>
+               <item name="wcf.global.button.preview"><![CDATA[Preview]]></item>
+               <item name="wcf.global.button.reset"><![CDATA[Reset]]></item>
+               <item name="wcf.global.button.submit"><![CDATA[Submit]]></item>
+               <item name="wcf.global.button.unmark"><![CDATA[Unselect]]></item>
+               <item name="wcf.global.date.day"><![CDATA[Day]]></item>
+               <item name="wcf.global.date.days"><![CDATA[Days]]></item>
+               <item name="wcf.global.date.hour"><![CDATA[Hour]]></item>
+               <item name="wcf.global.date.hours"><![CDATA[Hours]]></item>
+               <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>
+               <item name="wcf.global.date.minutes"><![CDATA[Minutes]]></item>
+               <item name="wcf.global.date.month"><![CDATA[Month]]></item>
+               <item name="wcf.global.date.months"><![CDATA[Months]]></item>
+               <item name="wcf.global.date.second"><![CDATA[Second]]></item>
+               <item name="wcf.global.date.seconds"><![CDATA[Seconds]]></item>
+               <item name="wcf.global.date.week"><![CDATA[Week]]></item>
+               <item name="wcf.global.date.weeks"><![CDATA[Weeks]]></item>
+               <item name="wcf.global.date.year"><![CDATA[Year]]></item>
+               <item name="wcf.global.date.year.notRequired"><![CDATA[Specifying the year is optional.]]></item>
+               <item name="wcf.global.date.years"><![CDATA[Years]]></item>
+               <item name="wcf.global.dateFormat"><![CDATA[M jS Y]]></item>
+               <item name="wcf.global.dateFormatToday"><![CDATA[<b>\T\o\d\a\y</b>, g:ia]]></item>
+               <item name="wcf.global.dateFormatYesterday"><![CDATA[\Y\e\s\t\e\r\d\a\y, g:ia]]></item>
+               <item name="wcf.global.dateInputOrder"><![CDATA[month-day-year]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.dateMethod"><![CDATA[date]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.decimalPoint"><![CDATA[.]]></item>
+               <item name="wcf.global.defaultValue"><![CDATA[Default]]></item>
+               <item name="wcf.global.error.backward"><![CDATA[Back to last page]]></item>
+               <item name="wcf.global.error.empty"><![CDATA[Please enter the required information for this field.]]></item>
+               <item name="wcf.global.error.file.notFound"><![CDATA[The file could not be found.]]></item>
+               <item name="wcf.global.error.illegalLink"><![CDATA[The link you are trying to reach is no longer available or is invalid.]]></item>
+               <item name="wcf.global.error.permissionDenied"><![CDATA[You are not allowed to enter this page. You do not have the required permissions to enter this page.]]></item>
+               <item name="wcf.global.error.permissionDenied.title"><![CDATA[You are not allowed to enter this page.]]></item>
+               <item name="wcf.global.error.title"><![CDATA[Error message]]></item>
+               <item name="wcf.global.form.error"><![CDATA[The data you have entered are invalid. Please check the information you have given in the marked fields.]]></item>
+               <item name="wcf.global.language.ar"><![CDATA[Arabic]]></item>
+               <item name="wcf.global.language.bs"><![CDATA[Bosnian]]></item>
+               <item name="wcf.global.language.cs"><![CDATA[Czech]]></item>
+               <item name="wcf.global.language.da"><![CDATA[Danish]]></item>
+               <item name="wcf.global.language.de"><![CDATA[German]]></item>
+               <item name="wcf.global.language.de-informal"><![CDATA[German (Informal)]]></item>
+               <item name="wcf.global.language.el"><![CDATA[Greek]]></item>
+               <item name="wcf.global.language.en"><![CDATA[English]]></item>
+               <item name="wcf.global.language.es"><![CDATA[Spanish]]></item>
+               <item name="wcf.global.language.fa"><![CDATA[Persian (Farsi)]]></item>
+               <item name="wcf.global.language.fi"><![CDATA[Finnish]]></item>
+               <item name="wcf.global.language.fr"><![CDATA[French]]></item>
+               <item name="wcf.global.language.he"><![CDATA[Hebrew]]></item>
+               <item name="wcf.global.language.hr"><![CDATA[Croatian]]></item>
+               <item name="wcf.global.language.hu"><![CDATA[Hungarian]]></item>
+               <item name="wcf.global.language.it"><![CDATA[Italian]]></item>
+               <item name="wcf.global.language.ja"><![CDATA[Japanese]]></item>
+               <item name="wcf.global.language.ko"><![CDATA[Korean]]></item>
+               <item name="wcf.global.language.nl"><![CDATA[Dutch]]></item>
+               <item name="wcf.global.language.no"><![CDATA[Norwegian]]></item>
+               <item name="wcf.global.language.pl"><![CDATA[Polish]]></item>
+               <item name="wcf.global.language.pt"><![CDATA[Portuguese]]></item>
+               <item name="wcf.global.language.pt-BR"><![CDATA[Portuguese (Brazil)]]></item>
+               <item name="wcf.global.language.ro"><![CDATA[Romanian]]></item>
+               <item name="wcf.global.language.ru"><![CDATA[Russian]]></item>
+               <item name="wcf.global.language.sk"><![CDATA[Slovak]]></item>
+               <item name="wcf.global.language.sr"><![CDATA[Serbian]]></item>
+               <item name="wcf.global.language.sv"><![CDATA[Swedish]]></item>
+               <item name="wcf.global.language.th"><![CDATA[Thai]]></item>
+               <item name="wcf.global.language.tr"><![CDATA[Turkish]]></item>
+               <item name="wcf.global.language.zh-CN"><![CDATA[Chinese (Simplified)]]></item>
+               <item name="wcf.global.language.zh-TW"><![CDATA[Chinese (Traditional)]]></item>
+               <item name="wcf.global.locale.unix"><![CDATA[en_US]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.locale.win"><![CDATA[english]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.multiSelect"><![CDATA[Multiple items can be selected by holding the &quot;Ctrl/Shift&quot; key (Windows) or &quot;Command&quot; (Mac OS) key and clicking the items required.]]></item>
+               <item name="wcf.global.page.input"><![CDATA[Go to next page]]></item>
+               <item name="wcf.global.page.next"><![CDATA[Next page]]></item>
+               <item name="wcf.global.page.previous"><![CDATA[Previous page]]></item>
+               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.pageTitle"><![CDATA[WoltLab&reg; Community Framework&trade;]]></item>
+               <item name="wcf.global.redirect.title"><![CDATA[Redirection]]></item>
+               <item name="wcf.global.redirect.url"><![CDATA[Please click here if the automatic redirection does not work!]]></item>
+               <item name="wcf.global.scrollDown"><![CDATA[Go to page bottom]]></item>
+               <item name="wcf.global.scrollUp"><![CDATA[Go to page end]]></item>
+               <item name="wcf.global.search.matchesExactly"><![CDATA[Exact match]]></item>
+               <item name="wcf.global.shortTimeFormat"><![CDATA[M jS Y, g:ia]]></item>
+               <item name="wcf.global.skipToContent"><![CDATA[Skip navigation]]></item>
+               <item name="wcf.global.sortOrder.ascending"><![CDATA[ascending]]></item>
+               <item name="wcf.global.sortOrder.descending"><![CDATA[descending]]></item>
+               <item name="wcf.global.thousandsSeparator"><![CDATA[,]]></item>
+               <item name="wcf.global.timeFormat"><![CDATA[l, F jS Y, g:ia]]></item>
+       </category>
+       <category name="wcf.imageViewer">
+               <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Image " + (this.currentIndex + 1) + " of " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>
+               <item name="wcf.imageViewer.close"><![CDATA[Close]]></item>
+               <item name="wcf.imageViewer.enlarge"><![CDATA[Show only this image (quits the image viewer)]]></item>
+               <item name="wcf.imageViewer.next"><![CDATA[Next image]]></item>
+               <item name="wcf.imageViewer.pause"><![CDATA[Stop slideshow]]></item>
+               <item name="wcf.imageViewer.play"><![CDATA[Start slideshow (changes the image every 5 seconds)]]></item>
+               <item name="wcf.imageViewer.previous"><![CDATA[Previous image]]></item>
+       </category>
+       <category name="wcf.option">
+               <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Canary Islands, Lisbon, London, Monrovia, Ouagadougou, Reykjav&iacute;k]]></item>
+               <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brussels, Copenhagen, Madrid, Paris, Prague, Rome, Sarajevo, Stockholm, Tunis, Warsaw, Vienna]]></item>
+               <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athens, Beirut, Bucharest, Helsinki, Istanbul, Jerusalem, Cairo, Cape Town, Khartoum, Kiev, Minsk, Sofia]]></item>
+               <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Ababa, Antananarivo, Baghdad, Dodoma, Kampala, Kuwait City, Mogadishu, Moscow, Nairobi, Riyadh]]></item>
+               <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Tehran]]></item>
+               <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Yerevan, Muscat, R&eacute;union, Tbilisi]]></item>
+               <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>
+               <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Ashgabat, Bishkek, Dushanbe, Islamabad, Yekaterinburg, Karachi, Maldive Islands, Tashkent]]></item>
+               <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, New Delhi]]></item>
+               <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>
+               <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Novosibirsk]]></item>
+               <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Cocos (Keeling) Islands, Yangon]]></item>
+               <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnoyarsk, Vientiane]]></item>
+               <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hong Kong, Irkutsk, Kuala Lumpur, Manila, Beijing, Perth, Singapore, Taipei, Ulaanbaatar]]></item>
+               <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Western Australia)]]></item>
+               <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Yakutsk, Osaka, Pyongyang, Sapporo, Seoul, Tokyo]]></item>
+               <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>
+               <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Vladivostok]]></item>
+               <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord Howe Island (Australia)]]></item>
+               <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, New Caledonia, Solomon Islands]]></item>
+               <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolk Island]]></item>
+               <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, South Tarawa, Fiji, Kamchatka, Marshall Islands, Wellington]]></item>
+               <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham Islands (New Zealand)]]></item>
+               <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenix Islands]]></item>
+               <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Line Islands, Christmas Island]]></item>
+               <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azores, Cape Verde Islands]]></item>
+               <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mid-Atlantic]]></item>
+               <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Bras&iacute;lia, Buenos Aires, Cayenne, Georgetown, Greenland, Montevideo]]></item>
+               <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Newfoundland]]></item>
+               <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Atlantic Time (Canada), Asunci&oacute;n, La Paz, Port-of-Spain, Santiago]]></item>
+               <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>
+               <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Eastern Time (US &amp; Canada), Bogot&aacute;, Lima, San Francisco de Quito]]></item>
+               <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Central Time (US &amp; Canada), Central America, Mexico City]]></item>
+               <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Mountain Time (US &amp; Canada), Chihuahua, Mazatlan]]></item>
+               <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Pacific Time (US &amp; Canada), Tijuana]]></item>
+               <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>
+               <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) French Polynesia]]></item>
+               <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cook Islands, Hawaii]]></item>
+               <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midway Islands, Samoa]]></item>
+               <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Enewetak, Kwajalein]]></item>
+       </category>
+       <category name="wcf.page">
+               <item name="wcf.page.pageNo"><![CDATA[Page {#$pageNo}]]></item>
+       </category>
+       <category name="wcf.user">
+               <item name="wcf.user.confirmEmail"><![CDATA[Confirm E-mail Address]]></item>
+               <item name="wcf.user.confirmPassword"><![CDATA[Confirm password]]></item>
+               <item name="wcf.user.email"><![CDATA[E-mail Address]]></item>
+               <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[The given e-mail address and confirmation e-mail address are not identical.]]></item>
+               <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[The given password and confirmation password are not identical.]]></item>
+               <item name="wcf.user.error.email.notUnique"><![CDATA[The e-mail address you have entered has already been used by another user.]]></item>
+               <item name="wcf.user.error.email.notValid"><![CDATA[The e-mail address you have entered is not valid.]]></item>
+               <item name="wcf.user.error.password.false"><![CDATA[The password is not correct.]]></item>
+               <item name="wcf.user.error.username.notFound"><![CDATA[The user name &quot;{$username}&quot; could not be found.]]></item>
+               <item name="wcf.user.error.username.notUnique"><![CDATA[The user name you have entered is already in use.]]></item>
+               <item name="wcf.user.error.username.notValid"><![CDATA[The username you have entered is not valid.]]></item>
+               <item name="wcf.user.language"><![CDATA[Language]]></item>
+               <item name="wcf.user.language.description"><![CDATA[Please select the user interface language to be shown in!]]></item>
+               <item name="wcf.user.logout"><![CDATA[Logout]]></item>
+               <item name="wcf.user.password"><![CDATA[Password]]></item>
+               <item name="wcf.user.registrationDate"><![CDATA[Date of registration]]></item>
+               <item name="wcf.user.userID"><![CDATA[User ID]]></item>
+               <item name="wcf.user.username"><![CDATA[Username]]></item>
+               <item name="wcf.user.visibleLanguages"><![CDATA[Show content in the following languages]]></item>
+               <item name="wcf.user.visibleLanguages.description"><![CDATA[Select the content languages that should be shown here.]]></item>
+       </category>
+       <category name="wcf.user.option">
+               <item name="wcf.user.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>
+       </category>
+</language>
index 536cb53295bd5db17cfef57ebe8d88f069730fff..6d74acbaa34d72db59574a479272304618777dca 100644 (file)
-/**** tables ****/\r
-DROP TABLE IF EXISTS wcf1_acp_menu_item;\r
-CREATE TABLE wcf1_acp_menu_item (\r
-       menuItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       menuItem VARCHAR(255) NOT NULL DEFAULT '',\r
-       parentMenuItem VARCHAR(255) NOT NULL DEFAULT '',\r
-       menuItemLink VARCHAR(255) NOT NULL DEFAULT '',\r
-       showOrder INT(10) NOT NULL DEFAULT 0,\r
-       permissions TEXT,\r
-       options TEXT,\r
-       UNIQUE KEY menuItem (menuItem, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_session;\r
-CREATE TABLE wcf1_acp_session (\r
-       sessionID CHAR(40) NOT NULL PRIMARY KEY,\r
-       packageID INT(10),\r
-       userID INT(10),\r
-       ipAddress VARCHAR(39) NOT NULL DEFAULT '',\r
-       userAgent VARCHAR(255) NOT NULL DEFAULT '',\r
-       lastActivityTime INT(10) NOT NULL DEFAULT 0,\r
-       requestURI VARCHAR(255) NOT NULL DEFAULT '',\r
-       requestMethod VARCHAR(4) NOT NULL DEFAULT '',\r
-       username VARCHAR(255) NOT NULL DEFAULT '',\r
-       KEY sessionID (sessionID, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_session_data;\r
-CREATE TABLE wcf1_acp_session_data (\r
-       sessionID CHAR(40) NOT NULL PRIMARY KEY,\r
-       sessionVariables MEDIUMTEXT\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_session_access_log;\r
-CREATE TABLE wcf1_acp_session_access_log (\r
-       sessionAccessLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       sessionLogID INT(10) NOT NULL,\r
-       packageID INT(10),\r
-       ipAddress VARCHAR(39) NOT NULL DEFAULT '',\r
-       time INT(10) NOT NULL DEFAULT 0,\r
-       requestURI VARCHAR(255) NOT NULL DEFAULT '',\r
-       requestMethod VARCHAR(4) NOT NULL DEFAULT '',\r
-       className VARCHAR(255) NOT NULL DEFAULT '',\r
-       KEY sessionLogID (sessionLogID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_session_log;\r
-CREATE TABLE wcf1_acp_session_log (\r
-       sessionLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       sessionID CHAR(40) NOT NULL DEFAULT '',\r
-       userID INT(10),\r
-       ipAddress VARCHAR(39) NOT NULL DEFAULT '',\r
-       hostname VARCHAR(255) NOT NULL DEFAULT '',\r
-       userAgent VARCHAR(255) NOT NULL DEFAULT '',\r
-       time INT(10) NOT NULL DEFAULT 0,\r
-       lastActivityTime INT(10) NOT NULL DEFAULT 0,\r
-       KEY sessionID (sessionID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_template;\r
-CREATE TABLE wcf1_acp_template (\r
-       templateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10),\r
-       templateName VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY (packageID, templateName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_application;\r
-CREATE TABLE wcf1_application (\r
-       packageID INT(10) NOT NULL PRIMARY KEY,\r
-       domainName VARCHAR(255) NOT NULL,\r
-       domainPath VARCHAR(255) NOT NULL DEFAULT '/',\r
-       groupID INT(10),\r
-       isPrimary TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_application_group;\r
-CREATE TABLE wcf1_application_group (\r
-       groupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       groupName VARCHAR(255) NOT NULL\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cache_resource;\r
-CREATE TABLE wcf1_cache_resource (\r
-       cacheResource VARCHAR(255) NOT NULL PRIMARY KEY\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cleanup_listener;\r
-CREATE TABLE wcf1_cleanup_listener (\r
-       listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       className VARCHAR(255) NOT NULL DEFAULT '',\r
-       objectType VARCHAR(255) NOT NULL DEFAULT '',\r
-       lastUpdateTime INT(10) NOT NULL DEFAULT 0,\r
-       UNIQUE KEY (className, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cleanup_log;\r
-CREATE TABLE wcf1_cleanup_log (\r
-       packageID INT(10) NOT NULL DEFAULT 0,\r
-       objectType VARCHAR(255) NOT NULL DEFAULT '',\r
-       objectID INT(10) NOT NULL DEFAULT 0,\r
-       deleteTime INT(10) NOT NULL DEFAULT 0,\r
-       KEY objectType (objectType)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_core_object;\r
-CREATE TABLE wcf1_core_object (\r
-       objectID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       objectName VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY object (packageID, objectName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cronjob;\r
-CREATE TABLE wcf1_cronjob (\r
-       cronjobID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       className varchar(255) NOT NULL DEFAULT '',\r
-       packageID INT(10) NOT NULL,\r
-       description varchar(255) NOT NULL DEFAULT '',\r
-       startMinute varchar(255) NOT NULL DEFAULT '*',\r
-       startHour varchar(255) NOT NULL DEFAULT '*',\r
-       startDom varchar(255) NOT NULL DEFAULT '*',\r
-       startMonth varchar(255) NOT NULL DEFAULT '*',\r
-       startDow varchar(255) NOT NULL DEFAULT '*',\r
-       lastExec INT(10) NOT NULL DEFAULT 0,\r
-       nextExec INT(10) NOT NULL DEFAULT 0,\r
-       afterNextExec INT(10) NOT NULL DEFAULT 0,\r
-       active TINYINT NOT NULL DEFAULT 1,\r
-       canBeEdited TINYINT NOT NULL DEFAULT 1,\r
-       canBeDisabled TINYINT NOT NULL DEFAULT 1,\r
-       state TINYINT(1) NOT NULL DEFAULT 1,\r
-       failCount TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cronjob_log;\r
-CREATE TABLE wcf1_cronjob_log (\r
-       cronjobLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       cronjobID INT(10) NOT NULL,\r
-       execTime INT(10) NOT NULL DEFAULT 0,\r
-       success TINYINT NOT NULL DEFAULT 0,\r
-       error TEXT\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_event_listener;\r
-CREATE TABLE wcf1_event_listener (\r
-       listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       eventClassName VARCHAR(80) NOT NULL DEFAULT '',\r
-       eventName VARCHAR(50) NOT NULL DEFAULT '',\r
-       listenerClassName VARCHAR(200) NOT NULL DEFAULT '',\r
-       inherit TINYINT(1) NOT NULL DEFAULT 0,\r
-       niceValue TINYINT(3) NOT NULL DEFAULT 0,\r
-       UNIQUE KEY packageID (packageID, eventClassName, eventName, listenerClassName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language;\r
-CREATE TABLE wcf1_language (\r
-       languageID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       languageCode VARCHAR(20) NOT NULL DEFAULT '',\r
-       isDefault TINYINT(1) NOT NULL DEFAULT 0,\r
-       hasContent TINYINT(1) NOT NULL DEFAULT 0,\r
-       UNIQUE KEY languageCode (languageCode)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language_category;\r
-CREATE TABLE wcf1_language_category (\r
-       languageCategoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       languageCategory VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY languageCategory (languageCategory)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language_item;\r
-CREATE TABLE wcf1_language_item (\r
-       languageItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       languageID INT(10) NOT NULL,\r
-       languageItem VARCHAR(255) NOT NULL DEFAULT '',\r
-       languageItemValue MEDIUMTEXT NOT NULL,\r
-       languageCustomItemValue MEDIUMTEXT,\r
-       languageUseCustomValue TINYINT(1) NOT NULL DEFAULT 0,\r
-       languageItemOriginIsSystem TINYINT(1) NOT NULL DEFAULT 1,\r
-       languageCategoryID INT(10) NOT NULL,\r
-       packageID INT(10),\r
-       UNIQUE KEY languageItem (languageItem, packageID, languageID),\r
-       KEY languageItemOriginIsSystem (languageItemOriginIsSystem)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language_server;\r
-CREATE TABLE wcf1_language_server (\r
-       languageServerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       serverURL VARCHAR(255) NOT NULL DEFAULT '',\r
-       disabled TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language_to_package;\r
-CREATE TABLE wcf1_language_to_package (\r
-       languageID INT(10) NOT NULL,\r
-       packageID INT(10),\r
-       UNIQUE KEY languageID (languageID, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_option;\r
-CREATE TABLE wcf1_option (\r
-       optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       optionName VARCHAR(255) NOT NULL DEFAULT '',\r
-       categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       optionType VARCHAR(255) NOT NULL DEFAULT '',\r
-       optionValue MEDIUMTEXT,\r
-       validationPattern TEXT,\r
-       selectOptions MEDIUMTEXT,\r
-       enableOptions MEDIUMTEXT,\r
-       showOrder INT(10) NOT NULL DEFAULT 0,\r
-       hidden TINYINT(1) NOT NULL DEFAULT 0,\r
-       permissions TEXT,\r
-       options TEXT,\r
-       additionalData MEDIUMTEXT,\r
-       UNIQUE KEY optionName (optionName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_option_category;\r
-CREATE TABLE wcf1_option_category (\r
-       categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       showOrder INT(10) NOT NULL DEFAULT 0,\r
-       permissions TEXT,\r
-       options TEXT,\r
-       UNIQUE KEY categoryName (categoryName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package;\r
-CREATE TABLE wcf1_package (\r
-       packageID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       package VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageDir VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageName VARCHAR(255) NOT NULL DEFAULT '',\r
-       instanceName VARCHAR(255) NOT NULL DEFAULT '',\r
-       instanceNo INT(10) NOT NULL DEFAULT 1,\r
-       packageDescription VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageVersion VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageDate INT(10) NOT NULL DEFAULT 0,\r
-       installDate INT(10) NOT NULL DEFAULT 0,\r
-       updateDate INT(10) NOT NULL DEFAULT 0,\r
-       packageURL VARCHAR(255) NOT NULL DEFAULT '',\r
-       parentPackageID INT(10) NOT NULL DEFAULT 0,\r
-       isUnique TINYINT(1) NOT NULL DEFAULT 0,\r
-       standalone TINYINT(1) NOT NULL DEFAULT 0,\r
-       author VARCHAR(255) NOT NULL DEFAULT '',\r
-       authorURL VARCHAR(255) NOT NULL DEFAULT '',\r
-       KEY package (package)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_dependency;\r
-CREATE TABLE wcf1_package_dependency (\r
-       packageID INT(10) NOT NULL,\r
-       dependency INT(10) NOT NULL,\r
-       priority INT(10) NOT NULL DEFAULT 0,\r
-       UNIQUE KEY packageID (packageID, dependency)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_exclusion;\r
-CREATE TABLE wcf1_package_exclusion (\r
-       packageID INT(10) NOT NULL,\r
-       excludedPackage VARCHAR(255) NOT NULL DEFAULT '',\r
-       excludedPackageVersion VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY packageID (packageID, excludedPackage)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_file_log;\r
-CREATE TABLE wcf1_package_installation_file_log (\r
-       packageID INT(10),\r
-       filename VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY packageID (packageID, filename)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_form;\r
-CREATE TABLE wcf1_package_installation_form (\r
-       queueID INT(10) NOT NULL,\r
-       formName VARCHAR(80) NOT NULL DEFAULT '',\r
-       document TEXT NOT NULL,\r
-       UNIQUE KEY formDocument (queueID, formName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_node;\r
-CREATE TABLE wcf1_package_installation_node (\r
-       queueID INT(10) NOT NULL,\r
-       processNo INT(10) NOT NULL DEFAULT 0,\r
-       sequenceNo SMALLINT(4) NOT NULL DEFAULT 0,\r
-       node CHAR(8) NOT NULL DEFAULT '',\r
-       parentNode CHAR(8) NOT NULL DEFAULT '',\r
-       nodeType ENUM('package', 'pip') NOT NULL DEFAULT 'package',\r
-       nodeData TEXT NOT NULL,\r
-       done TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_plugin;\r
-CREATE TABLE wcf1_package_installation_plugin (\r
-       pluginName VARCHAR(255) NOT NULL PRIMARY KEY,\r
-       packageID INT(10),\r
-       priority TINYINT(1) NOT NULL DEFAULT 0,\r
-       className VARCHAR(255) NOT NULL\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_queue;\r
-CREATE TABLE wcf1_package_installation_queue (\r
-       queueID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       parentQueueID INT(10) NOT NULL DEFAULT 0,\r
-       processNo INT(10) NOT NULL DEFAULT 0,\r
-       userID INT(10) NOT NULL,\r
-       package VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageName VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageID INT(10),\r
-       archive VARCHAR(255) NOT NULL DEFAULT '',\r
-       action ENUM('install', 'update', 'uninstall', 'rollback') NOT NULL DEFAULT 'install',\r
-       cancelable TINYINT(1) NOT NULL DEFAULT 1,\r
-       done TINYINT(1) NOT NULL DEFAULT 0,\r
-       confirmInstallation TINYINT(1) NOT NULL DEFAULT 0,\r
-       packageType ENUM('default', 'requirement', 'optional') NOT NULL DEFAULT 'default'\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_sql_log;\r
-CREATE TABLE wcf1_package_installation_sql_log ( \r
-       packageID INT(10), \r
-       sqlTable VARCHAR(100) NOT NULL DEFAULT '', \r
-       sqlColumn VARCHAR(100) NOT NULL DEFAULT '', \r
-       sqlIndex VARCHAR(100) NOT NULL DEFAULT '',\r
-       UNIQUE KEY packageID (packageID, sqlTable, sqlColumn, sqlIndex) \r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_requirement;\r
-CREATE TABLE wcf1_package_requirement (\r
-       packageID INT(10) NOT NULL,\r
-       requirement INT(10) NOT NULL,\r
-       UNIQUE KEY packageID (packageID, requirement)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_requirement_map;\r
-CREATE TABLE wcf1_package_requirement_map (\r
-       packageID INT(10) NOT NULL,\r
-       requirement INT(10) NOT NULL,\r
-       level INT(10) NOT NULL DEFAULT 0,\r
-       UNIQUE KEY packageID (packageID, requirement)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update;\r
-CREATE TABLE wcf1_package_update (\r
-       packageUpdateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageUpdateServerID INT(10) NOT NULL,\r
-       package VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageName VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageDescription VARCHAR(255) NOT NULL DEFAULT '',\r
-       author VARCHAR(255) NOT NULL DEFAULT '',\r
-       authorURL VARCHAR(255) NOT NULL DEFAULT '',\r
-       standalone TINYINT(1) NOT NULL DEFAULT 0,\r
-       plugin VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY packageUpdateServerID (packageUpdateServerID, package)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_exclusion;\r
-CREATE TABLE wcf1_package_update_exclusion (\r
-       packageUpdateVersionID INT(10) NOT NULL,\r
-       excludedPackage VARCHAR(255) NOT NULL DEFAULT '',\r
-       excludedPackageVersion VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, excludedPackage)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_fromversion;\r
-CREATE TABLE wcf1_package_update_fromversion (\r
-       packageUpdateVersionID INT(10) NOT NULL DEFAULT 0,\r
-       fromversion VARCHAR(50) NOT NULL DEFAULT '',\r
-       UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, fromversion)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_requirement;\r
-CREATE TABLE wcf1_package_update_requirement (\r
-       packageUpdateVersionID INT(10) NOT NULL,\r
-       package VARCHAR(255) NOT NULL DEFAULT '',\r
-       minversion VARCHAR(50) NOT NULL DEFAULT '',\r
-       UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, package)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_server;\r
-CREATE TABLE wcf1_package_update_server (\r
-       packageUpdateServerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       serverURL VARCHAR(255) NOT NULL DEFAULT '',\r
-       loginUsername VARCHAR(255) NOT NULL DEFAULT '',\r
-       loginPassword VARCHAR(255) NOT NULL DEFAULT '',\r
-       disabled TINYINT(1) NOT NULL DEFAULT 0,\r
-       lastUpdateTime INT(10) NOT NULL DEFAULT 0,\r
-       status ENUM('online', 'offline') NOT NULL DEFAULT 'online',\r
-       errorMessage TEXT\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_version;\r
-CREATE TABLE wcf1_package_update_version (\r
-       packageUpdateVersionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageUpdateID INT(10) NOT NULL,\r
-       packageVersion VARCHAR(50) NOT NULL DEFAULT '',\r
-       updateType VARCHAR(10) NOT NULL DEFAULT '',\r
-       packageDate INT(10) NOT NULL DEFAULT 0,\r
-       filename VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY packageUpdateID (packageUpdateID, packageVersion)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_page_location;\r
-CREATE TABLE wcf1_page_location (\r
-       locationID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       locationPattern VARCHAR(255) NOT NULL DEFAULT '',\r
-       locationName VARCHAR(255) NOT NULL DEFAULT '',\r
-       packageID INT(10) NOT NULL,\r
-       className varchar(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY (packageID, locationName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_page_menu_item;\r
-CREATE TABLE wcf1_page_menu_item (\r
-       menuItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       menuItem VARCHAR(255) NOT NULL DEFAULT '',\r
-       parentMenuItem VARCHAR(255) NOT NULL DEFAULT '',\r
-       menuItemLink VARCHAR(255) NOT NULL DEFAULT '',\r
-       menuPosition ENUM('header', 'footer') NOT NULL DEFAULT 'header',\r
-       showOrder INT(10) NOT NULL DEFAULT 0,\r
-       permissions TEXT NULL,\r
-       options TEXT NULL,\r
-       isDisabled TINYINT(1) NOT NULL DEFAULT 0,\r
-       className VARCHAR(255) NOT NULL DEFAULT '',\r
-       UNIQUE KEY (packageID, menuItem)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_search;\r
-CREATE TABLE wcf1_search (\r
-       searchID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       userID INT(10),\r
-       searchData MEDIUMTEXT NOT NULL,\r
-       searchTime INT(10) NOT NULL DEFAULT 0,\r
-       searchType VARCHAR(255) NOT NULL DEFAULT '',\r
-       searchHash CHAR(40) NOT NULL DEFAULT '',\r
-       KEY searchHash (searchHash)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_session;\r
-CREATE TABLE wcf1_session (\r
-       sessionID CHAR(40) NOT NULL PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       userID INT(10),\r
-       ipAddress VARCHAR(39) NOT NULL DEFAULT '',\r
-       userAgent VARCHAR(255) NOT NULL DEFAULT '',\r
-       lastActivityTime INT(10) NOT NULL DEFAULT 0,\r
-       requestURI VARCHAR(255) NOT NULL DEFAULT '',\r
-       requestMethod VARCHAR(4) NOT NULL DEFAULT '',\r
-       username VARCHAR(255) NOT NULL DEFAULT '',\r
-       spiderID INT(10) NOT NULL DEFAULT 0,\r
-       KEY packageID (packageID, lastActivityTime, spiderID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_session_data;\r
-CREATE TABLE wcf1_session_data (\r
-       sessionID CHAR(40) NOT NULL PRIMARY KEY,\r
-       sessionVariables MEDIUMTEXT\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_spider;\r
-CREATE TABLE wcf1_spider (\r
-       spiderID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       spiderIdentifier VARCHAR(255) DEFAULT '',\r
-       spiderName VARCHAR(255) DEFAULT '',\r
-       spiderURL VARCHAR(255) DEFAULT '',\r
-       UNIQUE KEY spiderIdentifier (spiderIdentifier)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_style;\r
-CREATE TABLE wcf1_style (\r
-       styleID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       styleName VARCHAR(255) NOT NULL DEFAULT '',\r
-       templateGroupID INT(10) NOT NULL DEFAULT 0,\r
-       isDefault TINYINT(1) NOT NULL DEFAULT 0,\r
-       disabled TINYINT(1) NOT NULL DEFAULT 0,\r
-       styleDescription TEXT,\r
-       styleVersion VARCHAR(255) NOT NULL DEFAULT '',\r
-       styleDate CHAR(10) NOT NULL DEFAULT '0000-00-00',\r
-       image VARCHAR(255) NOT NULL DEFAULT '',\r
-       copyright VARCHAR(255) NOT NULL DEFAULT '',\r
-       license VARCHAR(255) NOT NULL DEFAULT '',\r
-       authorName VARCHAR(255) NOT NULL DEFAULT '',\r
-       authorURL VARCHAR(255) NOT NULL DEFAULT ''\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_style_to_package;\r
-CREATE TABLE wcf1_style_to_package (\r
-       styleID INT(10) NOT NULL,\r
-       packageID INT(10) NOT NULL,\r
-       isDefault TINYINT(1) NOT NULL DEFAULT 0,\r
-       disabled TINYINT(1) NOT NULL DEFAULT 0,\r
-       UNIQUE KEY (styleID, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_style_variable;\r
-CREATE TABLE wcf1_style_variable (\r
-       styleID INT(10) NOT NULL,\r
-       variableName VARCHAR(50) NOT NULL DEFAULT '',\r
-       variableValue MEDIUMTEXT,\r
-       UNIQUE KEY (styleID, variableName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_style_variable_to_attribute;\r
-CREATE TABLE wcf1_style_variable_to_attribute (\r
-       packageID INT(10) NOT NULL,\r
-       cssSelector VARCHAR(200) NOT NULL DEFAULT '',\r
-       attributeName VARCHAR(50) NOT NULL DEFAULT '',\r
-       variableName VARCHAR(50) NOT NULL DEFAULT '',\r
-       UNIQUE KEY (packageID, cssSelector, attributeName, variableName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_template;\r
-CREATE TABLE wcf1_template (\r
-       templateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       templateName VARCHAR(255) NOT NULL DEFAULT '',\r
-       templateGroupID INT(10),\r
-       obsolete TINYINT(1) NOT NULL DEFAULT 0,\r
-       KEY packageID (packageID, templateName),\r
-       KEY templateGroupID (packageID, templateGroupID, templateName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_template_group;\r
-CREATE TABLE wcf1_template_group (\r
-       templateGroupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       parentTemplateGroupID INT(10) NOT NULL DEFAULT 0,\r
-       templateGroupName VARCHAR(255) NOT NULL DEFAULT '',\r
-       templateGroupFolderName VARCHAR(255) NOT NULL DEFAULT ''\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user;\r
-CREATE TABLE wcf1_user (\r
-       userID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       username VARCHAR(255) NOT NULL DEFAULT '',\r
-       email VARCHAR(255) NOT NULL DEFAULT '',\r
-       password VARCHAR(40) NOT NULL DEFAULT '',\r
-       salt VARCHAR(40) NOT NULL DEFAULT '',\r
-       languageID INT(10) NOT NULL DEFAULT 0,\r
-       registrationDate INT(10) NOT NULL DEFAULT 0,\r
-       styleID INT(10) NOT NULL DEFAULT 0,\r
-       \r
-       KEY username (username),\r
-       KEY registrationDate (registrationDate),\r
-       KEY styleID (styleID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_group;\r
-CREATE TABLE wcf1_user_group (\r
-       groupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       groupName VARCHAR(255) NOT NULL DEFAULT '',\r
-       groupType TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_group_option;\r
-CREATE TABLE wcf1_user_group_option  (\r
-       optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10),\r
-       optionName VARCHAR(255) NOT NULL DEFAULT '',\r
-       categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       optionType VARCHAR(255) NOT NULL DEFAULT '',\r
-       defaultValue MEDIUMTEXT,\r
-       adminDefaultValue MEDIUMTEXT,\r
-       validationPattern TEXT,\r
-       enableOptions MEDIUMTEXT,\r
-       showOrder INT(10) NOT NULL DEFAULT 0,\r
-       permissions TEXT,\r
-       options TEXT,\r
-       additionalData MEDIUMTEXT,\r
-       UNIQUE KEY optionName (optionName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_group_option_category;\r
-CREATE TABLE wcf1_user_group_option_category (\r
-       categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       showOrder INT(10) NOT NULL DEFAULT 0,\r
-       permissions TEXT,\r
-       options TEXT,\r
-       UNIQUE KEY categoryName (categoryName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_group_option_value;\r
-CREATE TABLE wcf1_user_group_option_value  (\r
-       groupID INT(10) NOT NULL,\r
-       optionID INT(10) NOT NULL,\r
-       optionValue MEDIUMTEXT NOT NULL,\r
-       UNIQUE KEY groupID (groupID, optionID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_option;\r
-CREATE TABLE wcf1_user_option (\r
-       optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       optionName VARCHAR(255) NOT NULL DEFAULT '',\r
-       categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       optionType VARCHAR(255) NOT NULL DEFAULT '',\r
-       defaultValue MEDIUMTEXT,\r
-       validationPattern TEXT,\r
-       selectOptions MEDIUMTEXT,\r
-       enableOptions MEDIUMTEXT,\r
-       required TINYINT(1) NOT NULL DEFAULT 0,\r
-       askDuringRegistration TINYINT(1) NOT NULL DEFAULT 0,\r
-       editable TINYINT(1) NOT NULL DEFAULT 0, \r
-       visible TINYINT(1) NOT NULL DEFAULT 0, \r
-       outputClass VARCHAR(255) NOT NULL DEFAULT '',\r
-       searchable TINYINT(1) NOT NULL DEFAULT 0,\r
-       showOrder INT(10) NOT NULL DEFAULT 0,\r
-       disabled TINYINT(1) NOT NULL DEFAULT 0,\r
-       permissions TEXT,\r
-       options TEXT,\r
-       additionalData MEDIUMTEXT,\r
-       UNIQUE KEY optionName (optionName, packageID),\r
-       KEY categoryName (categoryName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_option_category;\r
-CREATE TABLE wcf1_user_option_category (\r
-       categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       categoryIconS VARCHAR(255) NOT NULL DEFAULT '',\r
-       categoryIconM VARCHAR(255) NOT NULL DEFAULT '',\r
-       parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',\r
-       showOrder INT(10) NOT NULL DEFAULT 0,\r
-       permissions TEXT,\r
-       options TEXT,\r
-       UNIQUE KEY categoryName (categoryName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_option_value;\r
-CREATE TABLE wcf1_user_option_value (\r
-       userID INT(10) NOT NULL PRIMARY KEY\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_to_group;\r
-CREATE TABLE wcf1_user_to_group (\r
-       userID INT(10) NOT NULL,\r
-       groupID INT(10) NOT NULL,\r
-       UNIQUE KEY userID (userID, groupID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_to_language;\r
-CREATE TABLE wcf1_user_to_language (\r
-       userID INT(10) NOT NULL,\r
-       languageID INT(10) NOT NULL,\r
-       UNIQUE KEY userID (userID, languageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_template_listener;\r
-CREATE TABLE wcf1_template_listener (\r
-       listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
-       packageID INT(10) NOT NULL,\r
-       name VARCHAR(80) NOT NULL DEFAULT '',\r
-       environment ENUM('user','admin') NOT NULL DEFAULT 'user',\r
-       templateName VARCHAR(80) NOT NULL DEFAULT '',\r
-       eventName VARCHAR(50) NOT NULL DEFAULT '',\r
-       templateCode TEXT NOT NULL,\r
-       KEY templateName (environment, templateName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_storage;\r
-CREATE TABLE wcf1_storage (\r
-       userID INT(10) NOT NULL,\r
-       field VARCHAR(80) NOT NULL DEFAULT '',\r
-       fieldValue TEXT,\r
-       packageID INT(10),\r
-       UNIQUE KEY storageData (userID, field, packageID)\r
-);\r
-\r
-/**** foreign keys ****/\r
-ALTER TABLE wcf1_acp_menu_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_acp_session ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_acp_session ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_acp_session_access_log ADD FOREIGN KEY (sessionLogID) REFERENCES wcf1_acp_session_log (sessionLogID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_acp_session_access_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE SET NULL;\r
-\r
-ALTER TABLE wcf1_acp_session_data ADD FOREIGN KEY (sessionID) REFERENCES wcf1_acp_session (sessionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_acp_session_log ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE SET NULL;\r
-\r
-ALTER TABLE wcf1_acp_template ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_application ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_application ADD FOREIGN KEY (groupID) REFERENCES wcf1_application_group (groupID) ON DELETE SET NULL;\r
-\r
-ALTER TABLE wcf1_cleanup_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_cleanup_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_core_object ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_cronjob ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_cronjob_log ADD FOREIGN KEY (cronjobID) REFERENCES wcf1_cronjob (cronjobID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_event_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_language_item ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_language_item ADD FOREIGN KEY (languageCategoryID) REFERENCES wcf1_language_category (languageCategoryID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_language_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_language_to_package ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_language_to_package ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_dependency ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_package_dependency ADD FOREIGN KEY (dependency) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_exclusion ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_file_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_form ADD FOREIGN KEY (queueID) REFERENCES wcf1_package_installation_queue (queueID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_node ADD FOREIGN KEY (queueID) REFERENCES wcf1_package_installation_queue (queueID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_plugin ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_queue ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_package_installation_queue ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE SET NULL;\r
-\r
-ALTER TABLE wcf1_package_installation_sql_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_requirement ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_package_requirement ADD FOREIGN KEY (requirement) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_requirement_map ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_package_requirement_map ADD FOREIGN KEY (requirement) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update ADD FOREIGN KEY (packageUpdateServerID) REFERENCES wcf1_package_update_server (packageUpdateServerID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update_exclusion ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update_fromversion ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update_requirement ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update_version ADD FOREIGN KEY (packageUpdateID) REFERENCES wcf1_package_update (packageUpdateID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_page_location ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_page_menu_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_search ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_session ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_session ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_session_data ADD FOREIGN KEY (sessionID) REFERENCES wcf1_session (sessionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_storage ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_storage ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_style ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_style_to_package ADD FOREIGN KEY (styleID) REFERENCES wcf1_style (styleID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_style_to_package ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_style_variable ADD FOREIGN KEY (styleID) REFERENCES wcf1_style (styleID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_style_variable_to_attribute ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_template ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_template ADD FOREIGN KEY (templateGroupID) REFERENCES wcf1_template_group (templateGroupID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_template_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_group_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_group_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_group_option_value ADD FOREIGN KEY (groupID) REFERENCES wcf1_user_group (groupID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_user_group_option_value ADD FOREIGN KEY (optionID) REFERENCES wcf1_user_group_option (optionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_option_value ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_to_group ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_user_to_group ADD FOREIGN KEY (groupID) REFERENCES wcf1_user_group (groupID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_to_language ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_user_to_language ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;\r
-\r
-/**** default inserts ****/\r
--- default user groups\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Everyone', 1);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Guests', 2);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Users', 3);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Administrators', 4);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Moderators', 4);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Super Moderators', 4);\r
-               \r
--- default user group options\r
-INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.general.canUseAcp', 'admin.general', 'boolean', '0', '1', 1);\r
-INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.system.package.canInstallPackage', 'admin.system.package', 'boolean', '0', '1', 1);\r
-INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.user.canEditGroup', 'admin.user.group', 'boolean', '0', '1', 1);\r
-\r
--- default user group option values\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 1, '0');  -- Everyone\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 2, '0');  -- Everyone\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 3, '0');  -- Everyone\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 1, '1');  -- Administrators\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 2, '1');  -- Administrators\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 3, '1');  -- Administrators\r
-               \r
--- default update servers\r
-INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://update.woltlab.com/tempest/', 'online', 0, NULL, 0, '', '');\r
-INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://update.woltlab.com/maelstrom/', 'online', 0, NULL, 0, '', '');\r
-INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://store.woltlab.com/tempest/', 'online', 0, NULL, 0, '', '');\r
-INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://store.woltlab.com/maelstrom/', 'online', 0, NULL, 0, '', '');\r
+/**** tables ****/
+DROP TABLE IF EXISTS wcf1_acp_menu_item;
+CREATE TABLE wcf1_acp_menu_item (
+       menuItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       menuItem VARCHAR(255) NOT NULL DEFAULT '',
+       parentMenuItem VARCHAR(255) NOT NULL DEFAULT '',
+       menuItemLink VARCHAR(255) NOT NULL DEFAULT '',
+       showOrder INT(10) NOT NULL DEFAULT 0,
+       permissions TEXT,
+       options TEXT,
+       UNIQUE KEY menuItem (menuItem, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_acp_session;
+CREATE TABLE wcf1_acp_session (
+       sessionID CHAR(40) NOT NULL PRIMARY KEY,
+       packageID INT(10),
+       userID INT(10),
+       ipAddress VARCHAR(39) NOT NULL DEFAULT '',
+       userAgent VARCHAR(255) NOT NULL DEFAULT '',
+       lastActivityTime INT(10) NOT NULL DEFAULT 0,
+       requestURI VARCHAR(255) NOT NULL DEFAULT '',
+       requestMethod VARCHAR(4) NOT NULL DEFAULT '',
+       username VARCHAR(255) NOT NULL DEFAULT '',
+       KEY sessionID (sessionID, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_acp_session_data;
+CREATE TABLE wcf1_acp_session_data (
+       sessionID CHAR(40) NOT NULL PRIMARY KEY,
+       sessionVariables MEDIUMTEXT
+);
+
+DROP TABLE IF EXISTS wcf1_acp_session_access_log;
+CREATE TABLE wcf1_acp_session_access_log (
+       sessionAccessLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       sessionLogID INT(10) NOT NULL,
+       packageID INT(10),
+       ipAddress VARCHAR(39) NOT NULL DEFAULT '',
+       time INT(10) NOT NULL DEFAULT 0,
+       requestURI VARCHAR(255) NOT NULL DEFAULT '',
+       requestMethod VARCHAR(4) NOT NULL DEFAULT '',
+       className VARCHAR(255) NOT NULL DEFAULT '',
+       KEY sessionLogID (sessionLogID)
+);
+
+DROP TABLE IF EXISTS wcf1_acp_session_log;
+CREATE TABLE wcf1_acp_session_log (
+       sessionLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       sessionID CHAR(40) NOT NULL DEFAULT '',
+       userID INT(10),
+       ipAddress VARCHAR(39) NOT NULL DEFAULT '',
+       hostname VARCHAR(255) NOT NULL DEFAULT '',
+       userAgent VARCHAR(255) NOT NULL DEFAULT '',
+       time INT(10) NOT NULL DEFAULT 0,
+       lastActivityTime INT(10) NOT NULL DEFAULT 0,
+       KEY sessionID (sessionID)
+);
+
+DROP TABLE IF EXISTS wcf1_acp_template;
+CREATE TABLE wcf1_acp_template (
+       templateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10),
+       templateName VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY (packageID, templateName)
+);
+
+DROP TABLE IF EXISTS wcf1_application;
+CREATE TABLE wcf1_application (
+       packageID INT(10) NOT NULL PRIMARY KEY,
+       domainName VARCHAR(255) NOT NULL,
+       domainPath VARCHAR(255) NOT NULL DEFAULT '/',
+       groupID INT(10),
+       isPrimary TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_application_group;
+CREATE TABLE wcf1_application_group (
+       groupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       groupName VARCHAR(255) NOT NULL
+);
+
+DROP TABLE IF EXISTS wcf1_cache_resource;
+CREATE TABLE wcf1_cache_resource (
+       cacheResource VARCHAR(255) NOT NULL PRIMARY KEY
+);
+
+DROP TABLE IF EXISTS wcf1_cleanup_listener;
+CREATE TABLE wcf1_cleanup_listener (
+       listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       className VARCHAR(255) NOT NULL DEFAULT '',
+       objectType VARCHAR(255) NOT NULL DEFAULT '',
+       lastUpdateTime INT(10) NOT NULL DEFAULT 0,
+       UNIQUE KEY (className, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_cleanup_log;
+CREATE TABLE wcf1_cleanup_log (
+       packageID INT(10) NOT NULL DEFAULT 0,
+       objectType VARCHAR(255) NOT NULL DEFAULT '',
+       objectID INT(10) NOT NULL DEFAULT 0,
+       deleteTime INT(10) NOT NULL DEFAULT 0,
+       KEY objectType (objectType)
+);
+
+DROP TABLE IF EXISTS wcf1_core_object;
+CREATE TABLE wcf1_core_object (
+       objectID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       objectName VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY object (packageID, objectName)
+);
+
+DROP TABLE IF EXISTS wcf1_cronjob;
+CREATE TABLE wcf1_cronjob (
+       cronjobID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       className varchar(255) NOT NULL DEFAULT '',
+       packageID INT(10) NOT NULL,
+       description varchar(255) NOT NULL DEFAULT '',
+       startMinute varchar(255) NOT NULL DEFAULT '*',
+       startHour varchar(255) NOT NULL DEFAULT '*',
+       startDom varchar(255) NOT NULL DEFAULT '*',
+       startMonth varchar(255) NOT NULL DEFAULT '*',
+       startDow varchar(255) NOT NULL DEFAULT '*',
+       lastExec INT(10) NOT NULL DEFAULT 0,
+       nextExec INT(10) NOT NULL DEFAULT 0,
+       afterNextExec INT(10) NOT NULL DEFAULT 0,
+       active TINYINT NOT NULL DEFAULT 1,
+       canBeEdited TINYINT NOT NULL DEFAULT 1,
+       canBeDisabled TINYINT NOT NULL DEFAULT 1,
+       state TINYINT(1) NOT NULL DEFAULT 1,
+       failCount TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_cronjob_log;
+CREATE TABLE wcf1_cronjob_log (
+       cronjobLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       cronjobID INT(10) NOT NULL,
+       execTime INT(10) NOT NULL DEFAULT 0,
+       success TINYINT NOT NULL DEFAULT 0,
+       error TEXT
+);
+
+DROP TABLE IF EXISTS wcf1_event_listener;
+CREATE TABLE wcf1_event_listener (
+       listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       eventClassName VARCHAR(80) NOT NULL DEFAULT '',
+       eventName VARCHAR(50) NOT NULL DEFAULT '',
+       listenerClassName VARCHAR(200) NOT NULL DEFAULT '',
+       inherit TINYINT(1) NOT NULL DEFAULT 0,
+       niceValue TINYINT(3) NOT NULL DEFAULT 0,
+       UNIQUE KEY packageID (packageID, eventClassName, eventName, listenerClassName)
+);
+
+DROP TABLE IF EXISTS wcf1_language;
+CREATE TABLE wcf1_language (
+       languageID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       languageCode VARCHAR(20) NOT NULL DEFAULT '',
+       isDefault TINYINT(1) NOT NULL DEFAULT 0,
+       hasContent TINYINT(1) NOT NULL DEFAULT 0,
+       UNIQUE KEY languageCode (languageCode)
+);
+
+DROP TABLE IF EXISTS wcf1_language_category;
+CREATE TABLE wcf1_language_category (
+       languageCategoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       languageCategory VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY languageCategory (languageCategory)
+);
+
+DROP TABLE IF EXISTS wcf1_language_item;
+CREATE TABLE wcf1_language_item (
+       languageItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       languageID INT(10) NOT NULL,
+       languageItem VARCHAR(255) NOT NULL DEFAULT '',
+       languageItemValue MEDIUMTEXT NOT NULL,
+       languageCustomItemValue MEDIUMTEXT,
+       languageUseCustomValue TINYINT(1) NOT NULL DEFAULT 0,
+       languageItemOriginIsSystem TINYINT(1) NOT NULL DEFAULT 1,
+       languageCategoryID INT(10) NOT NULL,
+       packageID INT(10),
+       UNIQUE KEY languageItem (languageItem, packageID, languageID),
+       KEY languageItemOriginIsSystem (languageItemOriginIsSystem)
+);
+
+DROP TABLE IF EXISTS wcf1_language_server;
+CREATE TABLE wcf1_language_server (
+       languageServerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       serverURL VARCHAR(255) NOT NULL DEFAULT '',
+       disabled TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_language_to_package;
+CREATE TABLE wcf1_language_to_package (
+       languageID INT(10) NOT NULL,
+       packageID INT(10),
+       UNIQUE KEY languageID (languageID, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_option;
+CREATE TABLE wcf1_option (
+       optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       optionName VARCHAR(255) NOT NULL DEFAULT '',
+       categoryName VARCHAR(255) NOT NULL DEFAULT '',
+       optionType VARCHAR(255) NOT NULL DEFAULT '',
+       optionValue MEDIUMTEXT,
+       validationPattern TEXT,
+       selectOptions MEDIUMTEXT,
+       enableOptions MEDIUMTEXT,
+       showOrder INT(10) NOT NULL DEFAULT 0,
+       hidden TINYINT(1) NOT NULL DEFAULT 0,
+       permissions TEXT,
+       options TEXT,
+       additionalData MEDIUMTEXT,
+       UNIQUE KEY optionName (optionName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_option_category;
+CREATE TABLE wcf1_option_category (
+       categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       categoryName VARCHAR(255) NOT NULL DEFAULT '',
+       parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',
+       showOrder INT(10) NOT NULL DEFAULT 0,
+       permissions TEXT,
+       options TEXT,
+       UNIQUE KEY categoryName (categoryName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_package;
+CREATE TABLE wcf1_package (
+       packageID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       package VARCHAR(255) NOT NULL DEFAULT '',
+       packageDir VARCHAR(255) NOT NULL DEFAULT '',
+       packageName VARCHAR(255) NOT NULL DEFAULT '',
+       instanceName VARCHAR(255) NOT NULL DEFAULT '',
+       instanceNo INT(10) NOT NULL DEFAULT 1,
+       packageDescription VARCHAR(255) NOT NULL DEFAULT '',
+       packageVersion VARCHAR(255) NOT NULL DEFAULT '',
+       packageDate INT(10) NOT NULL DEFAULT 0,
+       installDate INT(10) NOT NULL DEFAULT 0,
+       updateDate INT(10) NOT NULL DEFAULT 0,
+       packageURL VARCHAR(255) NOT NULL DEFAULT '',
+       parentPackageID INT(10) NOT NULL DEFAULT 0,
+       isUnique TINYINT(1) NOT NULL DEFAULT 0,
+       standalone TINYINT(1) NOT NULL DEFAULT 0,
+       author VARCHAR(255) NOT NULL DEFAULT '',
+       authorURL VARCHAR(255) NOT NULL DEFAULT '',
+       KEY package (package)
+);
+
+DROP TABLE IF EXISTS wcf1_package_dependency;
+CREATE TABLE wcf1_package_dependency (
+       packageID INT(10) NOT NULL,
+       dependency INT(10) NOT NULL,
+       priority INT(10) NOT NULL DEFAULT 0,
+       UNIQUE KEY packageID (packageID, dependency)
+);
+
+DROP TABLE IF EXISTS wcf1_package_exclusion;
+CREATE TABLE wcf1_package_exclusion (
+       packageID INT(10) NOT NULL,
+       excludedPackage VARCHAR(255) NOT NULL DEFAULT '',
+       excludedPackageVersion VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY packageID (packageID, excludedPackage)
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_file_log;
+CREATE TABLE wcf1_package_installation_file_log (
+       packageID INT(10),
+       filename VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY packageID (packageID, filename)
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_form;
+CREATE TABLE wcf1_package_installation_form (
+       queueID INT(10) NOT NULL,
+       formName VARCHAR(80) NOT NULL DEFAULT '',
+       document TEXT NOT NULL,
+       UNIQUE KEY formDocument (queueID, formName)
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_node;
+CREATE TABLE wcf1_package_installation_node (
+       queueID INT(10) NOT NULL,
+       processNo INT(10) NOT NULL DEFAULT 0,
+       sequenceNo SMALLINT(4) NOT NULL DEFAULT 0,
+       node CHAR(8) NOT NULL DEFAULT '',
+       parentNode CHAR(8) NOT NULL DEFAULT '',
+       nodeType ENUM('package', 'pip') NOT NULL DEFAULT 'package',
+       nodeData TEXT NOT NULL,
+       done TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_plugin;
+CREATE TABLE wcf1_package_installation_plugin (
+       pluginName VARCHAR(255) NOT NULL PRIMARY KEY,
+       packageID INT(10),
+       priority TINYINT(1) NOT NULL DEFAULT 0,
+       className VARCHAR(255) NOT NULL
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_queue;
+CREATE TABLE wcf1_package_installation_queue (
+       queueID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       parentQueueID INT(10) NOT NULL DEFAULT 0,
+       processNo INT(10) NOT NULL DEFAULT 0,
+       userID INT(10) NOT NULL,
+       package VARCHAR(255) NOT NULL DEFAULT '',
+       packageName VARCHAR(255) NOT NULL DEFAULT '',
+       packageID INT(10),
+       archive VARCHAR(255) NOT NULL DEFAULT '',
+       action ENUM('install', 'update', 'uninstall', 'rollback') NOT NULL DEFAULT 'install',
+       cancelable TINYINT(1) NOT NULL DEFAULT 1,
+       done TINYINT(1) NOT NULL DEFAULT 0,
+       confirmInstallation TINYINT(1) NOT NULL DEFAULT 0,
+       packageType ENUM('default', 'requirement', 'optional') NOT NULL DEFAULT 'default'
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_sql_log;
+CREATE TABLE wcf1_package_installation_sql_log ( 
+       packageID INT(10), 
+       sqlTable VARCHAR(100) NOT NULL DEFAULT '', 
+       sqlColumn VARCHAR(100) NOT NULL DEFAULT '', 
+       sqlIndex VARCHAR(100) NOT NULL DEFAULT '',
+       UNIQUE KEY packageID (packageID, sqlTable, sqlColumn, sqlIndex) 
+);
+
+DROP TABLE IF EXISTS wcf1_package_requirement;
+CREATE TABLE wcf1_package_requirement (
+       packageID INT(10) NOT NULL,
+       requirement INT(10) NOT NULL,
+       UNIQUE KEY packageID (packageID, requirement)
+);
+
+DROP TABLE IF EXISTS wcf1_package_requirement_map;
+CREATE TABLE wcf1_package_requirement_map (
+       packageID INT(10) NOT NULL,
+       requirement INT(10) NOT NULL,
+       level INT(10) NOT NULL DEFAULT 0,
+       UNIQUE KEY packageID (packageID, requirement)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update;
+CREATE TABLE wcf1_package_update (
+       packageUpdateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageUpdateServerID INT(10) NOT NULL,
+       package VARCHAR(255) NOT NULL DEFAULT '',
+       packageName VARCHAR(255) NOT NULL DEFAULT '',
+       packageDescription VARCHAR(255) NOT NULL DEFAULT '',
+       author VARCHAR(255) NOT NULL DEFAULT '',
+       authorURL VARCHAR(255) NOT NULL DEFAULT '',
+       standalone TINYINT(1) NOT NULL DEFAULT 0,
+       plugin VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY packageUpdateServerID (packageUpdateServerID, package)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_exclusion;
+CREATE TABLE wcf1_package_update_exclusion (
+       packageUpdateVersionID INT(10) NOT NULL,
+       excludedPackage VARCHAR(255) NOT NULL DEFAULT '',
+       excludedPackageVersion VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, excludedPackage)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_fromversion;
+CREATE TABLE wcf1_package_update_fromversion (
+       packageUpdateVersionID INT(10) NOT NULL DEFAULT 0,
+       fromversion VARCHAR(50) NOT NULL DEFAULT '',
+       UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, fromversion)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_requirement;
+CREATE TABLE wcf1_package_update_requirement (
+       packageUpdateVersionID INT(10) NOT NULL,
+       package VARCHAR(255) NOT NULL DEFAULT '',
+       minversion VARCHAR(50) NOT NULL DEFAULT '',
+       UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, package)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_server;
+CREATE TABLE wcf1_package_update_server (
+       packageUpdateServerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       serverURL VARCHAR(255) NOT NULL DEFAULT '',
+       loginUsername VARCHAR(255) NOT NULL DEFAULT '',
+       loginPassword VARCHAR(255) NOT NULL DEFAULT '',
+       disabled TINYINT(1) NOT NULL DEFAULT 0,
+       lastUpdateTime INT(10) NOT NULL DEFAULT 0,
+       status ENUM('online', 'offline') NOT NULL DEFAULT 'online',
+       errorMessage TEXT
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_version;
+CREATE TABLE wcf1_package_update_version (
+       packageUpdateVersionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageUpdateID INT(10) NOT NULL,
+       packageVersion VARCHAR(50) NOT NULL DEFAULT '',
+       updateType VARCHAR(10) NOT NULL DEFAULT '',
+       packageDate INT(10) NOT NULL DEFAULT 0,
+       filename VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY packageUpdateID (packageUpdateID, packageVersion)
+);
+
+DROP TABLE IF EXISTS wcf1_page_location;
+CREATE TABLE wcf1_page_location (
+       locationID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       locationPattern VARCHAR(255) NOT NULL DEFAULT '',
+       locationName VARCHAR(255) NOT NULL DEFAULT '',
+       packageID INT(10) NOT NULL,
+       className varchar(255) NOT NULL DEFAULT '',
+       UNIQUE KEY (packageID, locationName)
+);
+
+DROP TABLE IF EXISTS wcf1_page_menu_item;
+CREATE TABLE wcf1_page_menu_item (
+       menuItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       menuItem VARCHAR(255) NOT NULL DEFAULT '',
+       parentMenuItem VARCHAR(255) NOT NULL DEFAULT '',
+       menuItemLink VARCHAR(255) NOT NULL DEFAULT '',
+       menuPosition ENUM('header', 'footer') NOT NULL DEFAULT 'header',
+       showOrder INT(10) NOT NULL DEFAULT 0,
+       permissions TEXT NULL,
+       options TEXT NULL,
+       isDisabled TINYINT(1) NOT NULL DEFAULT 0,
+       className VARCHAR(255) NOT NULL DEFAULT '',
+       UNIQUE KEY (packageID, menuItem)
+);
+
+DROP TABLE IF EXISTS wcf1_search;
+CREATE TABLE wcf1_search (
+       searchID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       userID INT(10),
+       searchData MEDIUMTEXT NOT NULL,
+       searchTime INT(10) NOT NULL DEFAULT 0,
+       searchType VARCHAR(255) NOT NULL DEFAULT '',
+       searchHash CHAR(40) NOT NULL DEFAULT '',
+       KEY searchHash (searchHash)
+);
+
+DROP TABLE IF EXISTS wcf1_session;
+CREATE TABLE wcf1_session (
+       sessionID CHAR(40) NOT NULL PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       userID INT(10),
+       ipAddress VARCHAR(39) NOT NULL DEFAULT '',
+       userAgent VARCHAR(255) NOT NULL DEFAULT '',
+       lastActivityTime INT(10) NOT NULL DEFAULT 0,
+       requestURI VARCHAR(255) NOT NULL DEFAULT '',
+       requestMethod VARCHAR(4) NOT NULL DEFAULT '',
+       username VARCHAR(255) NOT NULL DEFAULT '',
+       spiderID INT(10) NOT NULL DEFAULT 0,
+       KEY packageID (packageID, lastActivityTime, spiderID)
+);
+
+DROP TABLE IF EXISTS wcf1_session_data;
+CREATE TABLE wcf1_session_data (
+       sessionID CHAR(40) NOT NULL PRIMARY KEY,
+       sessionVariables MEDIUMTEXT
+);
+
+DROP TABLE IF EXISTS wcf1_spider;
+CREATE TABLE wcf1_spider (
+       spiderID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       spiderIdentifier VARCHAR(255) DEFAULT '',
+       spiderName VARCHAR(255) DEFAULT '',
+       spiderURL VARCHAR(255) DEFAULT '',
+       UNIQUE KEY spiderIdentifier (spiderIdentifier)
+);
+
+DROP TABLE IF EXISTS wcf1_style;
+CREATE TABLE wcf1_style (
+       styleID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       styleName VARCHAR(255) NOT NULL DEFAULT '',
+       templateGroupID INT(10) NOT NULL DEFAULT 0,
+       isDefault TINYINT(1) NOT NULL DEFAULT 0,
+       disabled TINYINT(1) NOT NULL DEFAULT 0,
+       styleDescription TEXT,
+       styleVersion VARCHAR(255) NOT NULL DEFAULT '',
+       styleDate CHAR(10) NOT NULL DEFAULT '0000-00-00',
+       image VARCHAR(255) NOT NULL DEFAULT '',
+       copyright VARCHAR(255) NOT NULL DEFAULT '',
+       license VARCHAR(255) NOT NULL DEFAULT '',
+       authorName VARCHAR(255) NOT NULL DEFAULT '',
+       authorURL VARCHAR(255) NOT NULL DEFAULT ''
+);
+
+DROP TABLE IF EXISTS wcf1_style_to_package;
+CREATE TABLE wcf1_style_to_package (
+       styleID INT(10) NOT NULL,
+       packageID INT(10) NOT NULL,
+       isDefault TINYINT(1) NOT NULL DEFAULT 0,
+       disabled TINYINT(1) NOT NULL DEFAULT 0,
+       UNIQUE KEY (styleID, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_style_variable;
+CREATE TABLE wcf1_style_variable (
+       styleID INT(10) NOT NULL,
+       variableName VARCHAR(50) NOT NULL DEFAULT '',
+       variableValue MEDIUMTEXT,
+       UNIQUE KEY (styleID, variableName)
+);
+
+DROP TABLE IF EXISTS wcf1_style_variable_to_attribute;
+CREATE TABLE wcf1_style_variable_to_attribute (
+       packageID INT(10) NOT NULL,
+       cssSelector VARCHAR(200) NOT NULL DEFAULT '',
+       attributeName VARCHAR(50) NOT NULL DEFAULT '',
+       variableName VARCHAR(50) NOT NULL DEFAULT '',
+       UNIQUE KEY (packageID, cssSelector, attributeName, variableName)
+);
+
+DROP TABLE IF EXISTS wcf1_template;
+CREATE TABLE wcf1_template (
+       templateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       templateName VARCHAR(255) NOT NULL DEFAULT '',
+       templateGroupID INT(10),
+       obsolete TINYINT(1) NOT NULL DEFAULT 0,
+       KEY packageID (packageID, templateName),
+       KEY templateGroupID (packageID, templateGroupID, templateName)
+);
+
+DROP TABLE IF EXISTS wcf1_template_group;
+CREATE TABLE wcf1_template_group (
+       templateGroupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       parentTemplateGroupID INT(10) NOT NULL DEFAULT 0,
+       templateGroupName VARCHAR(255) NOT NULL DEFAULT '',
+       templateGroupFolderName VARCHAR(255) NOT NULL DEFAULT ''
+);
+
+DROP TABLE IF EXISTS wcf1_user;
+CREATE TABLE wcf1_user (
+       userID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       username VARCHAR(255) NOT NULL DEFAULT '',
+       email VARCHAR(255) NOT NULL DEFAULT '',
+       password VARCHAR(40) NOT NULL DEFAULT '',
+       salt VARCHAR(40) NOT NULL DEFAULT '',
+       languageID INT(10) NOT NULL DEFAULT 0,
+       registrationDate INT(10) NOT NULL DEFAULT 0,
+       styleID INT(10) NOT NULL DEFAULT 0,
+       
+       KEY username (username),
+       KEY registrationDate (registrationDate),
+       KEY styleID (styleID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_group;
+CREATE TABLE wcf1_user_group (
+       groupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       groupName VARCHAR(255) NOT NULL DEFAULT '',
+       groupType TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_user_group_option;
+CREATE TABLE wcf1_user_group_option  (
+       optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10),
+       optionName VARCHAR(255) NOT NULL DEFAULT '',
+       categoryName VARCHAR(255) NOT NULL DEFAULT '',
+       optionType VARCHAR(255) NOT NULL DEFAULT '',
+       defaultValue MEDIUMTEXT,
+       adminDefaultValue MEDIUMTEXT,
+       validationPattern TEXT,
+       enableOptions MEDIUMTEXT,
+       showOrder INT(10) NOT NULL DEFAULT 0,
+       permissions TEXT,
+       options TEXT,
+       additionalData MEDIUMTEXT,
+       UNIQUE KEY optionName (optionName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_group_option_category;
+CREATE TABLE wcf1_user_group_option_category (
+       categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       categoryName VARCHAR(255) NOT NULL DEFAULT '',
+       parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',
+       showOrder INT(10) NOT NULL DEFAULT 0,
+       permissions TEXT,
+       options TEXT,
+       UNIQUE KEY categoryName (categoryName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_group_option_value;
+CREATE TABLE wcf1_user_group_option_value  (
+       groupID INT(10) NOT NULL,
+       optionID INT(10) NOT NULL,
+       optionValue MEDIUMTEXT NOT NULL,
+       UNIQUE KEY groupID (groupID, optionID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_option;
+CREATE TABLE wcf1_user_option (
+       optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       optionName VARCHAR(255) NOT NULL DEFAULT '',
+       categoryName VARCHAR(255) NOT NULL DEFAULT '',
+       optionType VARCHAR(255) NOT NULL DEFAULT '',
+       defaultValue MEDIUMTEXT,
+       validationPattern TEXT,
+       selectOptions MEDIUMTEXT,
+       enableOptions MEDIUMTEXT,
+       required TINYINT(1) NOT NULL DEFAULT 0,
+       askDuringRegistration TINYINT(1) NOT NULL DEFAULT 0,
+       editable TINYINT(1) NOT NULL DEFAULT 0, 
+       visible TINYINT(1) NOT NULL DEFAULT 0, 
+       outputClass VARCHAR(255) NOT NULL DEFAULT '',
+       searchable TINYINT(1) NOT NULL DEFAULT 0,
+       showOrder INT(10) NOT NULL DEFAULT 0,
+       disabled TINYINT(1) NOT NULL DEFAULT 0,
+       permissions TEXT,
+       options TEXT,
+       additionalData MEDIUMTEXT,
+       UNIQUE KEY optionName (optionName, packageID),
+       KEY categoryName (categoryName)
+);
+
+DROP TABLE IF EXISTS wcf1_user_option_category;
+CREATE TABLE wcf1_user_option_category (
+       categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       categoryName VARCHAR(255) NOT NULL DEFAULT '',
+       categoryIconS VARCHAR(255) NOT NULL DEFAULT '',
+       categoryIconM VARCHAR(255) NOT NULL DEFAULT '',
+       parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',
+       showOrder INT(10) NOT NULL DEFAULT 0,
+       permissions TEXT,
+       options TEXT,
+       UNIQUE KEY categoryName (categoryName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_option_value;
+CREATE TABLE wcf1_user_option_value (
+       userID INT(10) NOT NULL PRIMARY KEY
+);
+
+DROP TABLE IF EXISTS wcf1_user_to_group;
+CREATE TABLE wcf1_user_to_group (
+       userID INT(10) NOT NULL,
+       groupID INT(10) NOT NULL,
+       UNIQUE KEY userID (userID, groupID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_to_language;
+CREATE TABLE wcf1_user_to_language (
+       userID INT(10) NOT NULL,
+       languageID INT(10) NOT NULL,
+       UNIQUE KEY userID (userID, languageID)
+);
+
+DROP TABLE IF EXISTS wcf1_template_listener;
+CREATE TABLE wcf1_template_listener (
+       listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+       packageID INT(10) NOT NULL,
+       name VARCHAR(80) NOT NULL DEFAULT '',
+       environment ENUM('user','admin') NOT NULL DEFAULT 'user',
+       templateName VARCHAR(80) NOT NULL DEFAULT '',
+       eventName VARCHAR(50) NOT NULL DEFAULT '',
+       templateCode TEXT NOT NULL,
+       KEY templateName (environment, templateName)
+);
+
+DROP TABLE IF EXISTS wcf1_storage;
+CREATE TABLE wcf1_storage (
+       userID INT(10) NOT NULL,
+       field VARCHAR(80) NOT NULL DEFAULT '',
+       fieldValue TEXT,
+       packageID INT(10),
+       UNIQUE KEY storageData (userID, field, packageID)
+);
+
+/**** foreign keys ****/
+ALTER TABLE wcf1_acp_menu_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_acp_session ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_acp_session ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_acp_session_access_log ADD FOREIGN KEY (sessionLogID) REFERENCES wcf1_acp_session_log (sessionLogID) ON DELETE CASCADE;
+ALTER TABLE wcf1_acp_session_access_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE SET NULL;
+
+ALTER TABLE wcf1_acp_session_data ADD FOREIGN KEY (sessionID) REFERENCES wcf1_acp_session (sessionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_acp_session_log ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE SET NULL;
+
+ALTER TABLE wcf1_acp_template ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_application ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_application ADD FOREIGN KEY (groupID) REFERENCES wcf1_application_group (groupID) ON DELETE SET NULL;
+
+ALTER TABLE wcf1_cleanup_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_cleanup_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_core_object ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_cronjob ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_cronjob_log ADD FOREIGN KEY (cronjobID) REFERENCES wcf1_cronjob (cronjobID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_event_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_language_item ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_language_item ADD FOREIGN KEY (languageCategoryID) REFERENCES wcf1_language_category (languageCategoryID) ON DELETE CASCADE;
+ALTER TABLE wcf1_language_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_language_to_package ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_language_to_package ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_dependency ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_package_dependency ADD FOREIGN KEY (dependency) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_exclusion ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_file_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_form ADD FOREIGN KEY (queueID) REFERENCES wcf1_package_installation_queue (queueID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_node ADD FOREIGN KEY (queueID) REFERENCES wcf1_package_installation_queue (queueID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_plugin ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_queue ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_package_installation_queue ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE SET NULL;
+
+ALTER TABLE wcf1_package_installation_sql_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_requirement ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_package_requirement ADD FOREIGN KEY (requirement) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_requirement_map ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_package_requirement_map ADD FOREIGN KEY (requirement) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update ADD FOREIGN KEY (packageUpdateServerID) REFERENCES wcf1_package_update_server (packageUpdateServerID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update_exclusion ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update_fromversion ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update_requirement ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update_version ADD FOREIGN KEY (packageUpdateID) REFERENCES wcf1_package_update (packageUpdateID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_page_location ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_page_menu_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_search ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_session ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_session ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_session_data ADD FOREIGN KEY (sessionID) REFERENCES wcf1_session (sessionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_storage ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_storage ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_style ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_style_to_package ADD FOREIGN KEY (styleID) REFERENCES wcf1_style (styleID) ON DELETE CASCADE;
+ALTER TABLE wcf1_style_to_package ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_style_variable ADD FOREIGN KEY (styleID) REFERENCES wcf1_style (styleID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_style_variable_to_attribute ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_template ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_template ADD FOREIGN KEY (templateGroupID) REFERENCES wcf1_template_group (templateGroupID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_template_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_group_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_group_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_group_option_value ADD FOREIGN KEY (groupID) REFERENCES wcf1_user_group (groupID) ON DELETE CASCADE;
+ALTER TABLE wcf1_user_group_option_value ADD FOREIGN KEY (optionID) REFERENCES wcf1_user_group_option (optionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_option_value ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_to_group ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_user_to_group ADD FOREIGN KEY (groupID) REFERENCES wcf1_user_group (groupID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_to_language ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_user_to_language ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;
+
+/**** default inserts ****/
+-- default user groups
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Everyone', 1);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Guests', 2);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Users', 3);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Administrators', 4);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Moderators', 4);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Super Moderators', 4);
+               
+-- default user group options
+INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.general.canUseAcp', 'admin.general', 'boolean', '0', '1', 1);
+INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.system.package.canInstallPackage', 'admin.system.package', 'boolean', '0', '1', 1);
+INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.user.canEditGroup', 'admin.user.group', 'boolean', '0', '1', 1);
+
+-- default user group option values
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 1, '0');  -- Everyone
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 2, '0');  -- Everyone
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 3, '0');  -- Everyone
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 1, '1');  -- Administrators
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 2, '1');  -- Administrators
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 3, '1');  -- Administrators
+               
+-- default update servers
+INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://update.woltlab.com/tempest/', 'online', 0, NULL, 0, '', '');
+INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://update.woltlab.com/maelstrom/', 'online', 0, NULL, 0, '', '');
+INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://store.woltlab.com/tempest/', 'online', 0, NULL, 0, '', '');
+INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://store.woltlab.com/maelstrom/', 'online', 0, NULL, 0, '', '');
index 11684dbbfa4f91ac67b830c17627861882b6c643..0443d4c29ff66aa6a740470f2d14a94ba68a4c92 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de">\r
-       <category name="wcf.global">\r
-               <item name="wcf.global.pageTitle"><![CDATA[{$setupPackageName} Installation]]></item>\r
-               <item name="wcf.global.title"><![CDATA[<b>{$setupPackageName}</b><br />Installation]]></item>\r
-               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>\r
-               <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>\r
-               <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>\r
-               <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>\r
-               <item name="wcf.global.thousandsSeparator"><![CDATA[&nbsp;]]></item>\r
-               <item name="wcf.global.button.next"><![CDATA[Weiter &raquo;]]></item>\r
-               <item name="wcf.global.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>\r
-               <item name="wcf.global.dateMethod"><![CDATA[strftime]]></item>\r
-               <item name="wcf.global.dateFormat"><![CDATA[%d.%m.%Y]]></item>\r
-               <item name="wcf.global.timeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>\r
-               <item name="wcf.global.dateFormatLocalized"><![CDATA[%e. %B %Y]]></item>\r
-               <item name="wcf.global.timeFormatLocalized"><![CDATA[%A, %e. %B %Y, %H:%M]]></item>\r
-               <item name="wcf.global.dateFormatToday"><![CDATA[<b>Heute</b>, %H:%M]]></item>\r
-               <item name="wcf.global.dateFormatYesterday"><![CDATA[Gestern, %H:%M]]></item>\r
-               <item name="wcf.global.welcome"><![CDATA[Vielen Dank, dass Sie sich für {$setupPackageName} entschieden haben]]></item>\r
-               <item name="wcf.global.welcome.description"><![CDATA[Dieser Installationsassistent hilft Ihnen bei der Einrichtung von <br /><b>WoltLab Community Framework</b>{if $setupPackageName != 'WoltLab Community Framework'} und von <b>{$setupPackageName}</b>{/if}.]]></item>\r
-               <item name="wcf.global.welcome.language"><![CDATA[Sprache]]></item>\r
-               <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>\r
-               <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>\r
-               <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede &raquo;Du&laquo;)]]></item>\r
-               <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>\r
-               <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>\r
-               <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>\r
-               <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>\r
-               <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
-               <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>\r
-               <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>\r
-               <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>\r
-               <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>\r
-               <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>\r
-               <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>\r
-               <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>\r
-               <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>\r
-               <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>\r
-               <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>\r
-               <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>\r
-               <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>\r
-               <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>\r
-               <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>\r
-               <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>\r
-               <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>\r
-               <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>\r
-               <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>\r
-               <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>\r
-               <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>\r
-               <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>\r
-               <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>\r
-               <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>\r
-               <item name="wcf.global.welcome.language.description"><![CDATA[Die Sprache dieses Assistenten ist zur Zeit Deutsch.]]></item>\r
-               <item name="wcf.global.welcome.language.change"><![CDATA[Sprache wechseln]]></item>\r
-               <item name="wcf.global.license"><![CDATA[Lizenzbestimmungen]]></item>\r
-               <item name="wcf.global.license.description"><![CDATA[Bitte lesen Sie die folgenden Lizenzbestimmungen. Verwenden Sie die Bildlaufleiste, um das gesamte Dokument anzuzeigen.]]></item>\r
-               <item name="wcf.global.license.accept.description"><![CDATA[Akzeptieren Sie sämtliche Bedingungen der Lizenzbestimmungen? Sie können die Software nur installieren, wenn Sie die Lizenzbestimmungen akzeptieren.]]></item>\r
-               <item name="wcf.global.license.missingAcception"><![CDATA[Um mit der Installation fortfahren zu können, müssen Sie die Lizenzbestimmungen akzeptieren.]]></item>\r
-               <item name="wcf.global.systemRequirements"><![CDATA[Überprüfung der Systemvoraussetzungen]]></item>\r
-               <item name="wcf.global.systemRequirements.description"><![CDATA[Dies sind die Systemvoraussetzungen:]]></item>\r
-               <item name="wcf.global.systemRequirements.required"><![CDATA[Benötigte Systemvoraussetzungen]]></item>\r
-               <item name="wcf.global.systemRequirements.recommended"><![CDATA[Empfohlene Systemvoraussetzungen]]></item>\r
-               <item name="wcf.global.systemRequirements.element.required"><![CDATA[Benötigt:]]></item>\r
-               <item name="wcf.global.systemRequirements.element.yours"><![CDATA[Gefunden:]]></item>\r
-               <item name="wcf.global.systemRequirements.element.recommended"><![CDATA[Empfohlen:]]></item>\r
-               <item name="wcf.global.systemRequirements.php"><![CDATA[Installierte Version der Skriptsprache &raquo;PHP&laquo;]]></item>\r
-               <item name="wcf.global.systemRequirements.php.description"><![CDATA[Die installierte Version der Skriptsprache &raquo;PHP&laquo; ist für einen stabilen Betrieb dieser Software zu alt. Bitte veranlassen Sie eine Aktualisierung der installierten Version bevor Sie mit der Installation fortfahren.]]></item>\r
-               <item name="wcf.global.systemRequirements.php.description2"><![CDATA[Ihre PHP Version ist stark veraltet. Für einen einwandfreien Betrieb empfehlen wir PHP Version 5.0.5 oder höher.]]></item>\r
-               <item name="wcf.global.systemRequirements.sql"><![CDATA[Datenbank-Unterstützung]]></item>\r
-               <item name="wcf.global.systemRequirements.sql.notFound"><![CDATA[nicht gefunden]]></item>\r
-               <item name="wcf.global.systemRequirements.sql.description"><![CDATA[Ohne die Unterstützung einer kompatiblen Datenbank kann diese Software nicht installiert werden.]]></item>\r
-               <item name="wcf.global.systemRequirements.uploadMaxFilesize"><![CDATA[Maximale Größe für das Hochladen von Dateien]]></item>\r
-               <item name="wcf.global.systemRequirements.uploadMaxFilesize.description"><![CDATA[Die derzeitige Konfiguration der Skriptsprache &raquo;PHP&laquo; macht das Hochladen von Dateien unmöglich. Einige Funktionalitäten werden durch diese Konfiguration nur eingeschränkt funktionieren.]]></item>\r
-               <item name="wcf.global.systemRequirements.gdLib"><![CDATA[Installierte Version der Grafikbearbeitungs-Bibliothek &raquo;gdlib&laquo;]]></item>\r
-               <item name="wcf.global.systemRequirements.gdLib.description"><![CDATA[Grafikbearbeitungs-Bibliothek &raquo;gdlib&laquo; ist für die dynamische Generierung von Bildern zuständig. Ohne sie werden einige Funktionalitäten der Software nicht funktionieren.]]></item>\r
-               <item name="wcf.global.systemRequirements.mbString"><![CDATA[Bibliothek für Zeichen mit mehreren Bytes (&raquo;multibyte string&laquo;)]]></item>\r
-               <item name="wcf.global.systemRequirements.mbString.description"><![CDATA[Ohne diese Bibliothek ist auschließlich der Betrieb von westeuropäischen Sprachen möglich.]]></item>\r
-               <item name="wcf.global.systemRequirements.safeMode"><![CDATA[Sicherheitseinstellung &raquo;safe mode&laquo; in Skriptsprache &raquo;PHP&laquo;]]></item>\r
-               <item name="wcf.global.systemRequirements.safeMode.description"><![CDATA[Es wird empfohlen diese Einstellung zu deaktivieren, da ansonsten ein einwandfreier Betrieb der Software nicht garantiert werden kann.]]></item>\r
-               <item name="wcf.global.systemRequirements.ftp"><![CDATA[Bibliothek für Datenübertragungen per FTP]]></item>\r
-               <item name="wcf.global.systemRequirements.ftp.description"><![CDATA[Bei der aktivierten Sicherheitseinstellung &raquo;safe mode&laquo; wird diese Bibliothek für einen Großteil der Dateioperationen der Software benutzt. Es wird dringend empfohlen, diese Bibliothek zu aktivieren.]]></item>\r
-               <item name="wcf.global.systemRequirements.active"><![CDATA[aktiviert]]></item>\r
-               <item name="wcf.global.systemRequirements.notActive"><![CDATA[nicht aktiviert]]></item>\r
-               <item name="wcf.global.wcfDir"><![CDATA[Installationsverzeichnis wählen]]></item>\r
-               <item name="wcf.global.wcfDir.description"><![CDATA[In das Installationsverzeichnis werden alle Dateien von <b>WoltLab Community Framework</b> entpackt.]]></item>\r
-               <item name="wcf.global.wcfDir.foundDirectory"><![CDATA[Die Installation vermutet eine bereits vorhandene Installation von <b>WoltLab Community Framework</b> im Ordner "{$foundDirectory}".<br />Bitte überprüfen Sie diese Angabe bzw. definieren Sie ein anderes Installationsverzeichnis, wenn Sie eine neue Kopie von <b>WoltLab Community Framework</b> installieren möchten.]]></item>\r
-               <item name="wcf.global.wcfDir.dir"><![CDATA[Installationsverzeichnis]]></item>\r
-               <item name="wcf.global.wcfDir.dir.description"><![CDATA[Bitte geben Sie hier das Installationsverzeichnis für <b>WoltLab Community Framework</b> an.]]></item>\r
-               <item name="wcf.global.wcfDir.url.description"><![CDATA[Nach einer Installation in das angegebene Installationsverzeichnis ist <b>WoltLab Community Framework</b> über folgende Adresse (URL) erreichbar:]]></item>\r
-               <item name="wcf.global.wcfDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>\r
-               <item name="wcf.global.ftp"><![CDATA[Eingabe der Zugangsdaten für FTP]]></item>\r
-               <item name="wcf.global.ftp.description"><![CDATA[Da auf Ihrem Server der PHP-SafeMode aktiviert ist, muss WoltLab Community Framework über die FTP-Funktionen installiert werden. Bitte geben Sie Benutzernamen und Kennwort für den FTP-Zugang zu diesem Server an. Die Daten werden nicht gespeichert oder weitergeleitet, sondern lediglich zur Installation dieses Paketes verwendet. Möglicherweise müssen Sie diese FTP-Zugangsdaten während dieser Installation mehrfach angeben.]]></item>\r
-               <item name="wcf.global.ftp.accessData"><![CDATA[Zugangsdaten für FTP]]></item>\r
-               <item name="wcf.global.ftp.host"><![CDATA[Hostname]]></item>\r
-               <item name="wcf.global.ftp.user"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.global.ftp.password"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.global.ftp.error"><![CDATA[Mit den angegebenen Zugangsdaten konnte keine Verbindung zu einem FTP-Server hergestellt werden.]]></item>\r
-               <item name="wcf.global.next"><![CDATA[Lade nächsten Schritt ...]]></item>\r
-               <item name="wcf.global.next.description"><![CDATA[Die Installation lädt im Moment den nächsten Schritt. Bitte haben Sie einen Augenblick Geduld.]]></item>\r
-               <item name="wcf.global.languages"><![CDATA[Sprachen wählen]]></item>\r
-               <item name="wcf.global.languages.description"><![CDATA[Sie können diese Software mehrsprachig betreiben. Bitte wählen Sie aus, welche Sprachen Sie installieren möchten.]]></item>\r
-               <item name="wcf.global.languages.charset"><![CDATA[Zeichenkodierung]]></item>\r
-               <item name="wcf.global.languages.charset.description"><![CDATA[Über die Zeichenkodierung wird die technische Speicherung und Darstellung von Sprachen beeinflusst. Bitte beachten Sie, dass die Zeichenkodierung zu einem späteren Zeitpunkt nicht mehr gewechselt werden kann.]]></item>\r
-               \r
-               <!-- <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Die Verwendung von ISO-8859-1 wird empfohlen, wenn Sie ausschließlich westeuropäische Sprachen installieren möchten.]]></item>\r
-               <item name="wcf.global.languages.charset.UTF-8"><![CDATA[UTF-8 wird für den Betrieb von nicht westeuropäischen Sprachen benötigt. Wenn Sie jetzt oder zu einem späteren Zeitpunkt eine nicht westeuropäischen Sprache installieren möchten, müssen Sie hier UTF-8 auswählen.]]></item>-->\r
-               \r
-               <item name="wcf.global.languages.charset.UTF-8"><![CDATA[Unicode]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Westeuropäisch]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-2"><![CDATA[Mitteleuropäisch]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-7"><![CDATA[Griechisch]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-8"><![CDATA[Hebräisch]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-9"><![CDATA[Türkisch]]></item>\r
-               <item name="wcf.global.languages.charset.EUC-JP"><![CDATA[Japanisch]]></item>\r
-               <item name="wcf.global.languages.charset.SJIS"><![CDATA[Japanisch]]></item>\r
-               <item name="wcf.global.languages.charset.BIG-5"><![CDATA[Chinesisch (traditionell)]]></item>\r
-               <item name="wcf.global.languages.charset.CP936"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
-               <item name="wcf.global.languages.charset.EUC-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
-               <item name="wcf.global.languages.charset.KOI8-R"><![CDATA[Kyrillisch]]></item>\r
-               <item name="wcf.global.languages.charset.Windows-1251"><![CDATA[Kyrillisch]]></item>\r
-               <item name="wcf.global.languages.charset.EUC-KR"><![CDATA[Koreanisch]]></item>\r
-               \r
-               <item name="wcf.global.languages.languages"><![CDATA[Sprachen]]></item>\r
-               <item name="wcf.global.languages.error.empty"><![CDATA[Bitte wählen Sie mindestens eine Sprache aus!]]></item>\r
-               <item name="wcf.global.languages.error.notAvailable"><![CDATA[Sie haben Sprachen ausgewählt, die in der gleichzeitig ausgewählten Zeichencodierung nicht zur Verfügung stehen. Bitte korrigieren Sie Ihre Auswahl.]]></item>\r
-               <item name="wcf.global.configureDB"><![CDATA[Datenbankzugang konfigurieren]]></item>\r
-               <item name="wcf.global.configureDB.description"><![CDATA[Die Daten der Software werden in einer SQL Datenbank gespeichert. Bitte geben Sie die Zugangsdaten für diese Datenbank an!]]></item>\r
-               <item name="wcf.global.configureDB.accessData"><![CDATA[Datenbankzugangsdaten]]></item>\r
-               <item name="wcf.global.configureDB.host"><![CDATA[Hostname]]></item>\r
-               <item name="wcf.global.configureDB.user"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.global.configureDB.password"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.global.configureDB.database"><![CDATA[Datenbankname]]></item>\r
-               <item name="wcf.global.configureDB.number"><![CDATA[Installationsnummer]]></item>\r
-               <item name="wcf.global.configureDB.error"><![CDATA[Beim Verbindungsversuch mit der Datenbank ist folgender Fehler aufgetreten:\r
-               <br /><b>{$exception->getMessage()}{if $exception|get_class == 'DatabaseException'}<br />{$exception->getErrorDesc()}{/if}</b>\r
-               <br />Weitere Informationen zu diesem Problem erhalten Sie im Nachschlagewerk von WoltLab:\r
-               <br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>\r
-               <item name="wcf.global.configureDB.conflictedTables"><![CDATA[Folgende Tabelle{if $conflictedTables|count > 1}n{/if} existier{if $conflictedTables|count > 1}en{else}t{/if} schon in der Datenbank &raquo;{$dbName}&laquo;:<br />{implode from=$conflictedTables item="table"}{$table}{/implode}.<br /><br />Um dieses Problem zu beheben, können Sie:<br />1. diese Tabelle{if $conflictedTables|count > 1}n{/if} überschreiben, indem Sie die &raquo;Überschreiben&laquo; Option aktivieren und die &raquo;Weiter&laquo; Schaltfläche betätigen, oder<br />2. Sie geben die Daten einer anderen Datenbank ein und betätigen die &raquo;Weiter&laquo; Schaltfläche, oder<br />3. Sie geben eine von &raquo;{$dbNumber}&laquo; unterschiedliche Installationsnummer an und betätigen die &raquo;Weiter&laquo; Schaltfläche.]]></item>\r
-               <item name="wcf.global.configureDB.conflictedTables.overwrite"><![CDATA[Oben genannte Tabelle{if $conflictedTables|count > 1}n{/if} überschreiben]]></item>\r
-               <item name="wcf.global.configureDB.class"><![CDATA[Datenbank-Typ]]></item>\r
-               <item name="wcf.global.configureDB.class.MSSQLDatabase"><![CDATA[Microsoft SQL Server 2008+]]></item>\r
-               <item name="wcf.global.configureDB.class.MySQLDatabase"><![CDATA[MySQL 5.1+]]></item>\r
-               <item name="wcf.global.configureDB.class.PostgreSQLDatabase"><![CDATA[PostgreSQL 8.2+]]></item>\r
-               <item name="wcf.global.createUser"><![CDATA[Administrator erstellen]]></item>\r
-               <item name="wcf.global.createUser.description"><![CDATA[Der Installationsassistent erstellt nun ein Administrator-Konto für Sie. Bitte geben Sie dazu einen Benutzernamen, eine E-Mail-Adresse und ein Kennwort ein.]]></item>\r
-               <item name="wcf.global.createUser.data"><![CDATA[Benutzerdaten]]></item>\r
-               <item name="wcf.global.createUser.username"><![CDATA[Benutzername]]></item>\r
-               <item name="wcf.global.createUser.email"><![CDATA[E-Mail-Adresse]]></item>\r
-               <item name="wcf.global.createUser.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>\r
-               <item name="wcf.global.createUser.password"><![CDATA[Kennwort]]></item>\r
-               <item name="wcf.global.createUser.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>\r
-               <item name="wcf.global.createUser.error"><![CDATA[Es sind Fehler bei Ihrer Registrierung aufgetreten. Bitte überprüfen Sie die markierten Felder.]]></item>\r
-               <item name="wcf.global.createUser.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>\r
-               <item name="wcf.global.createUser.error.username.notValid"><![CDATA[Der eingegebene Benutzername ist ungültig. Ein gültiger Benutzername muss mindestens 3 und maximal 20 Zeichen lang sein.]]></item>\r
-               <item name="wcf.global.createUser.error.email.notValid"><![CDATA[Die eingegebene E-Mail-Adresse ist ungültig. Eine gültige E-Mail-Adresse muss dem Format name@domain.tld entsprechen.]]></item>\r
-               <item name="wcf.global.createUser.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch. Bitte tragen Sie zur Sicherheit in beide Eingabefelder die selbe E-Mail-Adresse ein.]]></item>\r
-               <item name="wcf.global.createUser.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch. Bitte tragen Sie zur Sicherheit in beide Eingabefelder das selbe Kennwort ein.]]></item>\r
-               <item name="wcf.global.wcfDir.error"><![CDATA[Beim Versuch die Dateien zu entpacken, ist folgender Fehler aufgetreten:\r
-               <br /><b>{$exception->getMessage()}</b><br />\r
-               Bitte kontrollieren Sie, ob das Zielverzeichnis existiert und beschreibbar ist.\r
-               <br /><br />Weitere Informationen zu diesem Problem erhalten Sie im Nachschlagewerk von WoltLab:<br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>\r
-       </category>\r
-</language>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de">
+       <category name="wcf.global">
+               <item name="wcf.global.pageTitle"><![CDATA[{$setupPackageName} Installation]]></item>
+               <item name="wcf.global.title"><![CDATA[<b>{$setupPackageName}</b><br />Installation]]></item>
+               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>
+               <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>
+               <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>
+               <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>
+               <item name="wcf.global.thousandsSeparator"><![CDATA[&nbsp;]]></item>
+               <item name="wcf.global.button.next"><![CDATA[Weiter &raquo;]]></item>
+               <item name="wcf.global.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>
+               <item name="wcf.global.dateMethod"><![CDATA[strftime]]></item>
+               <item name="wcf.global.dateFormat"><![CDATA[%d.%m.%Y]]></item>
+               <item name="wcf.global.timeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>
+               <item name="wcf.global.dateFormatLocalized"><![CDATA[%e. %B %Y]]></item>
+               <item name="wcf.global.timeFormatLocalized"><![CDATA[%A, %e. %B %Y, %H:%M]]></item>
+               <item name="wcf.global.dateFormatToday"><![CDATA[<b>Heute</b>, %H:%M]]></item>
+               <item name="wcf.global.dateFormatYesterday"><![CDATA[Gestern, %H:%M]]></item>
+               <item name="wcf.global.welcome"><![CDATA[Vielen Dank, dass Sie sich für {$setupPackageName} entschieden haben]]></item>
+               <item name="wcf.global.welcome.description"><![CDATA[Dieser Installationsassistent hilft Ihnen bei der Einrichtung von <br /><b>WoltLab Community Framework</b>{if $setupPackageName != 'WoltLab Community Framework'} und von <b>{$setupPackageName}</b>{/if}.]]></item>
+               <item name="wcf.global.welcome.language"><![CDATA[Sprache]]></item>
+               <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>
+               <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>
+               <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede &raquo;Du&laquo;)]]></item>
+               <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>
+               <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>
+               <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>
+               <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>
+               <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>
+               <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>
+               <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>
+               <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>
+               <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>
+               <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>
+               <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>
+               <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>
+               <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>
+               <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>
+               <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>
+               <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>
+               <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>
+               <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>
+               <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>
+               <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>
+               <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>
+               <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>
+               <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>
+               <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>
+               <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>
+               <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>
+               <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>
+               <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>
+               <item name="wcf.global.welcome.language.description"><![CDATA[Die Sprache dieses Assistenten ist zur Zeit Deutsch.]]></item>
+               <item name="wcf.global.welcome.language.change"><![CDATA[Sprache wechseln]]></item>
+               <item name="wcf.global.license"><![CDATA[Lizenzbestimmungen]]></item>
+               <item name="wcf.global.license.description"><![CDATA[Bitte lesen Sie die folgenden Lizenzbestimmungen. Verwenden Sie die Bildlaufleiste, um das gesamte Dokument anzuzeigen.]]></item>
+               <item name="wcf.global.license.accept.description"><![CDATA[Akzeptieren Sie sämtliche Bedingungen der Lizenzbestimmungen? Sie können die Software nur installieren, wenn Sie die Lizenzbestimmungen akzeptieren.]]></item>
+               <item name="wcf.global.license.missingAcception"><![CDATA[Um mit der Installation fortfahren zu können, müssen Sie die Lizenzbestimmungen akzeptieren.]]></item>
+               <item name="wcf.global.systemRequirements"><![CDATA[Überprüfung der Systemvoraussetzungen]]></item>
+               <item name="wcf.global.systemRequirements.description"><![CDATA[Dies sind die Systemvoraussetzungen:]]></item>
+               <item name="wcf.global.systemRequirements.required"><![CDATA[Benötigte Systemvoraussetzungen]]></item>
+               <item name="wcf.global.systemRequirements.recommended"><![CDATA[Empfohlene Systemvoraussetzungen]]></item>
+               <item name="wcf.global.systemRequirements.element.required"><![CDATA[Benötigt:]]></item>
+               <item name="wcf.global.systemRequirements.element.yours"><![CDATA[Gefunden:]]></item>
+               <item name="wcf.global.systemRequirements.element.recommended"><![CDATA[Empfohlen:]]></item>
+               <item name="wcf.global.systemRequirements.php"><![CDATA[Installierte Version der Skriptsprache &raquo;PHP&laquo;]]></item>
+               <item name="wcf.global.systemRequirements.php.description"><![CDATA[Die installierte Version der Skriptsprache &raquo;PHP&laquo; ist für einen stabilen Betrieb dieser Software zu alt. Bitte veranlassen Sie eine Aktualisierung der installierten Version bevor Sie mit der Installation fortfahren.]]></item>
+               <item name="wcf.global.systemRequirements.php.description2"><![CDATA[Ihre PHP Version ist stark veraltet. Für einen einwandfreien Betrieb empfehlen wir PHP Version 5.0.5 oder höher.]]></item>
+               <item name="wcf.global.systemRequirements.sql"><![CDATA[Datenbank-Unterstützung]]></item>
+               <item name="wcf.global.systemRequirements.sql.notFound"><![CDATA[nicht gefunden]]></item>
+               <item name="wcf.global.systemRequirements.sql.description"><![CDATA[Ohne die Unterstützung einer kompatiblen Datenbank kann diese Software nicht installiert werden.]]></item>
+               <item name="wcf.global.systemRequirements.uploadMaxFilesize"><![CDATA[Maximale Größe für das Hochladen von Dateien]]></item>
+               <item name="wcf.global.systemRequirements.uploadMaxFilesize.description"><![CDATA[Die derzeitige Konfiguration der Skriptsprache &raquo;PHP&laquo; macht das Hochladen von Dateien unmöglich. Einige Funktionalitäten werden durch diese Konfiguration nur eingeschränkt funktionieren.]]></item>
+               <item name="wcf.global.systemRequirements.gdLib"><![CDATA[Installierte Version der Grafikbearbeitungs-Bibliothek &raquo;gdlib&laquo;]]></item>
+               <item name="wcf.global.systemRequirements.gdLib.description"><![CDATA[Grafikbearbeitungs-Bibliothek &raquo;gdlib&laquo; ist für die dynamische Generierung von Bildern zuständig. Ohne sie werden einige Funktionalitäten der Software nicht funktionieren.]]></item>
+               <item name="wcf.global.systemRequirements.mbString"><![CDATA[Bibliothek für Zeichen mit mehreren Bytes (&raquo;multibyte string&laquo;)]]></item>
+               <item name="wcf.global.systemRequirements.mbString.description"><![CDATA[Ohne diese Bibliothek ist auschließlich der Betrieb von westeuropäischen Sprachen möglich.]]></item>
+               <item name="wcf.global.systemRequirements.safeMode"><![CDATA[Sicherheitseinstellung &raquo;safe mode&laquo; in Skriptsprache &raquo;PHP&laquo;]]></item>
+               <item name="wcf.global.systemRequirements.safeMode.description"><![CDATA[Es wird empfohlen diese Einstellung zu deaktivieren, da ansonsten ein einwandfreier Betrieb der Software nicht garantiert werden kann.]]></item>
+               <item name="wcf.global.systemRequirements.ftp"><![CDATA[Bibliothek für Datenübertragungen per FTP]]></item>
+               <item name="wcf.global.systemRequirements.ftp.description"><![CDATA[Bei der aktivierten Sicherheitseinstellung &raquo;safe mode&laquo; wird diese Bibliothek für einen Großteil der Dateioperationen der Software benutzt. Es wird dringend empfohlen, diese Bibliothek zu aktivieren.]]></item>
+               <item name="wcf.global.systemRequirements.active"><![CDATA[aktiviert]]></item>
+               <item name="wcf.global.systemRequirements.notActive"><![CDATA[nicht aktiviert]]></item>
+               <item name="wcf.global.wcfDir"><![CDATA[Installationsverzeichnis wählen]]></item>
+               <item name="wcf.global.wcfDir.description"><![CDATA[In das Installationsverzeichnis werden alle Dateien von <b>WoltLab Community Framework</b> entpackt.]]></item>
+               <item name="wcf.global.wcfDir.foundDirectory"><![CDATA[Die Installation vermutet eine bereits vorhandene Installation von <b>WoltLab Community Framework</b> im Ordner "{$foundDirectory}".<br />Bitte überprüfen Sie diese Angabe bzw. definieren Sie ein anderes Installationsverzeichnis, wenn Sie eine neue Kopie von <b>WoltLab Community Framework</b> installieren möchten.]]></item>
+               <item name="wcf.global.wcfDir.dir"><![CDATA[Installationsverzeichnis]]></item>
+               <item name="wcf.global.wcfDir.dir.description"><![CDATA[Bitte geben Sie hier das Installationsverzeichnis für <b>WoltLab Community Framework</b> an.]]></item>
+               <item name="wcf.global.wcfDir.url.description"><![CDATA[Nach einer Installation in das angegebene Installationsverzeichnis ist <b>WoltLab Community Framework</b> über folgende Adresse (URL) erreichbar:]]></item>
+               <item name="wcf.global.wcfDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>
+               <item name="wcf.global.ftp"><![CDATA[Eingabe der Zugangsdaten für FTP]]></item>
+               <item name="wcf.global.ftp.description"><![CDATA[Da auf Ihrem Server der PHP-SafeMode aktiviert ist, muss WoltLab Community Framework über die FTP-Funktionen installiert werden. Bitte geben Sie Benutzernamen und Kennwort für den FTP-Zugang zu diesem Server an. Die Daten werden nicht gespeichert oder weitergeleitet, sondern lediglich zur Installation dieses Paketes verwendet. Möglicherweise müssen Sie diese FTP-Zugangsdaten während dieser Installation mehrfach angeben.]]></item>
+               <item name="wcf.global.ftp.accessData"><![CDATA[Zugangsdaten für FTP]]></item>
+               <item name="wcf.global.ftp.host"><![CDATA[Hostname]]></item>
+               <item name="wcf.global.ftp.user"><![CDATA[Benutzername]]></item>
+               <item name="wcf.global.ftp.password"><![CDATA[Kennwort]]></item>
+               <item name="wcf.global.ftp.error"><![CDATA[Mit den angegebenen Zugangsdaten konnte keine Verbindung zu einem FTP-Server hergestellt werden.]]></item>
+               <item name="wcf.global.next"><![CDATA[Lade nächsten Schritt ...]]></item>
+               <item name="wcf.global.next.description"><![CDATA[Die Installation lädt im Moment den nächsten Schritt. Bitte haben Sie einen Augenblick Geduld.]]></item>
+               <item name="wcf.global.languages"><![CDATA[Sprachen wählen]]></item>
+               <item name="wcf.global.languages.description"><![CDATA[Sie können diese Software mehrsprachig betreiben. Bitte wählen Sie aus, welche Sprachen Sie installieren möchten.]]></item>
+               <item name="wcf.global.languages.charset"><![CDATA[Zeichenkodierung]]></item>
+               <item name="wcf.global.languages.charset.description"><![CDATA[Über die Zeichenkodierung wird die technische Speicherung und Darstellung von Sprachen beeinflusst. Bitte beachten Sie, dass die Zeichenkodierung zu einem späteren Zeitpunkt nicht mehr gewechselt werden kann.]]></item>
+               
+               <!-- <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Die Verwendung von ISO-8859-1 wird empfohlen, wenn Sie ausschließlich westeuropäische Sprachen installieren möchten.]]></item>
+               <item name="wcf.global.languages.charset.UTF-8"><![CDATA[UTF-8 wird für den Betrieb von nicht westeuropäischen Sprachen benötigt. Wenn Sie jetzt oder zu einem späteren Zeitpunkt eine nicht westeuropäischen Sprache installieren möchten, müssen Sie hier UTF-8 auswählen.]]></item>-->
+               
+               <item name="wcf.global.languages.charset.UTF-8"><![CDATA[Unicode]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Westeuropäisch]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-2"><![CDATA[Mitteleuropäisch]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-7"><![CDATA[Griechisch]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-8"><![CDATA[Hebräisch]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-9"><![CDATA[Türkisch]]></item>
+               <item name="wcf.global.languages.charset.EUC-JP"><![CDATA[Japanisch]]></item>
+               <item name="wcf.global.languages.charset.SJIS"><![CDATA[Japanisch]]></item>
+               <item name="wcf.global.languages.charset.BIG-5"><![CDATA[Chinesisch (traditionell)]]></item>
+               <item name="wcf.global.languages.charset.CP936"><![CDATA[Chinesisch (vereinfacht)]]></item>
+               <item name="wcf.global.languages.charset.EUC-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>
+               <item name="wcf.global.languages.charset.KOI8-R"><![CDATA[Kyrillisch]]></item>
+               <item name="wcf.global.languages.charset.Windows-1251"><![CDATA[Kyrillisch]]></item>
+               <item name="wcf.global.languages.charset.EUC-KR"><![CDATA[Koreanisch]]></item>
+               
+               <item name="wcf.global.languages.languages"><![CDATA[Sprachen]]></item>
+               <item name="wcf.global.languages.error.empty"><![CDATA[Bitte wählen Sie mindestens eine Sprache aus!]]></item>
+               <item name="wcf.global.languages.error.notAvailable"><![CDATA[Sie haben Sprachen ausgewählt, die in der gleichzeitig ausgewählten Zeichencodierung nicht zur Verfügung stehen. Bitte korrigieren Sie Ihre Auswahl.]]></item>
+               <item name="wcf.global.configureDB"><![CDATA[Datenbankzugang konfigurieren]]></item>
+               <item name="wcf.global.configureDB.description"><![CDATA[Die Daten der Software werden in einer SQL Datenbank gespeichert. Bitte geben Sie die Zugangsdaten für diese Datenbank an!]]></item>
+               <item name="wcf.global.configureDB.accessData"><![CDATA[Datenbankzugangsdaten]]></item>
+               <item name="wcf.global.configureDB.host"><![CDATA[Hostname]]></item>
+               <item name="wcf.global.configureDB.user"><![CDATA[Benutzername]]></item>
+               <item name="wcf.global.configureDB.password"><![CDATA[Kennwort]]></item>
+               <item name="wcf.global.configureDB.database"><![CDATA[Datenbankname]]></item>
+               <item name="wcf.global.configureDB.number"><![CDATA[Installationsnummer]]></item>
+               <item name="wcf.global.configureDB.error"><![CDATA[Beim Verbindungsversuch mit der Datenbank ist folgender Fehler aufgetreten:
+               <br /><b>{$exception->getMessage()}{if $exception|get_class == 'DatabaseException'}<br />{$exception->getErrorDesc()}{/if}</b>
+               <br />Weitere Informationen zu diesem Problem erhalten Sie im Nachschlagewerk von WoltLab:
+               <br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>
+               <item name="wcf.global.configureDB.conflictedTables"><![CDATA[Folgende Tabelle{if $conflictedTables|count > 1}n{/if} existier{if $conflictedTables|count > 1}en{else}t{/if} schon in der Datenbank &raquo;{$dbName}&laquo;:<br />{implode from=$conflictedTables item="table"}{$table}{/implode}.<br /><br />Um dieses Problem zu beheben, können Sie:<br />1. diese Tabelle{if $conflictedTables|count > 1}n{/if} überschreiben, indem Sie die &raquo;Überschreiben&laquo; Option aktivieren und die &raquo;Weiter&laquo; Schaltfläche betätigen, oder<br />2. Sie geben die Daten einer anderen Datenbank ein und betätigen die &raquo;Weiter&laquo; Schaltfläche, oder<br />3. Sie geben eine von &raquo;{$dbNumber}&laquo; unterschiedliche Installationsnummer an und betätigen die &raquo;Weiter&laquo; Schaltfläche.]]></item>
+               <item name="wcf.global.configureDB.conflictedTables.overwrite"><![CDATA[Oben genannte Tabelle{if $conflictedTables|count > 1}n{/if} überschreiben]]></item>
+               <item name="wcf.global.configureDB.class"><![CDATA[Datenbank-Typ]]></item>
+               <item name="wcf.global.configureDB.class.MSSQLDatabase"><![CDATA[Microsoft SQL Server 2008+]]></item>
+               <item name="wcf.global.configureDB.class.MySQLDatabase"><![CDATA[MySQL 5.1+]]></item>
+               <item name="wcf.global.configureDB.class.PostgreSQLDatabase"><![CDATA[PostgreSQL 8.2+]]></item>
+               <item name="wcf.global.createUser"><![CDATA[Administrator erstellen]]></item>
+               <item name="wcf.global.createUser.description"><![CDATA[Der Installationsassistent erstellt nun ein Administrator-Konto für Sie. Bitte geben Sie dazu einen Benutzernamen, eine E-Mail-Adresse und ein Kennwort ein.]]></item>
+               <item name="wcf.global.createUser.data"><![CDATA[Benutzerdaten]]></item>
+               <item name="wcf.global.createUser.username"><![CDATA[Benutzername]]></item>
+               <item name="wcf.global.createUser.email"><![CDATA[E-Mail-Adresse]]></item>
+               <item name="wcf.global.createUser.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>
+               <item name="wcf.global.createUser.password"><![CDATA[Kennwort]]></item>
+               <item name="wcf.global.createUser.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>
+               <item name="wcf.global.createUser.error"><![CDATA[Es sind Fehler bei Ihrer Registrierung aufgetreten. Bitte überprüfen Sie die markierten Felder.]]></item>
+               <item name="wcf.global.createUser.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>
+               <item name="wcf.global.createUser.error.username.notValid"><![CDATA[Der eingegebene Benutzername ist ungültig. Ein gültiger Benutzername muss mindestens 3 und maximal 20 Zeichen lang sein.]]></item>
+               <item name="wcf.global.createUser.error.email.notValid"><![CDATA[Die eingegebene E-Mail-Adresse ist ungültig. Eine gültige E-Mail-Adresse muss dem Format name@domain.tld entsprechen.]]></item>
+               <item name="wcf.global.createUser.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch. Bitte tragen Sie zur Sicherheit in beide Eingabefelder die selbe E-Mail-Adresse ein.]]></item>
+               <item name="wcf.global.createUser.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch. Bitte tragen Sie zur Sicherheit in beide Eingabefelder das selbe Kennwort ein.]]></item>
+               <item name="wcf.global.wcfDir.error"><![CDATA[Beim Versuch die Dateien zu entpacken, ist folgender Fehler aufgetreten:
+               <br /><b>{$exception->getMessage()}</b><br />
+               Bitte kontrollieren Sie, ob das Zielverzeichnis existiert und beschreibbar ist.
+               <br /><br />Weitere Informationen zu diesem Problem erhalten Sie im Nachschlagewerk von WoltLab:<br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>
+       </category>
+</language>
index f8fb33fd31255878abf5a31bc80df133925c0d6c..01ad5ddccacef37713bf32c702e0419c415ba5fe 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="en">\r
-       <category name="wcf.global">\r
-               <item name="wcf.global.pageTitle"><![CDATA[{$setupPackageName} Installation]]></item>\r
-               <item name="wcf.global.title"><![CDATA[<b>{$setupPackageName}</b><br />Installation]]></item>\r
-               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.locale.unix"><![CDATA[en_US]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.locale.win"><![CDATA[english]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.decimalPoint"><![CDATA[.]]></item>\r
-               <item name="wcf.global.thousandsSeparator"><![CDATA[,]]></item>\r
-               <item name="wcf.global.button.next"><![CDATA[Next &raquo;]]></item>\r
-               <item name="wcf.global.progressBar"><![CDATA[{@$progress}% complete]]></item>\r
-               <item name="wcf.global.dateMethod"><![CDATA[date]]></item> <!-- system variable; do not translate -->\r
-               <item name="wcf.global.dateFormat"><![CDATA[M jS Y]]></item>\r
-               <item name="wcf.global.timeFormat"><![CDATA[l, F jS Y, g:ia]]></item>\r
-               <item name="wcf.global.dateFormatToday"><![CDATA[<b>\T\o\d\a\y</b>, g:ia]]></item>\r
-               <item name="wcf.global.dateFormatYesterday"><![CDATA[\Y\e\s\t\e\r\d\a\y, g:ia]]></item>\r
-               <item name="wcf.global.welcome"><![CDATA[Thank you for choosing {$setupPackageName}]]></item>\r
-               <item name="wcf.global.welcome.description"><![CDATA[This installations-assistant will help you to setup <br /><b>WoltLab Community Framework</b>{if $setupPackageName != 'WoltLab Community Framework'} and <b>{$setupPackageName}</b>{/if}.]]></item>\r
-               <item name="wcf.global.welcome.language"><![CDATA[Language]]></item>\r
-               <item name="wcf.global.language.en"><![CDATA[English]]></item>\r
-               <item name="wcf.global.language.de"><![CDATA[German]]></item>\r
-               <item name="wcf.global.language.de-informal"><![CDATA[German (Informal)]]></item>\r
-               <item name="wcf.global.language.fr"><![CDATA[French]]></item>\r
-               <item name="wcf.global.language.ja"><![CDATA[Japanese]]></item>\r
-               <item name="wcf.global.language.es"><![CDATA[Spanish]]></item>\r
-               <item name="wcf.global.language.zh-TW"><![CDATA[Chinese (Traditional)]]></item>\r
-               <item name="wcf.global.language.zh-CN"><![CDATA[Chinese (Simplified)]]></item>\r
-               <item name="wcf.global.language.it"><![CDATA[Italian]]></item>\r
-               <item name="wcf.global.language.nl"><![CDATA[Dutch]]></item>\r
-               <item name="wcf.global.language.ru"><![CDATA[Russian]]></item>\r
-               <item name="wcf.global.language.ko"><![CDATA[Korean]]></item>\r
-               <item name="wcf.global.language.pt"><![CDATA[Portuguese]]></item>\r
-               <item name="wcf.global.language.pt-BR"><![CDATA[Portuguese (Brazil)]]></item>\r
-               <item name="wcf.global.language.sv"><![CDATA[Swedish]]></item>\r
-               <item name="wcf.global.language.pl"><![CDATA[Polish]]></item>\r
-               <item name="wcf.global.language.da"><![CDATA[Danish]]></item>\r
-               <item name="wcf.global.language.cs"><![CDATA[Czech]]></item>\r
-               <item name="wcf.global.language.tr"><![CDATA[Turkish]]></item>\r
-               <item name="wcf.global.language.hu"><![CDATA[Hungarian]]></item>\r
-               <item name="wcf.global.language.ar"><![CDATA[Arabic]]></item>\r
-               <item name="wcf.global.language.he"><![CDATA[Hebrew]]></item>\r
-               <item name="wcf.global.language.fa"><![CDATA[Persian]]></item>\r
-               <item name="wcf.global.language.no"><![CDATA[Norwegian]]></item>\r
-               <item name="wcf.global.language.fi"><![CDATA[Finnish]]></item>\r
-               <item name="wcf.global.language.ro"><![CDATA[Romanian]]></item>\r
-               <item name="wcf.global.language.bs"><![CDATA[Bosnian]]></item>\r
-               <item name="wcf.global.language.hr"><![CDATA[Croatian]]></item>\r
-               <item name="wcf.global.language.sr"><![CDATA[Serbian]]></item>\r
-               <item name="wcf.global.language.sk"><![CDATA[Slovak]]></item>\r
-               <item name="wcf.global.language.el"><![CDATA[Greek]]></item>\r
-               <item name="wcf.global.welcome.language.description"><![CDATA[The assistants language is currently set to English.]]></item>\r
-               <item name="wcf.global.welcome.language.change"><![CDATA[Change language]]></item>\r
-               <item name="wcf.global.license"><![CDATA[License Agreement]]></item>\r
-               <item name="wcf.global.license.description"><![CDATA[Please read the following License Agreement. Use the scrollbar to view the whole document.]]></item>\r
-               <item name="wcf.global.license.accept.description"><![CDATA[Do you accept the terms and conditions of the License Agreement? You may only install this software upon acceptance of the License Agreement.]]></item>\r
-               <item name="wcf.global.license.missingAcception"><![CDATA[You must accept the License Agreement to continue this installation.]]></item>\r
-               <item name="wcf.global.systemRequirements"><![CDATA[Checking System Requirements]]></item>\r
-               <item name="wcf.global.systemRequirements.description"><![CDATA[These are the System Requirements:]]></item>\r
-               <item name="wcf.global.systemRequirements.required"><![CDATA[Required System component]]></item>\r
-               <item name="wcf.global.systemRequirements.recommended"><![CDATA[Recommended System component]]></item>\r
-               <item name="wcf.global.systemRequirements.element.required"><![CDATA[Required:]]></item>\r
-               <item name="wcf.global.systemRequirements.element.yours"><![CDATA[Found:]]></item>\r
-               <item name="wcf.global.systemRequirements.element.recommended"><![CDATA[Recommended:]]></item>\r
-               <item name="wcf.global.systemRequirements.php"><![CDATA[Installed version of the Script language &quot;PHP&quot;]]></item>\r
-               <item name="wcf.global.systemRequirements.php.description"><![CDATA[The installed version of the Script language &quot;PHP&quot; is too old for a stable operation of this Software. To proceed with the installation, a version update is necessary.]]></item>\r
-               <item name="wcf.global.systemRequirements.php.description2"><![CDATA[Your PHP Version is obsolete. For a stable operation of this Software, we recommend a PHP version of 5.0.5 or greater.]]></item>\r
-               <item name="wcf.global.systemRequirements.mysql"><![CDATA[&quot;MySQL&quot; Database support]]></item>\r
-               <item name="wcf.global.systemRequirements.mysql.description"><![CDATA[&quot;MySQL&quot; Database support is required to install this Software.]]></item>\r
-               <item name="wcf.global.systemRequirements.uploadMaxFilesize"><![CDATA[Maximum size for file uploads]]></item>\r
-               <item name="wcf.global.systemRequirements.uploadMaxFilesize.description"><![CDATA[The current configuration of the installed &quot;PHP&quot; makes it impossible to upload any files. Due to this configuration, some features of this Software will be restricted.]]></item>\r
-               <item name="wcf.global.systemRequirements.gdLib"><![CDATA[Installed version of the graphics library &quot;GDLib&quot;]]></item>\r
-               <item name="wcf.global.systemRequirements.gdLib.description"><![CDATA[The graphics library &quot;GDLib&quot; is needed for the Dynamic Generation of Images. Without this, some features of this Software will not be available.]]></item>\r
-               <item name="wcf.global.systemRequirements.mbString"><![CDATA[The multibyte character library &quot;MBString&quot;]]></item>\r
-               <item name="wcf.global.systemRequirements.mbString.description"><![CDATA[Without this library, the Software can only be used with Western European languages.]]></item>\r
-               <item name="wcf.global.systemRequirements.safeMode"><![CDATA[Security option of &quot;safe mode&quot; in the &quot;PHP&quot; Script language]]></item>\r
-               <item name="wcf.global.systemRequirements.safeMode.description"><![CDATA[To quarantee the operation of this Software, we recommend to disable the safe mode setting.]]></item>\r
-               <item name="wcf.global.systemRequirements.ftp"><![CDATA[The data transfer library for FTP]]></item>\r
-               <item name="wcf.global.systemRequirements.ftp.description"><![CDATA[With the security option of &quot;safe mode&quot; being enabled, the data transfer library is needed for most of the file operations within this Software. We strongly recommend to enable this library.]]></item>\r
-               <item name="wcf.global.systemRequirements.active"><![CDATA[Enabled]]></item>\r
-               <item name="wcf.global.systemRequirements.notActive"><![CDATA[Not enabled]]></item>\r
-               <item name="wcf.global.wcfDir"><![CDATA[Choose the installation folder]]></item>\r
-               <item name="wcf.global.wcfDir.description"><![CDATA[All files of <b>WoltLab Community Framework</b> will be extracted into the installation folder.]]></item>\r
-               <item name="wcf.global.wcfDir.foundDirectory"><![CDATA[The installation assistant has found a previous installation of <b>WoltLab Community Framework</b> in the "{$foundDirectory}" folder.<br />If you would like to install a new copy of the <b>WoltLab Community Framework</b>, then please enter an alternative installation folder.]]></item>\r
-               <item name="wcf.global.wcfDir.dir"><![CDATA[Installation folder]]></item>\r
-               <item name="wcf.global.wcfDir.dir.description"><![CDATA[Please enter the installation folder for <b>WoltLab Community Framework</b>.]]></item>\r
-               <item name="wcf.global.wcfDir.url.description"><![CDATA[After installation into the given folder you can access <b>WoltLab Community Framework</b> through the following URL:]]></item>\r
-               <item name="wcf.global.wcfDir.error.invalid"><![CDATA[The given folder is not valid.]]></item>\r
-               <item name="wcf.global.ftp"><![CDATA[FTP access information]]></item>\r
-               <item name="wcf.global.ftp.description"><![CDATA[With the PHP-SafeMode security option being enabled, WoltLab Community Framework can only be installed using FTP functionality. Please enter here the FTP Username and Password for this Server. The information given will not be saved and is only required for the installation of this Package. For this reason alone, further FTP Username and Password requests will be needed.]]></item>\r
-               <item name="wcf.global.ftp.accessData"><![CDATA[FTP access information]]></item>\r
-               <item name="wcf.global.ftp.host"><![CDATA[Hostname]]></item>\r
-               <item name="wcf.global.ftp.user"><![CDATA[Username]]></item>\r
-               <item name="wcf.global.ftp.password"><![CDATA[Password]]></item>\r
-               <item name="wcf.global.ftp.error"><![CDATA[A connection to the given FTP server could not be made.]]></item>\r
-               <item name="wcf.global.next"><![CDATA[Loading next step ...]]></item>\r
-               <item name="wcf.global.next.description"><![CDATA[The installation is currently loading the next step, please wait.]]></item>\r
-               <item name="wcf.global.languages"><![CDATA[Choose languages to install]]></item>\r
-               <item name="wcf.global.languages.description"><![CDATA[This Software can support multiple languages. Please choose the languages you would like to install.]]></item>\r
-               <item name="wcf.global.languages.charset"><![CDATA[Character Encoding]]></item>\r
-               <item name="wcf.global.languages.charset.description"><![CDATA[The Character Encoding, also known as the Character Set or the Code page determines the storage type and the representation of the installed languages of this System. Please be aware that once you have set your chosen Character Encoding, this can not be changed afterwards.]]></item>\r
-               \r
-               <!--<item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[ISO-8859-1 is required if you wish to install Western European languages only.]]></item>\r
-               <item name="wcf.global.languages.charset.UTF-8"><![CDATA[UTF-8 is required if you wish to install Western European or any Non-Western European langauges, now or at a later date.]]></item>-->\r
-               \r
-               <item name="wcf.global.languages.charset.UTF-8"><![CDATA[Unicode]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Western European]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-2"><![CDATA[Central European]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-7"><![CDATA[Greek]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-8"><![CDATA[Hebrew]]></item>\r
-               <item name="wcf.global.languages.charset.ISO-8859-9"><![CDATA[Turkish]]></item>\r
-               <item name="wcf.global.languages.charset.EUC-JP"><![CDATA[Japanese]]></item>\r
-               <item name="wcf.global.languages.charset.SJIS"><![CDATA[Japanese]]></item>\r
-               <item name="wcf.global.languages.charset.BIG-5"><![CDATA[Chinese (Traditional)]]></item>\r
-               <item name="wcf.global.languages.charset.CP936"><![CDATA[Chinese (Simplified)]]></item>\r
-               <item name="wcf.global.languages.charset.EUC-CN"><![CDATA[Chinese (Simplified)]]></item>\r
-               <item name="wcf.global.languages.charset.KOI8-R"><![CDATA[Cyrillic]]></item>\r
-               <item name="wcf.global.languages.charset.Windows-1251"><![CDATA[Cyrillic]]></item>\r
-               <item name="wcf.global.languages.charset.EUC-KR"><![CDATA[Korean]]></item>\r
-               \r
-               <item name="wcf.global.languages.languages"><![CDATA[Languages]]></item>\r
-               <item name="wcf.global.languages.error.empty"><![CDATA[Please choose at least one language!]]></item>\r
-               <item name="wcf.global.languages.error.notAvailable"><![CDATA[The languages you have chosen do not correspond to the given Character Encoding you made previously. Please amend your language choice.]]></item>\r
-               <item name="wcf.global.configureDB"><![CDATA[Configure Database access]]></item>\r
-               <item name="wcf.global.configureDB.description"><![CDATA[The Data for this Software needs to be stored in a MySQL Database. Please enter your Database access information!]]></item>\r
-               <item name="wcf.global.configureDB.accessData"><![CDATA[Database access information]]></item>\r
-               <item name="wcf.global.configureDB.host"><![CDATA[Hostname]]></item>\r
-               <item name="wcf.global.configureDB.user"><![CDATA[Username]]></item>\r
-               <item name="wcf.global.configureDB.password"><![CDATA[Password]]></item>\r
-               <item name="wcf.global.configureDB.database"><![CDATA[Database name]]></item>\r
-               <item name="wcf.global.configureDB.number"><![CDATA[Installations number]]></item>\r
-               <item name="wcf.global.configureDB.error"><![CDATA[An Error has accured while trying to connect to your Database:\r
-               <br /><b>{$exception->getMessage()}{if $exception|get_class == 'DatabaseException'}<br />{$exception->getErrorDesc()}{/if}</b>\r
-               <br />Additional information can be found in the WoltLab Error Reference:\r
-               <br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>\r
-               <item name="wcf.global.configureDB.conflictedTables"><![CDATA[The following table{if $conflictedTables|count > 1}s{/if} already exist{if $conflictedTables|count == 1}s{/if} within your &quot;{$dbName}&quot; Database:<br />{implode from=$conflictedTables item="table"}{$table}{/implode}.<br /><br />To solve this problem, please do one of the following:<br />1. Enable the &quot;Overwrite&quot; option below to overwrite {if $conflictedTables|count > 1}these tables{else}this table{/if} and continue the installation with the &quot;Next&quot; Button or<br />2. You re-enter the Database access information, but to a different Database and continue the installation with the &quot;Next&quot; Button or<br />3. You enter a new Installations number, not forgetting to continue the installation with the &quot;Next&quot; Button.]]></item>\r
-               <item name="wcf.global.configureDB.conflictedTables.overwrite"><![CDATA[Overwrite the above listed table{if $conflictedTables|count > 1}s{/if}?]]></item>\r
-               <item name="wcf.global.configureDB.class"><![CDATA[Database type]]></item>\r
-               <item name="wcf.global.configureDB.class.MSSQLDatabase"><![CDATA[Microsoft SQL Server 2008+]]></item>\r
-               <item name="wcf.global.configureDB.class.MySQLDatabase"><![CDATA[MySQL 5.1+]]></item>\r
-               <item name="wcf.global.configureDB.class.PostgreSQLDatabase"><![CDATA[PostgreSQL 8.2+]]></item>\r
-               <item name="wcf.global.createUser"><![CDATA[Create an Administrator]]></item>\r
-               <item name="wcf.global.createUser.description"><![CDATA[The Installation will now generate an Administrator account for you. Please give a username, email address and password.]]></item>\r
-               <item name="wcf.global.createUser.data"><![CDATA[User information]]></item>\r
-               <item name="wcf.global.createUser.username"><![CDATA[Username]]></item>\r
-               <item name="wcf.global.createUser.email"><![CDATA[E-Mail Address]]></item>\r
-               <item name="wcf.global.createUser.confirmEmail"><![CDATA[Confirm E-Mail Address]]></item>\r
-               <item name="wcf.global.createUser.password"><![CDATA[Password]]></item>\r
-               <item name="wcf.global.createUser.confirmPassword"><![CDATA[Confirm Password]]></item>\r
-               <item name="wcf.global.createUser.error"><![CDATA[Errors have accured while registering the User account, please check the marked fields for errors.]]></item>\r
-               <item name="wcf.global.createUser.error.empty"><![CDATA[This field can not be left empty.]]></item>\r
-               <item name="wcf.global.createUser.error.username.notValid"><![CDATA[The Username you have given is invalid. A valid Username must be between 3 and 20 characters long.]]></item>\r
-               <item name="wcf.global.createUser.error.email.notValid"><![CDATA[The E-Mail Address you have given is invalid. A valid E-Mail Address must be in the format of name@domain.tld]]></item>\r
-               <item name="wcf.global.createUser.error.confirmEmail.notEqual"><![CDATA[The E-Mail Addresses you have given are not identical. For security reasons, please make sure that both E-Mail Address fields have been filled in and are identical.]]></item>\r
-               <item name="wcf.global.createUser.error.confirmPassword.notEqual"><![CDATA[The Passwords you have given are not identical. For security reasons, please make sure that both Password fields have been filled in and are identical.]]></item>\r
-               <item name="wcf.global.wcfDir.error"><![CDATA[An Error has accured while extracting the required files:\r
-               <br /><b>{$exception->getMessage()}</b><br />\r
-               Please make sure that the destination folder exists and can be written to.\r
-               <br /><br />Additional information can be found in the WoltLab Error Reference:<br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>\r
-       </category>\r
-</language>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="en">
+       <category name="wcf.global">
+               <item name="wcf.global.pageTitle"><![CDATA[{$setupPackageName} Installation]]></item>
+               <item name="wcf.global.title"><![CDATA[<b>{$setupPackageName}</b><br />Installation]]></item>
+               <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.locale.unix"><![CDATA[en_US]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.locale.win"><![CDATA[english]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.decimalPoint"><![CDATA[.]]></item>
+               <item name="wcf.global.thousandsSeparator"><![CDATA[,]]></item>
+               <item name="wcf.global.button.next"><![CDATA[Next &raquo;]]></item>
+               <item name="wcf.global.progressBar"><![CDATA[{@$progress}% complete]]></item>
+               <item name="wcf.global.dateMethod"><![CDATA[date]]></item> <!-- system variable; do not translate -->
+               <item name="wcf.global.dateFormat"><![CDATA[M jS Y]]></item>
+               <item name="wcf.global.timeFormat"><![CDATA[l, F jS Y, g:ia]]></item>
+               <item name="wcf.global.dateFormatToday"><![CDATA[<b>\T\o\d\a\y</b>, g:ia]]></item>
+               <item name="wcf.global.dateFormatYesterday"><![CDATA[\Y\e\s\t\e\r\d\a\y, g:ia]]></item>
+               <item name="wcf.global.welcome"><![CDATA[Thank you for choosing {$setupPackageName}]]></item>
+               <item name="wcf.global.welcome.description"><![CDATA[This installations-assistant will help you to setup <br /><b>WoltLab Community Framework</b>{if $setupPackageName != 'WoltLab Community Framework'} and <b>{$setupPackageName}</b>{/if}.]]></item>
+               <item name="wcf.global.welcome.language"><![CDATA[Language]]></item>
+               <item name="wcf.global.language.en"><![CDATA[English]]></item>
+               <item name="wcf.global.language.de"><![CDATA[German]]></item>
+               <item name="wcf.global.language.de-informal"><![CDATA[German (Informal)]]></item>
+               <item name="wcf.global.language.fr"><![CDATA[French]]></item>
+               <item name="wcf.global.language.ja"><![CDATA[Japanese]]></item>
+               <item name="wcf.global.language.es"><![CDATA[Spanish]]></item>
+               <item name="wcf.global.language.zh-TW"><![CDATA[Chinese (Traditional)]]></item>
+               <item name="wcf.global.language.zh-CN"><![CDATA[Chinese (Simplified)]]></item>
+               <item name="wcf.global.language.it"><![CDATA[Italian]]></item>
+               <item name="wcf.global.language.nl"><![CDATA[Dutch]]></item>
+               <item name="wcf.global.language.ru"><![CDATA[Russian]]></item>
+               <item name="wcf.global.language.ko"><![CDATA[Korean]]></item>
+               <item name="wcf.global.language.pt"><![CDATA[Portuguese]]></item>
+               <item name="wcf.global.language.pt-BR"><![CDATA[Portuguese (Brazil)]]></item>
+               <item name="wcf.global.language.sv"><![CDATA[Swedish]]></item>
+               <item name="wcf.global.language.pl"><![CDATA[Polish]]></item>
+               <item name="wcf.global.language.da"><![CDATA[Danish]]></item>
+               <item name="wcf.global.language.cs"><![CDATA[Czech]]></item>
+               <item name="wcf.global.language.tr"><![CDATA[Turkish]]></item>
+               <item name="wcf.global.language.hu"><![CDATA[Hungarian]]></item>
+               <item name="wcf.global.language.ar"><![CDATA[Arabic]]></item>
+               <item name="wcf.global.language.he"><![CDATA[Hebrew]]></item>
+               <item name="wcf.global.language.fa"><![CDATA[Persian]]></item>
+               <item name="wcf.global.language.no"><![CDATA[Norwegian]]></item>
+               <item name="wcf.global.language.fi"><![CDATA[Finnish]]></item>
+               <item name="wcf.global.language.ro"><![CDATA[Romanian]]></item>
+               <item name="wcf.global.language.bs"><![CDATA[Bosnian]]></item>
+               <item name="wcf.global.language.hr"><![CDATA[Croatian]]></item>
+               <item name="wcf.global.language.sr"><![CDATA[Serbian]]></item>
+               <item name="wcf.global.language.sk"><![CDATA[Slovak]]></item>
+               <item name="wcf.global.language.el"><![CDATA[Greek]]></item>
+               <item name="wcf.global.welcome.language.description"><![CDATA[The assistants language is currently set to English.]]></item>
+               <item name="wcf.global.welcome.language.change"><![CDATA[Change language]]></item>
+               <item name="wcf.global.license"><![CDATA[License Agreement]]></item>
+               <item name="wcf.global.license.description"><![CDATA[Please read the following License Agreement. Use the scrollbar to view the whole document.]]></item>
+               <item name="wcf.global.license.accept.description"><![CDATA[Do you accept the terms and conditions of the License Agreement? You may only install this software upon acceptance of the License Agreement.]]></item>
+               <item name="wcf.global.license.missingAcception"><![CDATA[You must accept the License Agreement to continue this installation.]]></item>
+               <item name="wcf.global.systemRequirements"><![CDATA[Checking System Requirements]]></item>
+               <item name="wcf.global.systemRequirements.description"><![CDATA[These are the System Requirements:]]></item>
+               <item name="wcf.global.systemRequirements.required"><![CDATA[Required System component]]></item>
+               <item name="wcf.global.systemRequirements.recommended"><![CDATA[Recommended System component]]></item>
+               <item name="wcf.global.systemRequirements.element.required"><![CDATA[Required:]]></item>
+               <item name="wcf.global.systemRequirements.element.yours"><![CDATA[Found:]]></item>
+               <item name="wcf.global.systemRequirements.element.recommended"><![CDATA[Recommended:]]></item>
+               <item name="wcf.global.systemRequirements.php"><![CDATA[Installed version of the Script language &quot;PHP&quot;]]></item>
+               <item name="wcf.global.systemRequirements.php.description"><![CDATA[The installed version of the Script language &quot;PHP&quot; is too old for a stable operation of this Software. To proceed with the installation, a version update is necessary.]]></item>
+               <item name="wcf.global.systemRequirements.php.description2"><![CDATA[Your PHP Version is obsolete. For a stable operation of this Software, we recommend a PHP version of 5.0.5 or greater.]]></item>
+               <item name="wcf.global.systemRequirements.mysql"><![CDATA[&quot;MySQL&quot; Database support]]></item>
+               <item name="wcf.global.systemRequirements.mysql.description"><![CDATA[&quot;MySQL&quot; Database support is required to install this Software.]]></item>
+               <item name="wcf.global.systemRequirements.uploadMaxFilesize"><![CDATA[Maximum size for file uploads]]></item>
+               <item name="wcf.global.systemRequirements.uploadMaxFilesize.description"><![CDATA[The current configuration of the installed &quot;PHP&quot; makes it impossible to upload any files. Due to this configuration, some features of this Software will be restricted.]]></item>
+               <item name="wcf.global.systemRequirements.gdLib"><![CDATA[Installed version of the graphics library &quot;GDLib&quot;]]></item>
+               <item name="wcf.global.systemRequirements.gdLib.description"><![CDATA[The graphics library &quot;GDLib&quot; is needed for the Dynamic Generation of Images. Without this, some features of this Software will not be available.]]></item>
+               <item name="wcf.global.systemRequirements.mbString"><![CDATA[The multibyte character library &quot;MBString&quot;]]></item>
+               <item name="wcf.global.systemRequirements.mbString.description"><![CDATA[Without this library, the Software can only be used with Western European languages.]]></item>
+               <item name="wcf.global.systemRequirements.safeMode"><![CDATA[Security option of &quot;safe mode&quot; in the &quot;PHP&quot; Script language]]></item>
+               <item name="wcf.global.systemRequirements.safeMode.description"><![CDATA[To quarantee the operation of this Software, we recommend to disable the safe mode setting.]]></item>
+               <item name="wcf.global.systemRequirements.ftp"><![CDATA[The data transfer library for FTP]]></item>
+               <item name="wcf.global.systemRequirements.ftp.description"><![CDATA[With the security option of &quot;safe mode&quot; being enabled, the data transfer library is needed for most of the file operations within this Software. We strongly recommend to enable this library.]]></item>
+               <item name="wcf.global.systemRequirements.active"><![CDATA[Enabled]]></item>
+               <item name="wcf.global.systemRequirements.notActive"><![CDATA[Not enabled]]></item>
+               <item name="wcf.global.wcfDir"><![CDATA[Choose the installation folder]]></item>
+               <item name="wcf.global.wcfDir.description"><![CDATA[All files of <b>WoltLab Community Framework</b> will be extracted into the installation folder.]]></item>
+               <item name="wcf.global.wcfDir.foundDirectory"><![CDATA[The installation assistant has found a previous installation of <b>WoltLab Community Framework</b> in the "{$foundDirectory}" folder.<br />If you would like to install a new copy of the <b>WoltLab Community Framework</b>, then please enter an alternative installation folder.]]></item>
+               <item name="wcf.global.wcfDir.dir"><![CDATA[Installation folder]]></item>
+               <item name="wcf.global.wcfDir.dir.description"><![CDATA[Please enter the installation folder for <b>WoltLab Community Framework</b>.]]></item>
+               <item name="wcf.global.wcfDir.url.description"><![CDATA[After installation into the given folder you can access <b>WoltLab Community Framework</b> through the following URL:]]></item>
+               <item name="wcf.global.wcfDir.error.invalid"><![CDATA[The given folder is not valid.]]></item>
+               <item name="wcf.global.ftp"><![CDATA[FTP access information]]></item>
+               <item name="wcf.global.ftp.description"><![CDATA[With the PHP-SafeMode security option being enabled, WoltLab Community Framework can only be installed using FTP functionality. Please enter here the FTP Username and Password for this Server. The information given will not be saved and is only required for the installation of this Package. For this reason alone, further FTP Username and Password requests will be needed.]]></item>
+               <item name="wcf.global.ftp.accessData"><![CDATA[FTP access information]]></item>
+               <item name="wcf.global.ftp.host"><![CDATA[Hostname]]></item>
+               <item name="wcf.global.ftp.user"><![CDATA[Username]]></item>
+               <item name="wcf.global.ftp.password"><![CDATA[Password]]></item>
+               <item name="wcf.global.ftp.error"><![CDATA[A connection to the given FTP server could not be made.]]></item>
+               <item name="wcf.global.next"><![CDATA[Loading next step ...]]></item>
+               <item name="wcf.global.next.description"><![CDATA[The installation is currently loading the next step, please wait.]]></item>
+               <item name="wcf.global.languages"><![CDATA[Choose languages to install]]></item>
+               <item name="wcf.global.languages.description"><![CDATA[This Software can support multiple languages. Please choose the languages you would like to install.]]></item>
+               <item name="wcf.global.languages.charset"><![CDATA[Character Encoding]]></item>
+               <item name="wcf.global.languages.charset.description"><![CDATA[The Character Encoding, also known as the Character Set or the Code page determines the storage type and the representation of the installed languages of this System. Please be aware that once you have set your chosen Character Encoding, this can not be changed afterwards.]]></item>
+               
+               <!--<item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[ISO-8859-1 is required if you wish to install Western European languages only.]]></item>
+               <item name="wcf.global.languages.charset.UTF-8"><![CDATA[UTF-8 is required if you wish to install Western European or any Non-Western European langauges, now or at a later date.]]></item>-->
+               
+               <item name="wcf.global.languages.charset.UTF-8"><![CDATA[Unicode]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Western European]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-2"><![CDATA[Central European]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-7"><![CDATA[Greek]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-8"><![CDATA[Hebrew]]></item>
+               <item name="wcf.global.languages.charset.ISO-8859-9"><![CDATA[Turkish]]></item>
+               <item name="wcf.global.languages.charset.EUC-JP"><![CDATA[Japanese]]></item>
+               <item name="wcf.global.languages.charset.SJIS"><![CDATA[Japanese]]></item>
+               <item name="wcf.global.languages.charset.BIG-5"><![CDATA[Chinese (Traditional)]]></item>
+               <item name="wcf.global.languages.charset.CP936"><![CDATA[Chinese (Simplified)]]></item>
+               <item name="wcf.global.languages.charset.EUC-CN"><![CDATA[Chinese (Simplified)]]></item>
+               <item name="wcf.global.languages.charset.KOI8-R"><![CDATA[Cyrillic]]></item>
+               <item name="wcf.global.languages.charset.Windows-1251"><![CDATA[Cyrillic]]></item>
+               <item name="wcf.global.languages.charset.EUC-KR"><![CDATA[Korean]]></item>
+               
+               <item name="wcf.global.languages.languages"><![CDATA[Languages]]></item>
+               <item name="wcf.global.languages.error.empty"><![CDATA[Please choose at least one language!]]></item>
+               <item name="wcf.global.languages.error.notAvailable"><![CDATA[The languages you have chosen do not correspond to the given Character Encoding you made previously. Please amend your language choice.]]></item>
+               <item name="wcf.global.configureDB"><![CDATA[Configure Database access]]></item>
+               <item name="wcf.global.configureDB.description"><![CDATA[The Data for this Software needs to be stored in a MySQL Database. Please enter your Database access information!]]></item>
+               <item name="wcf.global.configureDB.accessData"><![CDATA[Database access information]]></item>
+               <item name="wcf.global.configureDB.host"><![CDATA[Hostname]]></item>
+               <item name="wcf.global.configureDB.user"><![CDATA[Username]]></item>
+               <item name="wcf.global.configureDB.password"><![CDATA[Password]]></item>
+               <item name="wcf.global.configureDB.database"><![CDATA[Database name]]></item>
+               <item name="wcf.global.configureDB.number"><![CDATA[Installations number]]></item>
+               <item name="wcf.global.configureDB.error"><![CDATA[An Error has accured while trying to connect to your Database:
+               <br /><b>{$exception->getMessage()}{if $exception|get_class == 'DatabaseException'}<br />{$exception->getErrorDesc()}{/if}</b>
+               <br />Additional information can be found in the WoltLab Error Reference:
+               <br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>
+               <item name="wcf.global.configureDB.conflictedTables"><![CDATA[The following table{if $conflictedTables|count > 1}s{/if} already exist{if $conflictedTables|count == 1}s{/if} within your &quot;{$dbName}&quot; Database:<br />{implode from=$conflictedTables item="table"}{$table}{/implode}.<br /><br />To solve this problem, please do one of the following:<br />1. Enable the &quot;Overwrite&quot; option below to overwrite {if $conflictedTables|count > 1}these tables{else}this table{/if} and continue the installation with the &quot;Next&quot; Button or<br />2. You re-enter the Database access information, but to a different Database and continue the installation with the &quot;Next&quot; Button or<br />3. You enter a new Installations number, not forgetting to continue the installation with the &quot;Next&quot; Button.]]></item>
+               <item name="wcf.global.configureDB.conflictedTables.overwrite"><![CDATA[Overwrite the above listed table{if $conflictedTables|count > 1}s{/if}?]]></item>
+               <item name="wcf.global.configureDB.class"><![CDATA[Database type]]></item>
+               <item name="wcf.global.configureDB.class.MSSQLDatabase"><![CDATA[Microsoft SQL Server 2008+]]></item>
+               <item name="wcf.global.configureDB.class.MySQLDatabase"><![CDATA[MySQL 5.1+]]></item>
+               <item name="wcf.global.configureDB.class.PostgreSQLDatabase"><![CDATA[PostgreSQL 8.2+]]></item>
+               <item name="wcf.global.createUser"><![CDATA[Create an Administrator]]></item>
+               <item name="wcf.global.createUser.description"><![CDATA[The Installation will now generate an Administrator account for you. Please give a username, email address and password.]]></item>
+               <item name="wcf.global.createUser.data"><![CDATA[User information]]></item>
+               <item name="wcf.global.createUser.username"><![CDATA[Username]]></item>
+               <item name="wcf.global.createUser.email"><![CDATA[E-Mail Address]]></item>
+               <item name="wcf.global.createUser.confirmEmail"><![CDATA[Confirm E-Mail Address]]></item>
+               <item name="wcf.global.createUser.password"><![CDATA[Password]]></item>
+               <item name="wcf.global.createUser.confirmPassword"><![CDATA[Confirm Password]]></item>
+               <item name="wcf.global.createUser.error"><![CDATA[Errors have accured while registering the User account, please check the marked fields for errors.]]></item>
+               <item name="wcf.global.createUser.error.empty"><![CDATA[This field can not be left empty.]]></item>
+               <item name="wcf.global.createUser.error.username.notValid"><![CDATA[The Username you have given is invalid. A valid Username must be between 3 and 20 characters long.]]></item>
+               <item name="wcf.global.createUser.error.email.notValid"><![CDATA[The E-Mail Address you have given is invalid. A valid E-Mail Address must be in the format of name@domain.tld]]></item>
+               <item name="wcf.global.createUser.error.confirmEmail.notEqual"><![CDATA[The E-Mail Addresses you have given are not identical. For security reasons, please make sure that both E-Mail Address fields have been filled in and are identical.]]></item>
+               <item name="wcf.global.createUser.error.confirmPassword.notEqual"><![CDATA[The Passwords you have given are not identical. For security reasons, please make sure that both Password fields have been filled in and are identical.]]></item>
+               <item name="wcf.global.wcfDir.error"><![CDATA[An Error has accured while extracting the required files:
+               <br /><b>{$exception->getMessage()}</b><br />
+               Please make sure that the destination folder exists and can be written to.
+               <br /><br />Additional information can be found in the WoltLab Error Reference:<br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>
+       </category>
+</language>
index b87303c39a7b176c5077c9122d6d00c1746a8ad1..fc8a5de7edf437cdc98a216370faf7c757279bcb 100644 (file)
-                  GNU LESSER GENERAL PUBLIC LICENSE\r
-                       Version 3, 29 June 2007\r
-\r
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\r
- Everyone is permitted to copy and distribute verbatim copies\r
- of this license document, but changing it is not allowed.\r
-\r
-\r
-  This version of the GNU Lesser General Public License incorporates\r
-the terms and conditions of version 3 of the GNU General Public\r
-License, supplemented by the additional permissions listed below.\r
-\r
-  0. Additional Definitions. \r
-\r
-  As used herein, "this License" refers to version 3 of the GNU Lesser\r
-General Public License, and the "GNU GPL" refers to version 3 of the GNU\r
-General Public License.\r
-\r
-  "The Library" refers to a covered work governed by this License,\r
-other than an Application or a Combined Work as defined below.\r
-\r
-  An "Application" is any work that makes use of an interface provided\r
-by the Library, but which is not otherwise based on the Library.\r
-Defining a subclass of a class defined by the Library is deemed a mode\r
-of using an interface provided by the Library.\r
-\r
-  A "Combined Work" is a work produced by combining or linking an\r
-Application with the Library.  The particular version of the Library\r
-with which the Combined Work was made is also called the "Linked\r
-Version".\r
-\r
-  The "Minimal Corresponding Source" for a Combined Work means the\r
-Corresponding Source for the Combined Work, excluding any source code\r
-for portions of the Combined Work that, considered in isolation, are\r
-based on the Application, and not on the Linked Version.\r
-\r
-  The "Corresponding Application Code" for a Combined Work means the\r
-object code and/or source code for the Application, including any data\r
-and utility programs needed for reproducing the Combined Work from the\r
-Application, but excluding the System Libraries of the Combined Work.\r
-\r
-  1. Exception to Section 3 of the GNU GPL.\r
-\r
-  You may convey a covered work under sections 3 and 4 of this License\r
-without being bound by section 3 of the GNU GPL.\r
-\r
-  2. Conveying Modified Versions.\r
-\r
-  If you modify a copy of the Library, and, in your modifications, a\r
-facility refers to a function or data to be supplied by an Application\r
-that uses the facility (other than as an argument passed when the\r
-facility is invoked), then you may convey a copy of the modified\r
-version:\r
-\r
-   a) under this License, provided that you make a good faith effort to\r
-   ensure that, in the event an Application does not supply the\r
-   function or data, the facility still operates, and performs\r
-   whatever part of its purpose remains meaningful, or\r
-\r
-   b) under the GNU GPL, with none of the additional permissions of\r
-   this License applicable to that copy.\r
-\r
-  3. Object Code Incorporating Material from Library Header Files.\r
-\r
-  The object code form of an Application may incorporate material from\r
-a header file that is part of the Library.  You may convey such object\r
-code under terms of your choice, provided that, if the incorporated\r
-material is not limited to numerical parameters, data structure\r
-layouts and accessors, or small macros, inline functions and templates\r
-(ten or fewer lines in length), you do both of the following:\r
-\r
-   a) Give prominent notice with each copy of the object code that the\r
-   Library is used in it and that the Library and its use are\r
-   covered by this License.\r
-\r
-   b) Accompany the object code with a copy of the GNU GPL and this license\r
-   document.\r
-\r
-  4. Combined Works.\r
-\r
-  You may convey a Combined Work under terms of your choice that,\r
-taken together, effectively do not restrict modification of the\r
-portions of the Library contained in the Combined Work and reverse\r
-engineering for debugging such modifications, if you also do each of\r
-the following:\r
-\r
-   a) Give prominent notice with each copy of the Combined Work that\r
-   the Library is used in it and that the Library and its use are\r
-   covered by this License.\r
-\r
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license\r
-   document.\r
-\r
-   c) For a Combined Work that displays copyright notices during\r
-   execution, include the copyright notice for the Library among\r
-   these notices, as well as a reference directing the user to the\r
-   copies of the GNU GPL and this license document.\r
-\r
-   d) Do one of the following:\r
-\r
-       0) Convey the Minimal Corresponding Source under the terms of this\r
-       License, and the Corresponding Application Code in a form\r
-       suitable for, and under terms that permit, the user to\r
-       recombine or relink the Application with a modified version of\r
-       the Linked Version to produce a modified Combined Work, in the\r
-       manner specified by section 6 of the GNU GPL for conveying\r
-       Corresponding Source.\r
-\r
-       1) Use a suitable shared library mechanism for linking with the\r
-       Library.  A suitable mechanism is one that (a) uses at run time\r
-       a copy of the Library already present on the user's computer\r
-       system, and (b) will operate properly with a modified version\r
-       of the Library that is interface-compatible with the Linked\r
-       Version. \r
-\r
-   e) Provide Installation Information, but only if you would otherwise\r
-   be required to provide such information under section 6 of the\r
-   GNU GPL, and only to the extent that such information is\r
-   necessary to install and execute a modified version of the\r
-   Combined Work produced by recombining or relinking the\r
-   Application with a modified version of the Linked Version. (If\r
-   you use option 4d0, the Installation Information must accompany\r
-   the Minimal Corresponding Source and Corresponding Application\r
-   Code. If you use option 4d1, you must provide the Installation\r
-   Information in the manner specified by section 6 of the GNU GPL\r
-   for conveying Corresponding Source.)\r
-\r
-  5. Combined Libraries.\r
-\r
-  You may place library facilities that are a work based on the\r
-Library side by side in a single library together with other library\r
-facilities that are not Applications and are not covered by this\r
-License, and convey such a combined library under terms of your\r
-choice, if you do both of the following:\r
-\r
-   a) Accompany the combined library with a copy of the same work based\r
-   on the Library, uncombined with any other library facilities,\r
-   conveyed under the terms of this License.\r
-\r
-   b) Give prominent notice with the combined library that part of it\r
-   is a work based on the Library, and explaining where to find the\r
-   accompanying uncombined form of the same work.\r
-\r
-  6. Revised Versions of the GNU Lesser General Public License.\r
-\r
-  The Free Software Foundation may publish revised and/or new versions\r
-of the GNU Lesser General Public License from time to time. Such new\r
-versions will be similar in spirit to the present version, but may\r
-differ in detail to address new problems or concerns.\r
-\r
-  Each version is given a distinguishing version number. If the\r
-Library as you received it specifies that a certain numbered version\r
-of the GNU Lesser General Public License "or any later version"\r
-applies to it, you have the option of following the terms and\r
-conditions either of that published version or of any later version\r
-published by the Free Software Foundation. If the Library as you\r
-received it does not specify a version number of the GNU Lesser\r
-General Public License, you may choose any version of the GNU Lesser\r
-General Public License ever published by the Free Software Foundation.\r
-\r
-  If the Library as you received it specifies that a proxy can decide\r
-whether future versions of the GNU Lesser General Public License shall\r
-apply, that proxy's public statement of acceptance of any version is\r
-permanent authorization for you to choose that version for the\r
-Library.\r
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions. 
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version. 
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
index a857e156f59bf5b3bec46dcf484d34b140992453..c73018d9d3c568876240c7a53d176310506b1914 100644 (file)
@@ -1,6 +1,6 @@
-               <div class="copyright">\r
-                       <span>Copyright &copy; 2001-2011 WoltLab&reg; GmbH</span>\r
-               </div>\r
-       </div>\r
-</body>\r
+               <div class="copyright">
+                       <span>Copyright &copy; 2001-2011 WoltLab&reg; GmbH</span>
+               </div>
+       </div>
+</body>
 </html>
\ No newline at end of file
index 7b386b5213ff15442f1f2805209afe26a9f451d1..04d2e40e7d1fa1284532e24310656168a6737cb3 100644 (file)
@@ -1,78 +1,78 @@
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.configureDB{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.configureDB.description{/lang}</p>\r
-\r
-{if $exception|isset}\r
-       <p class="error">{lang}wcf.global.configureDB.error{/lang}</p>\r
-{/if}\r
-\r
-{if $conflictedTables|isset}\r
-<p class="error">\r
-       {lang}wcf.global.configureDB.conflictedTables{/lang}\r
-</p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
-       <fieldset>\r
-               <legend>{lang}wcf.global.configureDB.accessData{/lang}</legend>\r
-               \r
-               <div class="inner">\r
-                       <div>\r
-                               <label for="dbClass">{lang}wcf.global.configureDB.class{/lang}</label>\r
-                               <select name="dbClass" id="dbClass">\r
-                                       {foreach from=$availableDBClasses key=dbClassName item=availableDBClass}\r
-                                               <option value="{@$availableDBClass.class}"{if $availableDBClass.class == $dbClass} selected="selected"{/if}>{lang}wcf.global.configureDB.class.{@$dbClassName}{/lang}</option>\r
-                                       {/foreach}\r
-                               </select>\r
-                       </div>\r
-\r
-                       <div>\r
-                               <label for="dbHost">{lang}wcf.global.configureDB.host{/lang}</label>\r
-                               <input type="text" class="inputText" id="dbHost" name="dbHost" value="{$dbHost}" style="width: 100%;" />\r
-                       </div>\r
-                       \r
-                       <div>\r
-                               <label for="dbUser">{lang}wcf.global.configureDB.user{/lang}</label>\r
-                               <input type="text" class="inputText" id="dbUser" name="dbUser" value="{$dbUser}" style="width: 100%;" />\r
-                       </div>\r
-                       \r
-                       <div>\r
-                               <label for="dbPassword">{lang}wcf.global.configureDB.password{/lang}</label>\r
-                               <input type="password" class="inputText" id="dbPassword" name="dbPassword" value="{$dbPassword}" style="width: 100%;" />\r
-                       </div>\r
-                       \r
-                       <div>\r
-                               <label for="dbName">{lang}wcf.global.configureDB.database{/lang}</label>\r
-                               <input type="text" class="inputText" id="dbName" name="dbName" value="{$dbName}" style="width: 100%;" />\r
-                       </div>\r
-                       \r
-                       <div>\r
-                               <label for="dbNumber">{lang}wcf.global.configureDB.number{/lang}</label>\r
-                               <input type="text" class="inputText" id="dbNumber" name="dbNumber" value="{$dbNumber}" style="width: 100%;" />\r
-                       </div>\r
-                       \r
-                       {if $conflictedTables|isset}\r
-                       <div>\r
-                               <label><input type="checkbox" name="overwriteTables" value="1" /> {lang}wcf.global.configureDB.conflictedTables.overwrite{/lang}</label>\r
-                       </div>\r
-                       {/if}\r
-               </div>\r
-       </fieldset>\r
-       \r
-       <div class="nextButton">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
-               <input type="hidden" name="send" value="1" />\r
-               <input type="hidden" name="step" value="{@$nextStep}" />\r
-               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-               <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
-               <input type="hidden" name="wcfDir" value="{$wcfDir}" />\r
-               <input type="hidden" name="dev" value="{@$developerMode}" />\r
-               {foreach from=$selectedLanguages item=language}\r
-                       <input type="hidden" name="selectedLanguages[]" value="{$language}" />\r
-               {/foreach}\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.configureDB{/lang}</h2>
+
+<p>{lang}wcf.global.configureDB.description{/lang}</p>
+
+{if $exception|isset}
+       <p class="error">{lang}wcf.global.configureDB.error{/lang}</p>
+{/if}
+
+{if $conflictedTables|isset}
+<p class="error">
+       {lang}wcf.global.configureDB.conflictedTables{/lang}
+</p>
+{/if}
+
+<form method="post" action="install.php">
+       <fieldset>
+               <legend>{lang}wcf.global.configureDB.accessData{/lang}</legend>
+               
+               <div class="inner">
+                       <div>
+                               <label for="dbClass">{lang}wcf.global.configureDB.class{/lang}</label>
+                               <select name="dbClass" id="dbClass">
+                                       {foreach from=$availableDBClasses key=dbClassName item=availableDBClass}
+                                               <option value="{@$availableDBClass.class}"{if $availableDBClass.class == $dbClass} selected="selected"{/if}>{lang}wcf.global.configureDB.class.{@$dbClassName}{/lang}</option>
+                                       {/foreach}
+                               </select>
+                       </div>
+
+                       <div>
+                               <label for="dbHost">{lang}wcf.global.configureDB.host{/lang}</label>
+                               <input type="text" class="inputText" id="dbHost" name="dbHost" value="{$dbHost}" style="width: 100%;" />
+                       </div>
+                       
+                       <div>
+                               <label for="dbUser">{lang}wcf.global.configureDB.user{/lang}</label>
+                               <input type="text" class="inputText" id="dbUser" name="dbUser" value="{$dbUser}" style="width: 100%;" />
+                       </div>
+                       
+                       <div>
+                               <label for="dbPassword">{lang}wcf.global.configureDB.password{/lang}</label>
+                               <input type="password" class="inputText" id="dbPassword" name="dbPassword" value="{$dbPassword}" style="width: 100%;" />
+                       </div>
+                       
+                       <div>
+                               <label for="dbName">{lang}wcf.global.configureDB.database{/lang}</label>
+                               <input type="text" class="inputText" id="dbName" name="dbName" value="{$dbName}" style="width: 100%;" />
+                       </div>
+                       
+                       <div>
+                               <label for="dbNumber">{lang}wcf.global.configureDB.number{/lang}</label>
+                               <input type="text" class="inputText" id="dbNumber" name="dbNumber" value="{$dbNumber}" style="width: 100%;" />
+                       </div>
+                       
+                       {if $conflictedTables|isset}
+                       <div>
+                               <label><input type="checkbox" name="overwriteTables" value="1" /> {lang}wcf.global.configureDB.conflictedTables.overwrite{/lang}</label>
+                       </div>
+                       {/if}
+               </div>
+       </fieldset>
+       
+       <div class="nextButton">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+               <input type="hidden" name="send" value="1" />
+               <input type="hidden" name="step" value="{@$nextStep}" />
+               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+               <input type="hidden" name="languageCode" value="{@$languageCode}" />
+               <input type="hidden" name="wcfDir" value="{$wcfDir}" />
+               <input type="hidden" name="dev" value="{@$developerMode}" />
+               {foreach from=$selectedLanguages item=language}
+                       <input type="hidden" name="selectedLanguages[]" value="{$language}" />
+               {/foreach}
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index 068757a0acd883a81129e609fe616fa4b5c31599..e17fb263f3399e733076433da274d86685f88b90 100644 (file)
@@ -1,82 +1,82 @@
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.createUser{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.createUser.description{/lang}</p>\r
-\r
-{if $errorField}\r
-<p class="error">{lang}wcf.global.createUser.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
-       <fieldset>\r
-               <legend>{lang}wcf.global.createUser.data{/lang}</legend>\r
-               \r
-               <div class="inner">\r
-                       <div{if $errorField == 'username'} class="errorField"{/if}>\r
-                               <label for="username">{lang}wcf.global.createUser.username{/lang}</label>\r
-                               <input type="text" class="inputText" id="username" name="username" value="{$username}" style="width: 100%;" />\r
-                               {if $errorField == 'username'}\r
-                                       <p>\r
-                                               {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}\r
-                                               {if $errorType == 'notValid'}{lang}wcf.global.createUser.error.username.notValid{/lang}{/if}\r
-                                       </p>\r
-                               {/if}\r
-                       </div>\r
-                       \r
-                       <div{if $errorField == 'email'} class="errorField"{/if}>\r
-                               <label for="email">{lang}wcf.global.createUser.email{/lang}</label>\r
-                               <input type="text" class="inputText" id="email" name="email" value="{$email}" style="width: 100%;" />\r
-                               {if $errorField == 'email'}\r
-                                       <p>\r
-                                               {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}\r
-                                               {if $errorType == 'notValid'}{lang}wcf.global.createUser.error.email.notValid{/lang}{/if}\r
-                                       </p>\r
-                               {/if}\r
-                       </div>\r
-                       \r
-                       <div{if $errorField == 'confirmEmail'} class="errorField"{/if}>\r
-                               <label for="confirmEmail">{lang}wcf.global.createUser.confirmEmail{/lang}</label>\r
-                               <input type="text" class="inputText" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" style="width: 100%;" />\r
-                               {if $errorField == 'confirmEmail'}\r
-                                       <p>\r
-                                               {if $errorType == 'notEqual'}{lang}wcf.global.createUser.error.confirmEmail.notEqual{/lang}{/if}\r
-                                       </p>\r
-                               {/if}\r
-                       </div>\r
-                       \r
-                       <div{if $errorField == 'password'} class="errorField"{/if}>\r
-                               <label for="password">{lang}wcf.global.createUser.password{/lang}</label>\r
-                               <input type="password" class="inputText" id="password" name="password" value="{$password}" style="width: 100%;" />\r
-                               {if $errorField == 'password'}\r
-                                       <p>\r
-                                               {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}\r
-                                       </p>\r
-                               {/if}\r
-                       </div>\r
-                       \r
-                       <div{if $errorField == 'confirmPassword'} class="errorField"{/if}>\r
-                               <label for="confirmPassword">{lang}wcf.global.createUser.confirmPassword{/lang}</label>\r
-                               <input type="password" class="inputText" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" style="width: 100%;" />\r
-                               {if $errorField == 'confirmPassword'}\r
-                                       <p>\r
-                                               {if $errorType == 'notEqual'}{lang}wcf.global.createUser.error.confirmPassword.notEqual{/lang}{/if}\r
-                                       </p>\r
-                               {/if}\r
-                       </div>\r
-                       \r
-               </div>\r
-       </fieldset>\r
-       \r
-       <div class="nextButton">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
-               <input type="hidden" name="send" value="1" />\r
-               <input type="hidden" name="step" value="{@$nextStep}" />\r
-               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-               <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
-               <input type="hidden" name="wcfDir" value="{$wcfDir}" />\r
-               <input type="hidden" name="dev" value="{@$developerMode}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.createUser{/lang}</h2>
+
+<p>{lang}wcf.global.createUser.description{/lang}</p>
+
+{if $errorField}
+<p class="error">{lang}wcf.global.createUser.error{/lang}</p>
+{/if}
+
+<form method="post" action="install.php">
+       <fieldset>
+               <legend>{lang}wcf.global.createUser.data{/lang}</legend>
+               
+               <div class="inner">
+                       <div{if $errorField == 'username'} class="errorField"{/if}>
+                               <label for="username">{lang}wcf.global.createUser.username{/lang}</label>
+                               <input type="text" class="inputText" id="username" name="username" value="{$username}" style="width: 100%;" />
+                               {if $errorField == 'username'}
+                                       <p>
+                                               {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}
+                                               {if $errorType == 'notValid'}{lang}wcf.global.createUser.error.username.notValid{/lang}{/if}
+                                       </p>
+                               {/if}
+                       </div>
+                       
+                       <div{if $errorField == 'email'} class="errorField"{/if}>
+                               <label for="email">{lang}wcf.global.createUser.email{/lang}</label>
+                               <input type="text" class="inputText" id="email" name="email" value="{$email}" style="width: 100%;" />
+                               {if $errorField == 'email'}
+                                       <p>
+                                               {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}
+                                               {if $errorType == 'notValid'}{lang}wcf.global.createUser.error.email.notValid{/lang}{/if}
+                                       </p>
+                               {/if}
+                       </div>
+                       
+                       <div{if $errorField == 'confirmEmail'} class="errorField"{/if}>
+                               <label for="confirmEmail">{lang}wcf.global.createUser.confirmEmail{/lang}</label>
+                               <input type="text" class="inputText" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" style="width: 100%;" />
+                               {if $errorField == 'confirmEmail'}
+                                       <p>
+                                               {if $errorType == 'notEqual'}{lang}wcf.global.createUser.error.confirmEmail.notEqual{/lang}{/if}
+                                       </p>
+                               {/if}
+                       </div>
+                       
+                       <div{if $errorField == 'password'} class="errorField"{/if}>
+                               <label for="password">{lang}wcf.global.createUser.password{/lang}</label>
+                               <input type="password" class="inputText" id="password" name="password" value="{$password}" style="width: 100%;" />
+                               {if $errorField == 'password'}
+                                       <p>
+                                               {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}
+                                       </p>
+                               {/if}
+                       </div>
+                       
+                       <div{if $errorField == 'confirmPassword'} class="errorField"{/if}>
+                               <label for="confirmPassword">{lang}wcf.global.createUser.confirmPassword{/lang}</label>
+                               <input type="password" class="inputText" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" style="width: 100%;" />
+                               {if $errorField == 'confirmPassword'}
+                                       <p>
+                                               {if $errorType == 'notEqual'}{lang}wcf.global.createUser.error.confirmPassword.notEqual{/lang}{/if}
+                                       </p>
+                               {/if}
+                       </div>
+                       
+               </div>
+       </fieldset>
+       
+       <div class="nextButton">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+               <input type="hidden" name="send" value="1" />
+               <input type="hidden" name="step" value="{@$nextStep}" />
+               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+               <input type="hidden" name="languageCode" value="{@$languageCode}" />
+               <input type="hidden" name="wcfDir" value="{$wcfDir}" />
+               <input type="hidden" name="dev" value="{@$developerMode}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index 2efe45e8044a23104bea9f81f9ccdf2be7ba775a..d23279c0f0ca9e4a883496d0517fe144ccc28c8e 100644 (file)
@@ -1,25 +1,25 @@
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.next{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.next.description{/lang}</p>\r
-\r
-<hr />\r
-\r
-<form method="get" action="{@RELATIVE_WCF_DIR}acp/index.php">\r
-       <div class="nextButton">\r
-               <input type="submit" name="nextButton" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
-               {@SID_INPUT_TAG}\r
-       </div>\r
-</form>\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       window.onload = function() {\r
-               document.forms[0].nextButton.disabled = true;\r
-               document.forms[0].submit();\r
-       }\r
-       //]]>\r
-</script>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.next{/lang}</h2>
+
+<p>{lang}wcf.global.next.description{/lang}</p>
+
+<hr />
+
+<form method="get" action="{@RELATIVE_WCF_DIR}acp/index.php">
+       <div class="nextButton">
+               <input type="submit" name="nextButton" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+               {@SID_INPUT_TAG}
+       </div>
+</form>
+
+<script type="text/javascript">
+       //<![CDATA[
+       window.onload = function() {
+               document.forms[0].nextButton.disabled = true;
+               document.forms[0].submit();
+       }
+       //]]>
+</script>
+
 {include file='footer'}
\ No newline at end of file
index 5d3b88ac9bb1770d5057c3d35a9261b533217ba5..e3c5372a6367ae597688559bbd1db51ef2cf3d7c 100644 (file)
@@ -1,32 +1,32 @@
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.next{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.next.description{/lang}</p>\r
-\r
-<hr />\r
-\r
-<form method="post" action="install.php?step={@$nextStep}">\r
-       <div class="nextButton">\r
-               <input type="submit" name="nextButton" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
-               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-               <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
-               <input type="hidden" name="wcfDir" value="{$wcfDir}" />\r
-               <input type="hidden" name="dev" value="{@$developerMode}" />\r
-               {foreach from=$selectedLanguages item=language}\r
-                       <input type="hidden" name="selectedLanguages[]" value="{$language}" />\r
-               {/foreach}\r
-       </div>\r
-</form>\r
-\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       window.onload = function() {\r
-               document.forms[0].nextButton.disabled = true;\r
-               document.forms[0].submit();\r
-       }\r
-       //]]>\r
-</script>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.next{/lang}</h2>
+
+<p>{lang}wcf.global.next.description{/lang}</p>
+
+<hr />
+
+<form method="post" action="install.php?step={@$nextStep}">
+       <div class="nextButton">
+               <input type="submit" name="nextButton" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+               <input type="hidden" name="languageCode" value="{@$languageCode}" />
+               <input type="hidden" name="wcfDir" value="{$wcfDir}" />
+               <input type="hidden" name="dev" value="{@$developerMode}" />
+               {foreach from=$selectedLanguages item=language}
+                       <input type="hidden" name="selectedLanguages[]" value="{$language}" />
+               {/foreach}
+       </div>
+</form>
+
+
+<script type="text/javascript">
+       //<![CDATA[
+       window.onload = function() {
+               document.forms[0].nextButton.disabled = true;
+               document.forms[0].submit();
+       }
+       //]]>
+</script>
+
 {include file='footer'}
\ No newline at end of file
index ce2a3ab72675cf28e007b14d3baede9d9fbe47a0..099d905a98854cafc098c4469a02a27f2a0f0439 100644 (file)
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.wcfDir{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.wcfDir.description{/lang}</p>\r
-\r
-{if $foundDirectory}\r
-       <p>{lang}wcf.global.wcfDir.foundDirectory{/lang}</p>\r
-{/if}\r
-\r
-{if $exception|isset}\r
-       <p class="error">\r
-               {lang}wcf.global.wcfDir.error{/lang}\r
-       </p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
-       <fieldset>\r
-               <legend>{lang}wcf.global.wcfDir.dir{/lang}</legend>\r
-               \r
-               <div class="inner">\r
-                       <div>\r
-                               <label for="wcfDir">{lang}wcf.global.wcfDir.dir.description{/lang}</label>\r
-                               <input type="text" class="inputText" id="wcfDir" name="wcfDir" value="{$wcfDir}" style="width: 100%;" />\r
-                       </div>\r
-                       <div>\r
-                               <label for="wcfUrl">{lang}wcf.global.wcfDir.url.description{/lang}</label>\r
-                               <input type="text" class="inputText" id="wcfUrl" name="wcfUrl" value="" style="width: 100%;" readonly="readonly" />\r
-                       </div>\r
-               </div>\r
-       </fieldset>\r
-       \r
-       <div class="nextButton">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
-               <input type="hidden" name="step" value="{@$nextStep}" />\r
-               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-               <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
-               <input type="hidden" name="dev" value="{@$developerMode}" />\r
-       </div>\r
-</form>\r
-\r
-<script type="text/javascript">\r
-       //<![CDATA[\r
-       // data\r
-       var domainName = '{@$domainName|encodeJS}';\r
-       var installScriptDir = '{@$installScriptDir|encodeJS}';\r
-       var installScriptUrl = '{@$installScriptUrl|encodeJS}';\r
-       var invalidErrorMessage = '{lang}wcf.global.wcfDir.error.invalid{/lang}';\r
-       \r
-       // function\r
-       function refreshWcfUrl() {\r
-               // split paths\r
-               var installScriptDirs = installScriptDir.split('/');\r
-               var wcfDirs = document.getElementById('wcfDir').value.split('/');\r
-               var installScriptUrlDirs = installScriptUrl.split('/');\r
-               \r
-               // remove empty elements\r
-               for (var i = installScriptDirs.length; i >= 0; i--) if (installScriptDirs[i] == '' || installScriptDirs[i] == '.') installScriptDirs.splice(i, 1);\r
-               for (var i = wcfDirs.length; i >= 0; i--) if (wcfDirs[i] == '' || wcfDirs[i] == '.') wcfDirs.splice(i, 1);\r
-               for (var i = installScriptUrlDirs.length; i >= 0; i--) if (installScriptUrlDirs[i] == '') installScriptUrlDirs.splice(i, 1);\r
-               \r
-               // get relative path\r
-               var relativePathDirs = new Array();\r
-               var max = (wcfDirs.length > installScriptDirs.length ? wcfDirs.length : installScriptDirs.length);\r
-               for (var i = 0; i < max; i++) {\r
-                       if (i < installScriptDirs.length && i < wcfDirs.length) {\r
-                               if (installScriptDirs[i] != wcfDirs[i]) {\r
-                                       wcfDirs.splice(0, i);\r
-                                       for (var j = 0; j < installScriptDirs.length - i; j++) relativePathDirs.push('..');\r
-                                       relativePathDirs = relativePathDirs.concat(wcfDirs);\r
-                                       break;\r
-                               }\r
-                       }       \r
-                       // go up one level\r
-                       else if (i < installScriptDirs.length && i >= wcfDirs.length) {\r
-                               relativePathDirs.push('..');\r
-                       }\r
-                       else {\r
-                               relativePathDirs.push(wcfDirs[i]);\r
-                       }\r
-               }\r
-               \r
-               // loop dirs\r
-               for (var i = 0; i < relativePathDirs.length; i++) {\r
-                       if (relativePathDirs[i] == '..') {\r
-                               if (installScriptUrlDirs.length < 1) {\r
-                                       document.getElementById('wcfUrl').value = invalidErrorMessage;\r
-                                       return;\r
-                               }\r
-                               \r
-                               installScriptUrlDirs.pop();\r
-                       }\r
-                       else {\r
-                               installScriptUrlDirs.push(relativePathDirs[i]);\r
-                       }\r
-               }\r
-               \r
-               // implode and show result\r
-               var result = domainName;\r
-               for (var i = 0; i < installScriptUrlDirs.length; i++) result += '/' + installScriptUrlDirs[i];\r
-               document.getElementById('wcfUrl').value = result;\r
-       }\r
-       \r
-       window.onload = function() {\r
-               // set onchange listener\r
-               document.getElementById('wcfDir').onkeyup = function() { refreshWcfUrl(); };\r
-               \r
-               // set onblur listener\r
-               document.getElementById('wcfDir').onblur = function() { refreshWcfUrl(); };\r
-               \r
-               // set default value\r
-               refreshWcfUrl();\r
-       }\r
-       //]]>\r
-</script>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.wcfDir{/lang}</h2>
+
+<p>{lang}wcf.global.wcfDir.description{/lang}</p>
+
+{if $foundDirectory}
+       <p>{lang}wcf.global.wcfDir.foundDirectory{/lang}</p>
+{/if}
+
+{if $exception|isset}
+       <p class="error">
+               {lang}wcf.global.wcfDir.error{/lang}
+       </p>
+{/if}
+
+<form method="post" action="install.php">
+       <fieldset>
+               <legend>{lang}wcf.global.wcfDir.dir{/lang}</legend>
+               
+               <div class="inner">
+                       <div>
+                               <label for="wcfDir">{lang}wcf.global.wcfDir.dir.description{/lang}</label>
+                               <input type="text" class="inputText" id="wcfDir" name="wcfDir" value="{$wcfDir}" style="width: 100%;" />
+                       </div>
+                       <div>
+                               <label for="wcfUrl">{lang}wcf.global.wcfDir.url.description{/lang}</label>
+                               <input type="text" class="inputText" id="wcfUrl" name="wcfUrl" value="" style="width: 100%;" readonly="readonly" />
+                       </div>
+               </div>
+       </fieldset>
+       
+       <div class="nextButton">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+               <input type="hidden" name="step" value="{@$nextStep}" />
+               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+               <input type="hidden" name="languageCode" value="{@$languageCode}" />
+               <input type="hidden" name="dev" value="{@$developerMode}" />
+       </div>
+</form>
+
+<script type="text/javascript">
+       //<![CDATA[
+       // data
+       var domainName = '{@$domainName|encodeJS}';
+       var installScriptDir = '{@$installScriptDir|encodeJS}';
+       var installScriptUrl = '{@$installScriptUrl|encodeJS}';
+       var invalidErrorMessage = '{lang}wcf.global.wcfDir.error.invalid{/lang}';
+       
+       // function
+       function refreshWcfUrl() {
+               // split paths
+               var installScriptDirs = installScriptDir.split('/');
+               var wcfDirs = document.getElementById('wcfDir').value.split('/');
+               var installScriptUrlDirs = installScriptUrl.split('/');
+               
+               // remove empty elements
+               for (var i = installScriptDirs.length; i >= 0; i--) if (installScriptDirs[i] == '' || installScriptDirs[i] == '.') installScriptDirs.splice(i, 1);
+               for (var i = wcfDirs.length; i >= 0; i--) if (wcfDirs[i] == '' || wcfDirs[i] == '.') wcfDirs.splice(i, 1);
+               for (var i = installScriptUrlDirs.length; i >= 0; i--) if (installScriptUrlDirs[i] == '') installScriptUrlDirs.splice(i, 1);
+               
+               // get relative path
+               var relativePathDirs = new Array();
+               var max = (wcfDirs.length > installScriptDirs.length ? wcfDirs.length : installScriptDirs.length);
+               for (var i = 0; i < max; i++) {
+                       if (i < installScriptDirs.length && i < wcfDirs.length) {
+                               if (installScriptDirs[i] != wcfDirs[i]) {
+                                       wcfDirs.splice(0, i);
+                                       for (var j = 0; j < installScriptDirs.length - i; j++) relativePathDirs.push('..');
+                                       relativePathDirs = relativePathDirs.concat(wcfDirs);
+                                       break;
+                               }
+                       }       
+                       // go up one level
+                       else if (i < installScriptDirs.length && i >= wcfDirs.length) {
+                               relativePathDirs.push('..');
+                       }
+                       else {
+                               relativePathDirs.push(wcfDirs[i]);
+                       }
+               }
+               
+               // loop dirs
+               for (var i = 0; i < relativePathDirs.length; i++) {
+                       if (relativePathDirs[i] == '..') {
+                               if (installScriptUrlDirs.length < 1) {
+                                       document.getElementById('wcfUrl').value = invalidErrorMessage;
+                                       return;
+                               }
+                               
+                               installScriptUrlDirs.pop();
+                       }
+                       else {
+                               installScriptUrlDirs.push(relativePathDirs[i]);
+                       }
+               }
+               
+               // implode and show result
+               var result = domainName;
+               for (var i = 0; i < installScriptUrlDirs.length; i++) result += '/' + installScriptUrlDirs[i];
+               document.getElementById('wcfUrl').value = result;
+       }
+       
+       window.onload = function() {
+               // set onchange listener
+               document.getElementById('wcfDir').onkeyup = function() { refreshWcfUrl(); };
+               
+               // set onblur listener
+               document.getElementById('wcfDir').onblur = function() { refreshWcfUrl(); };
+               
+               // set default value
+               refreshWcfUrl();
+       }
+       //]]>
+</script>
+
 {include file='footer'}
\ No newline at end of file
index 5b0542367fec98a4f0895693c0f8528e99b476ef..c3cad3ad540eab698dfa85d2112fe0f3e98c2171 100644 (file)
@@ -1,36 +1,36 @@
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.languages{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.languages.description{/lang}</p>\r
-\r
-{if $errorField}\r
-       <p class="error">{if $errorType == 'empty'}{lang}wcf.global.languages.error.empty{/lang}{/if}</p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
-       <fieldset>\r
-               <legend>{lang}wcf.global.languages.languages{/lang}</legend>\r
-               \r
-               <div class="inner">\r
-                       <ul class="languages">\r
-                               {foreach from=$languages key=language item=languageName}\r
-                                       <li><label><input type="checkbox" name="selectedLanguages[]" value="{@$language}" {if $language|in_array:$selectedLanguages}checked="checked" {/if}/> {@$languageName}</label></li>\r
-                               {/foreach}\r
-                       </ul>\r
-                       <br style="clear: both" />\r
-               </div>\r
-       </fieldset>\r
-       \r
-       <div class="nextButton">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
-               <input type="hidden" name="send" value="1" />\r
-               <input type="hidden" name="step" value="{@$nextStep}" />\r
-               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-               <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
-               <input type="hidden" name="wcfDir" value="{$wcfDir}" />\r
-               <input type="hidden" name="dev" value="{@$developerMode}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.languages{/lang}</h2>
+
+<p>{lang}wcf.global.languages.description{/lang}</p>
+
+{if $errorField}
+       <p class="error">{if $errorType == 'empty'}{lang}wcf.global.languages.error.empty{/lang}{/if}</p>
+{/if}
+
+<form method="post" action="install.php">
+       <fieldset>
+               <legend>{lang}wcf.global.languages.languages{/lang}</legend>
+               
+               <div class="inner">
+                       <ul class="languages">
+                               {foreach from=$languages key=language item=languageName}
+                                       <li><label><input type="checkbox" name="selectedLanguages[]" value="{@$language}" {if $language|in_array:$selectedLanguages}checked="checked" {/if}/> {@$languageName}</label></li>
+                               {/foreach}
+                       </ul>
+                       <br style="clear: both" />
+               </div>
+       </fieldset>
+       
+       <div class="nextButton">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+               <input type="hidden" name="send" value="1" />
+               <input type="hidden" name="step" value="{@$nextStep}" />
+               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+               <input type="hidden" name="languageCode" value="{@$languageCode}" />
+               <input type="hidden" name="wcfDir" value="{$wcfDir}" />
+               <input type="hidden" name="dev" value="{@$developerMode}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index 0d968908621d9bb09aebc73f800416cc4bef6e8e..4e383fc35f812527cbce547bdb846882ee5a45c9 100644 (file)
@@ -1,36 +1,36 @@
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.welcome{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.welcome.description{/lang}</p>\r
-\r
-<form method="post" action="install.php">\r
-       <fieldset>\r
-               <legend>{lang}wcf.global.welcome.language{/lang}</legend>\r
-               \r
-               <div class="inner">\r
-                       <div>\r
-                               <label for="languageCode">{lang}wcf.global.welcome.language.description{/lang}</label>\r
-                               {htmlOptions name="languageCode" id="languageCode" options=$availableLanguages selected=$languageCode disableEncoding=true}\r
-                               \r
-                               <input type="submit" value="{lang}wcf.global.welcome.language.change{/lang}" />\r
-                               <input type="hidden" name="step" value="selectSetupLanguage" />\r
-                               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-                       </div>\r
-               \r
-               </div>\r
-               \r
-       </fieldset>\r
-</form>\r
-\r
-<form method="post" action="install.php">\r
-       <div class="nextButton">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
-               <input type="hidden" name="step" value="{@$nextStep}" />\r
-               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-               <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
-               <input type="hidden" name="dev" value="{@$developerMode}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.welcome{/lang}</h2>
+
+<p>{lang}wcf.global.welcome.description{/lang}</p>
+
+<form method="post" action="install.php">
+       <fieldset>
+               <legend>{lang}wcf.global.welcome.language{/lang}</legend>
+               
+               <div class="inner">
+                       <div>
+                               <label for="languageCode">{lang}wcf.global.welcome.language.description{/lang}</label>
+                               {htmlOptions name="languageCode" id="languageCode" options=$availableLanguages selected=$languageCode disableEncoding=true}
+                               
+                               <input type="submit" value="{lang}wcf.global.welcome.language.change{/lang}" />
+                               <input type="hidden" name="step" value="selectSetupLanguage" />
+                               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+                       </div>
+               
+               </div>
+               
+       </fieldset>
+</form>
+
+<form method="post" action="install.php">
+       <div class="nextButton">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+               <input type="hidden" name="step" value="{@$nextStep}" />
+               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+               <input type="hidden" name="languageCode" value="{@$languageCode}" />
+               <input type="hidden" name="dev" value="{@$developerMode}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index 974bc4179d2b47e51f05f9f4cc5066ea0c962cb4..6afce3c065cdf02b97f6a7a56125ee7b5df7efe7 100644 (file)
@@ -1,29 +1,29 @@
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.license{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.license.description{/lang}</p>\r
-\r
-{if $missingAcception|isset}\r
-<p class="error">\r
-       {lang}wcf.global.license.missingAcception{/lang}\r
-</p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
-       <div>\r
-               <textarea rows="20" cols="40" style="width: 100%" readonly="readonly">{$license}</textarea>\r
-               <p><label{if $missingAcception|isset} class="errorField"{/if}><input type="checkbox" name="accepted" value="1" /> {lang}wcf.global.license.accept.description{/lang}</label></p>\r
-       </div>\r
-       <hr />\r
-       <div class="nextButton">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
-               <input type="hidden" name="send" value="1" />\r
-               <input type="hidden" name="step" value="{@$nextStep}" />\r
-               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-               <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
-               <input type="hidden" name="dev" value="{@$developerMode}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.license{/lang}</h2>
+
+<p>{lang}wcf.global.license.description{/lang}</p>
+
+{if $missingAcception|isset}
+<p class="error">
+       {lang}wcf.global.license.missingAcception{/lang}
+</p>
+{/if}
+
+<form method="post" action="install.php">
+       <div>
+               <textarea rows="20" cols="40" style="width: 100%" readonly="readonly">{$license}</textarea>
+               <p><label{if $missingAcception|isset} class="errorField"{/if}><input type="checkbox" name="accepted" value="1" /> {lang}wcf.global.license.accept.description{/lang}</label></p>
+       </div>
+       <hr />
+       <div class="nextButton">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+               <input type="hidden" name="send" value="1" />
+               <input type="hidden" name="step" value="{@$nextStep}" />
+               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+               <input type="hidden" name="languageCode" value="{@$languageCode}" />
+               <input type="hidden" name="dev" value="{@$developerMode}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index 7503acdd121f2f432d4e0a64661be5598998cbbe..90a371ab1672d931b45d3791197b18b0c2e8e66e 100644 (file)
@@ -1,80 +1,80 @@
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.systemRequirements{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.systemRequirements.description{/lang}</p>\r
-\r
-<fieldset>\r
-       <legend>{lang}wcf.global.systemRequirements.required{/lang}</legend>\r
-       <div class="inner">\r
-       \r
-               <div>\r
-                       <h3>{lang}wcf.global.systemRequirements.php{/lang}</h3>\r
-                       <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} 5.3.0</span>\r
-                       <span class="right" style="color: {if !$system.phpVersion.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.phpVersion.value}</span>\r
-                       {if !$system.phpVersion.result}<div>{lang}wcf.global.systemRequirements.php.description{/lang}</div>{/if}\r
-               </div>\r
-               <hr />\r
-               \r
-               <div>\r
-                       <h3>{lang}wcf.global.systemRequirements.sql{/lang}</h3>\r
-                       <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.active{/lang}</span>\r
-                       <span class="right" style="color: {if !$system.sql.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} \r
-                       {if !$system.sql.result}{lang}wcf.global.systemRequirements.sql.notFound{/lang}{else}\r
-                               {implode from=$system.sql.value item=$sqlType glue=', '}{lang}wcf.global.configureDB.class.{@$sqlType}{/lang}{/implode}\r
-                       {/if}</span>\r
-                       {if !$system.sql.result}<div>{lang}wcf.global.systemRequirements.sql.description{/lang}</div>{/if}\r
-               </div>\r
-               <hr />\r
-               \r
-               <div>\r
-                       <h3>{lang}wcf.global.systemRequirements.mbString{/lang}</h3>\r
-                       <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.active{/lang}</span>\r
-                       <span class="right" style="color: {if !$system.mbString.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {if !$system.mbString.result}{lang}wcf.global.systemRequirements.notActive{/lang}{else}{lang}wcf.global.systemRequirements.active{/lang}{/if}</span>\r
-                       {if !$system.mbString.result}<div>{lang}wcf.global.systemRequirements.mbString.description{/lang}</div>{/if}\r
-               </div>\r
-               <hr />\r
-               \r
-               <div>\r
-                       <h3>{lang}wcf.global.systemRequirements.safeMode{/lang}</h3>\r
-                       <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.notActive{/lang}</span>\r
-                       <span class="right" style="color: {if !$system.safeMode.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {if !$system.safeMode.result}{lang}wcf.global.systemRequirements.active{/lang}{else}{lang}wcf.global.systemRequirements.notActive{/lang}{/if}</span>\r
-                       {if !$system.safeMode.result}<div>{lang}wcf.global.systemRequirements.safeMode.description{/lang}</div>{/if}\r
-               </div>\r
-               \r
-       </div>\r
-</fieldset>\r
-\r
-<fieldset>\r
-       <legend>{lang}wcf.global.systemRequirements.recommended{/lang}</legend>\r
-       <div class="inner">\r
-       \r
-               <div>\r
-                       <h3>{lang}wcf.global.systemRequirements.uploadMaxFilesize{/lang}</h3>\r
-                       <span class="left">{lang}wcf.global.systemRequirements.element.recommended{/lang} > 0</span>\r
-                       <span class="right" style="color: {if !$system.uploadMaxFilesize.result}orange{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.uploadMaxFilesize.value}</span>\r
-                       {if !$system.uploadMaxFilesize.result}<div>{lang}wcf.global.systemRequirements.uploadMaxFilesize.description{/lang}</div>{/if}\r
-               </div>\r
-               <hr />\r
-               \r
-               <div>\r
-                       <h3>{lang}wcf.global.systemRequirements.gdLib{/lang}</h3>\r
-                       <span class="left">{lang}wcf.global.systemRequirements.element.recommended{/lang} 2.0.0</span>\r
-                       <span class="right" style="color: {if !$system.gdLib.result}orange{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.gdLib.value}</span>\r
-                       {if !$system.gdLib.result}<div>{lang}wcf.global.systemRequirements.gdLib.description{/lang}</div>{/if}\r
-               </div>\r
-               \r
-       </div>\r
-</fieldset>\r
-\r
-<form method="post" action="install.php">      \r
-       <div class="nextButton">\r
-               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" {if !$system.phpVersion.result || !$system.sql.result || !$system.mbString.result || !$system.safeMode.result} disabled="disabled"{/if}/>\r
-               <input type="hidden" name="step" value="{@$nextStep}" />\r
-               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
-               <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
-               <input type="hidden" name="dev" value="{@$developerMode}" />\r
-       </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.systemRequirements{/lang}</h2>
+
+<p>{lang}wcf.global.systemRequirements.description{/lang}</p>
+
+<fieldset>
+       <legend>{lang}wcf.global.systemRequirements.required{/lang}</legend>
+       <div class="inner">
+       
+               <div>
+                       <h3>{lang}wcf.global.systemRequirements.php{/lang}</h3>
+                       <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} 5.3.0</span>
+                       <span class="right" style="color: {if !$system.phpVersion.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.phpVersion.value}</span>
+                       {if !$system.phpVersion.result}<div>{lang}wcf.global.systemRequirements.php.description{/lang}</div>{/if}
+               </div>
+               <hr />
+               
+               <div>
+                       <h3>{lang}wcf.global.systemRequirements.sql{/lang}</h3>
+                       <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.active{/lang}</span>
+                       <span class="right" style="color: {if !$system.sql.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} 
+                       {if !$system.sql.result}{lang}wcf.global.systemRequirements.sql.notFound{/lang}{else}
+                               {implode from=$system.sql.value item=$sqlType glue=', '}{lang}wcf.global.configureDB.class.{@$sqlType}{/lang}{/implode}
+                       {/if}</span>
+                       {if !$system.sql.result}<div>{lang}wcf.global.systemRequirements.sql.description{/lang}</div>{/if}
+               </div>
+               <hr />
+               
+               <div>
+                       <h3>{lang}wcf.global.systemRequirements.mbString{/lang}</h3>
+                       <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.active{/lang}</span>
+                       <span class="right" style="color: {if !$system.mbString.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {if !$system.mbString.result}{lang}wcf.global.systemRequirements.notActive{/lang}{else}{lang}wcf.global.systemRequirements.active{/lang}{/if}</span>
+                       {if !$system.mbString.result}<div>{lang}wcf.global.systemRequirements.mbString.description{/lang}</div>{/if}
+               </div>
+               <hr />
+               
+               <div>
+                       <h3>{lang}wcf.global.systemRequirements.safeMode{/lang}</h3>
+                       <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.notActive{/lang}</span>
+                       <span class="right" style="color: {if !$system.safeMode.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {if !$system.safeMode.result}{lang}wcf.global.systemRequirements.active{/lang}{else}{lang}wcf.global.systemRequirements.notActive{/lang}{/if}</span>
+                       {if !$system.safeMode.result}<div>{lang}wcf.global.systemRequirements.safeMode.description{/lang}</div>{/if}
+               </div>
+               
+       </div>
+</fieldset>
+
+<fieldset>
+       <legend>{lang}wcf.global.systemRequirements.recommended{/lang}</legend>
+       <div class="inner">
+       
+               <div>
+                       <h3>{lang}wcf.global.systemRequirements.uploadMaxFilesize{/lang}</h3>
+                       <span class="left">{lang}wcf.global.systemRequirements.element.recommended{/lang} > 0</span>
+                       <span class="right" style="color: {if !$system.uploadMaxFilesize.result}orange{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.uploadMaxFilesize.value}</span>
+                       {if !$system.uploadMaxFilesize.result}<div>{lang}wcf.global.systemRequirements.uploadMaxFilesize.description{/lang}</div>{/if}
+               </div>
+               <hr />
+               
+               <div>
+                       <h3>{lang}wcf.global.systemRequirements.gdLib{/lang}</h3>
+                       <span class="left">{lang}wcf.global.systemRequirements.element.recommended{/lang} 2.0.0</span>
+                       <span class="right" style="color: {if !$system.gdLib.result}orange{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.gdLib.value}</span>
+                       {if !$system.gdLib.result}<div>{lang}wcf.global.systemRequirements.gdLib.description{/lang}</div>{/if}
+               </div>
+               
+       </div>
+</fieldset>
+
+<form method="post" action="install.php">      
+       <div class="nextButton">
+               <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" {if !$system.phpVersion.result || !$system.sql.result || !$system.mbString.result || !$system.safeMode.result} disabled="disabled"{/if}/>
+               <input type="hidden" name="step" value="{@$nextStep}" />
+               <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+               <input type="hidden" name="languageCode" value="{@$languageCode}" />
+               <input type="hidden" name="dev" value="{@$developerMode}" />
+       </div>
+</form>
+
 {include file='footer'}
\ No newline at end of file
index c95dded22272b781226380334f28896b33e80cc7..e2386d7248d11da21e72efadf67bd019834f5ecb 100644 (file)
@@ -1,60 +1,60 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\r
-<html>\r
-<head>\r
-       <title>PHP5 Check</title>\r
-</head>\r
-<body>\r
-<?php\r
-/**\r
- * Tests the support of php5.0.5 or greater.\r
- * ><p><b>Support for PHP is missing.<br />PHP Unterst&uuml;tzung nicht gefunden</b></p> <!--\r
- * \r
- * @author     Marcel Werk\r
- * @copyright  2001-2007 WoltLab GmbH\r
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-// check php version\r
-// php version\r
-$phpVersion = phpversion();\r
-$comparePhpVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $phpVersion);\r
-if (!(version_compare($comparePhpVersion, '5.2.0') >= 0)) {\r
-       ?>\r
-       <p>Your PHP version '<?php echo $phpVersion; ?>' is insufficient for installation of this software. PHP version 5.2.0 or greater is required.<br />\r
-       Ihre PHP Version '<?php echo $phpVersion; ?>' ist unzureichend f&uuml;r die Installation dieser Software. PHP Version 5.2.0 oder h&ouml;her wird ben&ouml;tigt.</p>\r
-       <?php\r
-}\r
-\r
-// check ze1_compatibility_mode\r
-else if (ini_get('zend.ze1_compatibility_mode')) {\r
-       ?>\r
-       <p>The option 'zend.ze1_compatibility_mode' is enabled. Please disable the option in your PHP configuration (php.ini) for a stable work of this software.<br />\r
-       Die Einstellung 'zend.ze1_compatibility_mode' ist aktiv. F&uuml;r einen einwandfreien Betrieb dieser Software muss die Einstellung in der PHP-Konfiguration (php.ini) deaktiviert werden.</p>\r
-       <?php\r
-}\r
-\r
-// check simplexml\r
-else if (!function_exists('simplexml_load_file')) {\r
-       ?>\r
-       <p>The 'simplexml' PHP extension is missing. Simplexml is required for a stable work of this software.<br />\r
-       Die 'simplexml' Erweiterung f&uuml;r PHP wurde nicht gefunden. Diese Erweiterung ist f&uuml;r den Betrieb der Software notwendig.</p>\r
-       <?php\r
-}\r
-\r
-// check zlib extension\r
-else if (!function_exists('gzopen')) {\r
-       ?>\r
-       <p>The 'zlib' PHP extension is missing. ZLib is required for a stable work of this software.<br />\r
-       Die 'zlib' Erweiterung f&uuml;r PHP wurde nicht gefunden. Diese Erweiterung ist f&uuml;r den Betrieb der Software notwendig.</p>\r
-       <?php\r
-}\r
-\r
-// \r
-else {\r
-       ?>\r
-       <p>PHP5 or greater is available. You can <a href="install.php">start</a> the installation now.<br />\r
-       PHP5 oder h&ouml;her wurde gefunden. Sie k&ouml;nnen mit der Installation <a href="install.php">beginnen</a>.</p>\r
-       <?php\r
-}\r
-?>\r
-</body>\r
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+       <title>PHP5 Check</title>
+</head>
+<body>
+<?php
+/**
+ * Tests the support of php5.0.5 or greater.
+ * ><p><b>Support for PHP is missing.<br />PHP Unterst&uuml;tzung nicht gefunden</b></p> <!--
+ * 
+ * @author     Marcel Werk
+ * @copyright  2001-2007 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+// check php version
+// php version
+$phpVersion = phpversion();
+$comparePhpVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $phpVersion);
+if (!(version_compare($comparePhpVersion, '5.2.0') >= 0)) {
+       ?>
+       <p>Your PHP version '<?php echo $phpVersion; ?>' is insufficient for installation of this software. PHP version 5.2.0 or greater is required.<br />
+       Ihre PHP Version '<?php echo $phpVersion; ?>' ist unzureichend f&uuml;r die Installation dieser Software. PHP Version 5.2.0 oder h&ouml;her wird ben&ouml;tigt.</p>
+       <?php
+}
+
+// check ze1_compatibility_mode
+else if (ini_get('zend.ze1_compatibility_mode')) {
+       ?>
+       <p>The option 'zend.ze1_compatibility_mode' is enabled. Please disable the option in your PHP configuration (php.ini) for a stable work of this software.<br />
+       Die Einstellung 'zend.ze1_compatibility_mode' ist aktiv. F&uuml;r einen einwandfreien Betrieb dieser Software muss die Einstellung in der PHP-Konfiguration (php.ini) deaktiviert werden.</p>
+       <?php
+}
+
+// check simplexml
+else if (!function_exists('simplexml_load_file')) {
+       ?>
+       <p>The 'simplexml' PHP extension is missing. Simplexml is required for a stable work of this software.<br />
+       Die 'simplexml' Erweiterung f&uuml;r PHP wurde nicht gefunden. Diese Erweiterung ist f&uuml;r den Betrieb der Software notwendig.</p>
+       <?php
+}
+
+// check zlib extension
+else if (!function_exists('gzopen')) {
+       ?>
+       <p>The 'zlib' PHP extension is missing. ZLib is required for a stable work of this software.<br />
+       Die 'zlib' Erweiterung f&uuml;r PHP wurde nicht gefunden. Diese Erweiterung ist f&uuml;r den Betrieb der Software notwendig.</p>
+       <?php
+}
+
+// 
+else {
+       ?>
+       <p>PHP5 or greater is available. You can <a href="install.php">start</a> the installation now.<br />
+       PHP5 oder h&ouml;her wurde gefunden. Sie k&ouml;nnen mit der Installation <a href="install.php">beginnen</a>.</p>
+       <?php
+}
+?>
+</body>
 </html>
\ No newline at end of file