## 8.4.1

### Changes
 - [eaiws] updated SOAP binding for final EAIWS 4.13 release (added external catalog DSR information)

## 8.4.0

### New features
 - [core] alpha testing for transparent materials is now supported
 - [core] added `prop.AngleProperty` as new property type
 - [bsk] added `SetArticleItem.setCollapsed()`
 - [cf] use alpha testing for GFJ materials with a non semi transparent texture
 - [eaiws] added support for EAIWS 4.13 rc 3
 - [eaiws] add new tag `NET_VALUE_ECO` to `PricingProcedureLineTag`

### Changes
 - [core] GLTF scene export (`mdl/io/GltfScene`) is now deprecated, GLTF export provided by EAIWS should be used instead
 - [core] `loadDocumentFromContainer()` and `saveDocumentToContainer()` no longer catch/hide `AppModule` exceptions
 - [core] a re-rending will be triggered after the WebGL context was restored
 - [bsk] `action/updateOfmlArticles()` does no longer throw article update errors as an exception. They are now collected and returned as part of the update result.
 - [eaiws] `EaiwsSession.uploadFileToUrl()` and `uploadFile()` are now using `utils/async/ajax()` instead of using `XMLHttpRequest` directly
 - [eaiws] `PriceProfileService` is now deprecated, use REST API of PriceProfile plugin (v1.5) instead.
 - [eaiws] minor optimization to reduce soap request size
 - [libs] updated to BabylonJS 5.43.1
 - [libs] updated to core-js 3.27.2
 - [libs] updated to JSZip 3.10.1

### Bug fixes
 - [core] shadow of `rendering/ShadowPlane` was missing after the WebGL context was restored
 - [cf] do not show OAP interactors if article has no geometry
 - [eaiws] it was not possible to reset the value of `AddressData.countryCode`
 - [eaiws] added missing basket functions `collapseSetArticles()` and `expandSetArticles()`
 - [eaiws] fixed error handling in case a soap response contains invalid XML

### Breaking Changes
 - Internet Explorer and legacy Edge (Version <= 18) are no longer supported
 - [core] removed USDZ export, USDZ export provided by EAIWS should be used instead

## 8.3.0

### New features
 - [eaiws] added support for PriceProfile plugin 1.4.0

## 8.2.0

### New features
 - [core] added `AppCallbacks.showMessage` (part of OAP 1.4)
 - [core] added `prop/PropertyValue.image`
 - [bsk] parameter `pArticle` of `actions/insertArticle()` now also supports `eaiws/basket/InsertInfo` as type
 - [bsk] added `FolderItem.setLongText()` and `FolderItem.getLongText()`
 - [bsk] added `TextItem.setLongText()` and `TextItem.getLongText()`
 - [cf] added support for OAP 1.4
 - [cf] added support for high resolution property icons
 - [cf] parameter `pArticle` of `ArticleManager.insertArticle()` now also supports `eaiws/basket/InsertInfo` as type
 - [pl] added parameter `pLineDistance` to `utils/createGrid()`
 - [eaiws] added support for EAIWS 4.12 rc 1
 - [utils] added `articleConfigurationOptions` to `wcfConfig` which can be used to enable high resolution property icons

### Bug fixes
 - [bsk] fixed error in internal `sortItems()` function (used from `actions/relocateItems()` and `moveItems`)
 - [core] fixed wrong callback type definition of `AppCallbacks.ShowActionChoiceOptions.goBack`
 - [core] enabling or disabling SSAO didn't had an immediate effect

### Changes
 - [bsk] alternative/optional items are no longer ignored when operating on group calculations
 - [bsk] `ItemUpdateFlags.UserArticleDescription` is now deprecated, use `ItemUpdateFlags.UserItemDescription` instead
 - [libs] updated to BabylonJS 5.15.1
 - [libs] updated to core-js 3.23.5
 - [libs] updated to JSZip 3.9.1

### Breaking Changes
 - [eaiws] EAIWS 4.12 rc 1 or higher is required now

## 8.1.0

### New features
 - [bsk] improved performance of `Basket.loadFromSession()` by executing some requests in parallel
 - [bsk] improved performance of `actions/insertArticle()` when inserting ofml articles with many children
 - [bsk] `Basket.checkConsistency()` optionally checks for calculation errors (enabled by default)
 - [bsk] `Basket.loadFromSession()` optionally activates a given pricing procedure during loading (which is faster than doing it afterwards)
 - [bsk] added support for item comments, see `BasketItem.setComments()`
 - [bsk] added support for optional items, see `BasketItem.getInactiveState()`
 - [bsk] added `ItemLockFlags.OfmlArticleUpdate`
 - [cf] speed up article geometry loading (GFJ) by loading textures in parallel
 - [cf] speed up article configuration (setPropertyValue) by disabling unnecessary computations on EAIWS side
 - [utils] `async/ajax()` now also accepts `HEAD` as request method
 - [utils] added function `async/fetchContentType()`
 - [utils] added function `image/getImageMimeType()`
 - [utils] added function `string/removeQueryString()`
 - [eaiws] added callback `SoapService.onGetRequestOptions` which allows to define custom request options for different soap methods
 - [eaiws] added support for EAIWS 4.11 rc1

### Changes
 - [bsk] `Basket/View.root` now throws an exception if it was not initialized yet or already cleared
 - [bsk] `BaseItem.children` is no longer undefined after an item was disposed, its now empty instead
 - [bsk] fixed `unknown item id` error during execution of `deleteItems()` action
 - [bsk] nested set articles are no longer automatically converted back to folders, e.g when pasting a set article into another set article
 - [bsk] `actions/setItemAlternativeState()` is now deprecated, use `actions/setItemInactiveState()` instead
 - [cf] removed series id from internal property key to allow merging of properties from different series
 - [utils] `string/getFileExtension()` now always returns the extension lowercase
 - [utils] `string/getFileExtension()`, `getFilePath()` and `getFileName()` now ignore the query string of the given url
 - [eaiws] parameter `pTimeout` of `BasketService.getExportedGeometry` is now deprecated (use `SoapService.onGetRequestOptions` instead)
 - [libs] updated to core-js 3.21.1
 - [libs] updated to BabylonJS 5.0.0-beta.9

### Bug fixes
 - [core] OAP interactor position was wrong after `cf/ArticleManager.createArticleScreenshot()`
 - [core] fixed interactor event handling issue with firefox and touch devices
 - [core/cf] fixed memory leak related to interactors
 - [bsk] fixed wrong calculation of folder view items if the folder contains alternative items
 - [bsk] fixed wrong regular expression which is used to validate a series id
 - [bsk] always use the stored article image as fallback if no image can be generated
 - [eaiws] correctly handle `Infinity` value returned from EAIWS for `decimal` data type

### Breaking Changes
 - [eaiws] EAIWS 4.11 rc1 or higher is required now

### Breaking Changes (typescript compile time only)
 - [eaiws-bundle] `egrWcf.eaiws.plugins.priceProfile.ConditionRule` has to be used as type instead of `egrWcf.eaiws.plugins.PriceProfileService.ConditionRule`

## 8.0.3

### Bug fixes
 - [libs] updated to BabylonJS 5.0.0-alpha.65 to fix WebGL 2 errors in Chrome and Edge version >= 97

## 8.0.2

### Bug fixes (compile time only)
 - [eaiws] fixed wrong typescript typings of eaiws bundle

## 8.0.1

### Bug fixes
 - [cf] fixed wrong dimension text alignment of `BoundingBoxDimensions` in case of `offsetFactor` > 1
 - [cf] `MainArticleElement.getCompositeCalculation()` returned wrong price for alternative articles
 - [bsk] `ArticleItem.getCompositeCalculation()` returned wrong price for alternative articles
 - [eaiws] added missing property `images` to `catalog/CatalogItem`

## 8.0.0

### New features
 - converted the whole framework to ES6 modules which reduces the bundle size
 - [core] rendering performance improvements
 - [core] added support for FXAA to reduce aliasing during user interaction (can be enabled by `Viewer.fxaaEnabled`)
 - [core] enabled specular anti aliasing for `mdl/PbrMaterial` to reduce aliasing of glossy materials
 - [core] added `CameraControl.stopOrbitInertia()`
 - [core] added support for custom environment maps, see `MaterialManager.customEnvironmentUrl`
 - [core] added optional surcharge/extra charge information to property values, see `prop/PropertyValue.surcharge`
 - [cf] surcharges of OFML property values can now be accessed using `core/prop/PropertyValue.surcharge` (see breaking changes)
 - [cf] added flag `ArticleManager.includeCalculationErrorsInInconsistencies`
 - [bsk] added flag `Basket.includeCalculationErrorsInInconsistencies`
 - [bsk] additional custom images (up to 10) can be assigned to an basket item
 - [bsk] `cfg/ArticleConfiguration.assignArticleImageCamera()` optionally updates article images immediately
 - [bsk] added `ItemLockFlags.Quantity` (see breaking changes)
 - [bsk] added optional `pForce` parameter to `View.update()`
 - [utils] added new option `additionalDecimalPlaces` to `number/toLocaleCurrencyString()`
 - [eaiws] added support for EAIWS 4.10 rc2

### Changes
 - [core] default value of `AppInitOptions.disableWebGL2Support` is now `true` because of issues with WebGL 2 in some browsers (e.g. IOS 15.0 or some low-end Android devices)
 - [core] changed bounding box calculation to ensure correct bounding box size in case of rotated child elements
 - [core] changing property `showMainElementSelection` or `showSubElementSelection` of `tool/SelectionDefault` will now update the current selection
 - [eaiws] improved type safety for SOAP function calls (typescript only)
 - [libs] updated to BabylonJS 5.0.0-alpha.45
 - [libs] updated to core-js 3.18.1

### Bug fixes
 - [core] MSAA post-process wasn't completely disabled if `Viewer.antiAliasingQuality` was set to 0
 - [core] resizing the viewer while generating a screenshot resulted in a corrupted screenshot and a wrongly resized viewer
 - [core] `mdl/SceneElement.replaceNode()` didn't handle the case that the SceneElement was removed from the scene or was already disposed
 - [core] fixed memory leak when executing commands without undo recording being enabled
 - [bsk] stored article image of partial plannings wasn't loaded from obk
 - [bsk] `ItemLockManager.isHeaderCalculationLocked()` returned true even if the calculation of an item was not locked
 - [bsk] fixed wrong price calculation of merged alternative items in basket views
 - [bsk] adjusting the price calculation of all sub items of a selected folder was not possible
 - [cf] prevent concurrent calls of `ArticleElement.getArticleData()`
 - [pl] rotate interactors were visible in some cases even if rotation was disabled

### Breaking Changes
 - `scripts` are no longer part of the W-CF distribution (there is still an eaiws bundle), the application has to migrate to modules (see `README.md`)
 - [eaiws] EAIWS 4.10 rc2 or higher is required now
 - [core] removed `Application.dataPath` use `/utils/wcfConfig.dataPath` instead
 - [core] `AppInitOptions` for `Application.initialize()` is now an interface instead of a class
 - [core] removed load/save functions from `AppDocument`, import load/save functions from `/core` instead (e.g. `loadDocumentFromZip()`)
 - [core] css class for the view dom element was renamed from `view` to `wcf-view`
 - [cf] `PecImport` is no longer available as a class, import functions from `/cf/io` instead (e.g. `importPec()`)
 - [cf] surcharges of OFML property values are no longer part of the value text, use `core/prop/PropertyValue.surcharge` to get the surcharge
 - [bsk] removed `BASKET_COLUMN_ID_USER_IMAGE` and `BASKET_COLUMN_ID_EXT_ITEM_NUMBER` from `Basket` class, can be imported from `/bsk` instead
 - [bsk] removed all actions from `Basket` and `View`, can be imported as individual functions from `/bsk/actions` (e.g. `insertArticle()`)
 - [bsk] removed `configuration` property from Basket, `/bsk/cfg/ArticleConfiguration` should be used instead
 - [bsk] removed unused `ArticleItem.hasIndependentChildren()`
 - [bsk] `cfg/ArticleConfiguration.loadPreConfigurationFromSession()` has to be called to restore the pre configuration
 - [bsk] `cfg/ArticleConfiguration.assignArticleImageCamera()` is now a promise and the parameters have changed
 - [bsk] `ItemLockFlags.Calculation` no longer locks the article quantity, use `ItemLockFlags.Quantity` instead
 - [utils] removed `utils.wcfLibsPath` use `/utils/wcfConfig.libsPath` instead
 - [utils] removed `utils.dom.loadContentErrorHandler ` use `/utils/wcfConfig.loadContentErrorHandler` instead
 - [utils] global ajax error handler and default ajax options can be configured using `/utils/wcfConfig`
 - [utils] renamed `image/load()` to `loadImage()`
 - [utils] renamed `array/remove()` to `removeElement()`

## 7.1.4

### Bug fixes
 - [cf] prevent duplicate sub articles in GFJ loader if multiple sub articles have identical geometry ids

## 7.1.3

### Bug fixes
 - [cf] fixed `gfj path not found` error in pec import for some pec files if no eaiws session is available

## 7.1.2

### Bug fixes
 - [core] fixed error in `Camera.setTarget()` resulting in rotated top view (introduced in 7.1.1)

## 7.1.1

### Bug fixes
 - [core] fixed a numerical error in `Camera.setTarget()` resulting in wrong camera rotation
 - [eaiws] fixed wrong type definition of `SortGroupSelector`

## 7.1.0

### New features
 - [bsk] added `ArticleItem.getCameraSetup()` and `setCameraSetup()`
 - [bsk] added static method `Basket.PrepareBasketColumns()`
 - [bsk] added `UserArticleItem.setPurchasePrice()`
 - [bsk] added `UserArticleItem.setSalesPrice()`
 - [bsk] added `UserArticleItem.setPriceDate()`
 - [bsk] added `ProjectInfo.get/setDefaultPriceDate()`
 - [bsk] added optional `pPriceDate` parameter to `Basket.updateOfmlArticles()`
 - [cf] added optional `pPriceDate` parameter to `MainArticleElement.updateOfmlArticle()`
 - [core] added optional `pImmediateResize` flag to `Viewer.resize()`
 - [core] added optional scaling factor to USDZ and GLTF scene export
 - [eaiws] added support for EAIWS 4.9 beta1

### Breaking changes
 - [eaiws] EAIWS 4.9 beta1 or higher is required now
 - [cf/bsk] `ItemProperties` and `ArticleData` are now always using the eaiws option `separateCurrencies`. The properties `purchaseCurrency` and `salesCurrency` have to be used instead of `currency`.

### Bug fixes
 - [bsk] moving nested items to a set article created duplicate items in some cases
 - [cf] `eventPropertiesChanged` wasn't triggered for articles which were indirectly changed by a property change of another subarticle

## 7.0.1

### Changes
 - [core] reduced number of SSAO samples if low SSAO quality is used

### Bug fixes
 - [core] added workaround to prevent black/dark materials if WebGL 2 is used without shadowMapping

## 7.0.0

### New features
 - [core] added `rendering.ShadowMapping` which generates soft directional shadows
 - [core] added `rendering.createShadowOnlyFloor()` helper function (to be used in combination with `rendering.ShadowMapping`)
 - [core] Ambient Occlusion (SSAO) is now used to increase rendering quality if WebGL 2.0 is available (see `Viewer.ssaoQuality` to disable it)
 - [core] `Viewer.createScreenshot()` now supports all rendering effects of BabylonJS (e.g. shadows, post processing, gui)
 - [cf] added `PecImportOptions.dataLanguage`
 - [cf] added `ArticleManager.eventOapError`
 - [cf] custom `InsertArticleOptions` can be provided for `ArticleManager.insertArticle()` and `insertSubArticle()`
 - [cf] class `BoundingBoxDimensions` is now public and can be used to show dimensions for a group of elements
 - [bsk] custom `InsertArticleOptions` can be provided for `Basket.insertArticle()`
 - [bsk] added `showSubTotal` option to `Basket.insertFolder()`
 - [bsk] added `CalculationManager.setItemConditionDescription()`
 - [bsk] `ArticleItem.setShortText()`, `setLongText()` or `setFeatureText()` can be used for OFML articles to set a user defined article description
 - [bsk] added `ArticleItem.getUserDescription()`
 - [eaiws] added support for EAIWS 4.8 rc2
 - [eaiws] added `SoapError.methodName`

### Changes
 - [core] default value of `AppInitOptions.preserveDrawingBuffer` is now `true`
 - [core] default value of `AppInitOptions.disableWebGL2Support` is now `false`
 - [core] improvements for `rendering.ShadowPlane` to reduce z-fighting (not for IE 11 browser)
 - [core] `mdl.io.UsdScene` exports only visible meshes
 - [bsk] moved `setTaxInformation`, `setPackagingVolume` and `setPackagingNetWeight` from `UserArticleItem` to `ArticleItem`
 - [bsk] changing the `label`, `shortText`, `longText` or `featureText` for an item is no longer language independent
 - [libs] updated to BabylonJS 4.2.0-egr.1
 - [libs] updated to core-js 3.8.2

### Breaking changes
 - [eaiws] EAIWS 4.8 rc2 or higher is required now
 - [core] `Viewer.createScreenshot()` requires `AppInitOptions.preserveDrawingBuffer` to be enabled
 - [core] removed support for multiple views, `Viewer.view` is now the only available view
 - [core] removed `ScreenshotView`, the different callbacks of `ScreenshotOptions` should be used instead
 - [core] removed `pView` parameter from `Viewer.createScreenshot()`
 - [core] the callbacks `BaseScreenshotOptions.onDrawBackground()` and `onDrawOverlay()` are now asynchronous
 - [core] reduced the internal Y offset of `rendering.ShadowPlane` from 2mm to 0.5mm (`rendering.ShadowPlane.planeYOffset` can be set to 0.0015 to get the old behavior)
 - [bsk] removed experimental and unfinished support for set-article based 3d configurations
 - [cf] removed `ArticleManager.offlineContext`, therefore article information in loaded documents is no longer available without an valid EAIWS session

### Bug fixes
 - [bsk] `Basket.insertArticle()` didn't handle the `varCodeType` of `eaiws.catalog.ArticleCatalogItem`
 - [core] fixed wrong multi selection behavior in `tool.SelectionDefault`
 - [core] ignoring line meshes in `mdl.io.UsdScene` to prevent exceptions
 - [cf] prevent flickering of hiddenMode OAP interactors if they are initially invisible

## 6.4.0

### New features
 - [core] added `AppCallbacks.showMedia`
 - [cf] new OAP interactor symbols
 - [cf] added OAP 1.2 support
 - [eaiws] added support for EAIWS 4.8 rc1 (superseded by EAIWS 4.8 beta 6)
 - [eaiws] added `FINAL_VALUE_NO_DISCOUNTS` tag to `PricingProcedureLineTag`
 - [bsk] added `View.extraPriceInfoSelectors` property (requires EAIWS 4.8 beta 5)

### Changes
 - [core] rectangle selection now ignores meshes if they are not pickable (isPickable = false)
 - [core/pl] adjusted colors of tool feedback lines to be more visible on dark backgrounds

### Breaking changes
 - [eaiws] EAIWS 4.8 beta 5 or higher is required now

### Bug fixes
 - [core] prevent page scrolling if user clicks on the WebGL canvas
 - [core] partial rectangle selection wasn't working as intended
 - [core] fixed error during partial rectangle selection if a line mesh was selected
 - [core] fixed error in `View.pickSceneWithFrustum()` if a line mesh was picked
 - [cf] "is selectable" flag of sub articles wasn't updated after configuration

## 6.3.1

### Bug fixes
 - [bsk] `Basket.pasteItems()` returned the original items instead of the pasted ones

## 6.3.0

### New features
 - [eaiws] added support for EAIWS 4.8 beta 2
 - [eaiws] added optional `SoapError.detail` which contains additional error information (e.g. `basket.BasketServiceFault`)
 - [eaiws] added `INVISIBLE` and `PURCHASE_CALC` tag to `PricingProcedureLineTag`
 - [pl] svg images are now used for interactors in the default tool which are also automatically adjusted according to the theme color
 - [bsk] added `Basket.eventItemsPasted`
 - [bsk] added `ProjectInfo.getEffectiveProjectLanguages()` and `eventEffectiveProjectLanguagesChanged`
 - [bsk] added `CalculationManager.updateConditionAmounts()`
 - [cf] color of article dimensions can be changed, see `MainArticleElement.dimensionsColor`
 - [utils] added `async.delay()` and `async.delayForAnimation()`

### Changes
 - [core] split up USD export operation into smaller chunks for better UI animations during export
 - [core] improved PBR material export for USD
 - [bsk] `BasketItem.setTmText()` now uses the primary project language as default instead of the session locale
 - [bsk] `ProjectInfo.getProjectData()` returns the project texts in `JSON` format
 - [cf] dimensions of `MainArticleElement` will be updated automatically if `dimensionsColor` or `dimensionsScaleFactor` changed
 - [utils] added additional `pError` parameter to `async.ajaxRejectedEvent`
 - [libs] updated to JSZip 3.5.0
 - [libs] updated to core-js 3.6.5
 - [libs] updated to jsSHA 3.1.2

### Breaking changes
 - [pl] the style sheet `styles/pl.css` has to be loaded from the application if the `pl` module is used

### Bug fixes
 - [bsk] `ArticleConfiguration.assignArticleImageCamera()` only worked correctly for articles positioned at the origin
 - [bsk] fixed handling of cached item calculation in case of active header conditions (see also `pIgnoreHeaderCalculation` parameter of `BaseItem.getCalculation()`)
 - [cf] fixed handling of ofml update states
 - [core] added workaround for clipped 3d css interactors in firefox
 - [core] fixed wrong camera position/rotation after zoom to fit

## 6.2.0

### New features
 - [core] added experimental GLTF scene export `mdl.io.GltfScene` (api and functionality may change)
 - [core] added USD scene export `mdl.io.UsdScene`

### Changes
 - [libs] added optional `/libs/babylonjs/babylonjs.serializers.min.js` (only required by the GLTF scene export)

## 6.1.2

### Bug fixes
 - [utils] the path returned from `string.joinPath()` contained double slashes in some cases

## 6.1.1

### Changes
 - [core] `CommandManager.executeCommand()` and `ToolManager.startTool()` no longer hide/swallow exceptions

### Bug fixes
 - [core] `planningHDR_512.env` was loaded even if not used

## 6.1.0

### New features
 - [core] added `mutiLine` flag to `prop.StringProperty`
 - [core] added the environment map of pCon.planner as alternative which can be enabled with `MaterialManager.environmentMode`
 - [cf] added support for multine ofml string properties (requires EAIWS 4.8 beta 1)
 - [bsk] added `CalculationManager.adjustConditionValue()`, `adjustCalculationLineAmount()` and `adjustCalculationLineValue()` (requires EAIWS 4.8 beta 1)
 - [eaiws] added support for EAIWS 4.8 beta 1

### Changes
 - [bsk] `Basket.addView()` now also accepts a view config to avoid an additional SOAP request

### Bug fixes
 - [core] fixed material roughness handling by reconverting the env map
 - [bsk] fixed exception in `Basket.insertSetArticle()` if a folder is currently selected which is part of a set article
 - [pl] fixed potential null reference exception in `DefaultRotate` tool

## 6.0.0

### New features
- [utils] added `string.hash()` and `arraybuffer.hash()`
- [utils] added `string.encodeToUtf8()`
- [utils] added `arraybuffer.toHex()`
- [utils] added additional request information to `async.ajaxResolvedEvent` and `async.ajaxRejectedEvent`
- [bsk] added options for folder handling to `Basket.mergeArticles()`
- [libs] added `jsSHA` version 2.4.0, will be used as a fallback for hash generation and is loaded on-demand
- [cf] added OAP interactor symbol `OnOff` (requires EAIWS 4.7.4)

### Changes
- [cf] id generation for materials and catalog images is now based on SHA instead of MD5

### Breaking changes
- the path `utils.wcfLibsPath` has to be defined or hash generation will fail under chrome if a non-secure connection is used
- [utils] changed execution order and arguments of `async.ajaxResolvedEvent` and `async.ajaxRejectedEvent`
- [bsk] removed deprecated function `UserArticleItem.setNetWeight()`
- [bsk] removed deprecated function `BaseItem.getPositionNumber()`
- [libs] `blueimp-md5` is no longer used internally and therefore is no longer part of the W-CF distribution

### Bug fixes
- [utils] `number.toLocaleLengthString()` returned wrong unit for `LengthUnit.Kilometer`
- [utils] added missing `xml` type to `AjaxOptions.responseType`
- [eaiws] `SessionService.loadEmptySession()` didn't clear internal caches
- [pl] improved stability of rotate interactor position in orthographic views
- [cf] OAP symbols `ChangeDim2Left` and `ChangeDim2Right` didn't work in all sizes

## 5.4.4

### Bug fixes
- [bsk] fixed `unknown item id` error during article configuration if nested sub articles got deleted that are not part of the main article hierarchy

## 5.4.3

### Bug fixes
- [cf] prevent errors in pec import for user articles if no eaiws session is available

## 5.4.2

### Bug fixes
- [cf] internal obk reader was reading wrong article rotations

## 5.4.1

### Bug fixes
- [core] minimum webgl canvas size is now 4px to prevent webgl errors
- [core/cf/pl] disabled vertex alpha for opaque line meshes to prevent potential drawing order issues

## 5.4.0

### Changes
- [bsk] `CalculationManager.setCurrency()` resets the ofml update state for `UpToDate` articles
- [libs] updated to BabylonJS 4.1.0

### Bug fixes
- [core] fixed wrong handling of left mouse button rectangle selection in `tool.SelectionDefault`
- [bsk] `Basket.clear()` didn't reset the `ProjectInfo` cache

## 5.3.0

### Changes
- [core] adjusted conversion of legacy materials to PBR based on document `Conversion from OMATS1 to PBR` version 1.2
- [cf] a placeholder geometry for articles without any valid geometry will be generated

### Bug fixes
- [core] disabled parallel shader compilation (chrome only) to avoid potential side effects
- [bsk] the item order was not correct after moving or relocating items (in some cases moving was not possible at all)
- [cf] transparency of ofml materials was ignored if the material had a texture (without alpha channel)
- [eaiws] fixed handling of soap node text values

## 5.2.0

### New features
- [core] added support for left mouse button rectangle selection, see `tool.SelectionDefault.leftMouseButtonRectangleSelectEnabled` flag
- [core] added different selection modes to rectangle selection, see `tool.SelectionDefault.rectangleSelectMode`
- [core] added `view.CameraControl.leftMouseButtonEnabled` flag which can be used to disable left mouse button navigation
- [core] `MultiPropertyProvider` now provides an abortable progress while handling properties
- [bsk] added `UserArticleItem.setPackagingVolume()`
- [bsk] added `UserArticleItem.setPackagingNetWeight()`
- [bsk] added `BaseItem.getItemNumber()`
- [bsk] added `Basket.eventOfmlUpdateStateChanged`
- [bsk] added `ProjectInfo.notifyProjectDataChanged()`
- [bsk] added optional progress callback to `Basket.updateOfmlArticles()`
- [bsk] added support for external item numbers
- [pl] added `moveLimitMin` and `moveLimitMax` property to `Default` and `TouchDefault` tool
- [utils] added `array.chunk()`
- [utils] added utilities for loading and resizing of images

### Changes
- [core] changed `tabIndex` of viewer canvas from 1 to 0
- [bsk] deprecated `UserArticleItem.setNetWeight()` in favor of `UserArticleItem.setPackagingNetWeight()`
- [bsk] deprecated `BaseItem.getPositionNumber()` in favor of `BaseItem.getItemNumber()`
- [libs] updated to BabylonJS 4.1.0-beta.22
- [libs] updated to core-js 3.6.4

### Breaking changes
- [pl] `Default` and `TouchDefault` tool limit the object movement by default to an 40 meter area, see `moveLimitMin` and `moveLimitMax` properties

### Bug fixes
- [bsk] views with merge mode `SubArticles` weren't updated correctly after changing the quantity of a view item
- [bsk] prevent timeout error if `Basket.updateOfmlArticles()` is called for many articles
- [bsk] prevent timeout error if `Basket.fetchOfmlUpdateStates()` is called for many articles
- [bsk] value of `ArticleItem.ofmlUpdateState` wasn't always correct
- [bsk] calling `Basket.clear()` didn't reset the cached tax scheme
- [eaiws] value of `BasketViewConfig.visibleColumns` was always undefined
- [eaiws] added missing `itemId` property to `basket.ImageInfo`
- [eaiws] fixed wrong function signature of `basket.getPriceCalculationSheets()`

## 5.1.1

### Bug fixes
- [pl] angle feedback of rotate tool wasn't shown correctly
- [cf] delayed update events while processing OAP DimChange to prevent unknown item id errors

## 5.1.0

### New features
- [bsk] added `ItemLockManager` which can be used to lock certain item related operations.
- [utils] added `string.generateRandomUUID()`

### Changes
- [libs] updated to core-js 3.4.7

### Bug fixes
- [eaiws] prevent exception if `project.AddressData.countryCode` is empty when changing/adding an address
- [bsk] the calculation returned from `ArticleItem.getCompositeCalculation()` now contains a quantity and has correct unit prices
- [cf] the calculation returned from `MainArticleElement.getCompositeCalculation()` now contains a quantity and has correct unit prices

## 5.0.0

### New features
 - [core] added `io.DocumentInputContext.getFile()`
 - [core] added `io.DocumentInputContext.listFiles()`
 - [core] added `tool.SelectionMenu.deactivateOnToolStart` property
 - [core] added `targetCanvas` option to `view.BaseScreenshotOptions`
 - [core] added `CameraControl.zoomBy()`
 - [core] added `ModelManager.getElementLoader()`
 - [cf] added `ArticleElement.hasInteractors()`
 - [cf] added OAP 1.0 support
 - [utils] `async.ajax()` now returns an abortable promise
 - [utils] `async.ajax()`, `dom.loadScript()` and `dom.loadStyleSheet()` will automatically retry the request in case of network errors, up tp 3 times by default
 - [utils] added optional `pAsync` parameter to `dom.loadScript()`
 - [utils] maximum number of concurrent tasks can be defined for `async.forEachParallel()`
 - [utils] added `object.fromMap()`
 - [eaiws] added `EaiwsSession.eventConnected` and `eventDisconnected`
 - [eaiws] added `EaiwsSession.eventSessionLocaleChanged`
 - [eaiws] added `EaiwsSession.eventCatalogLanguagesChanged`
 - [eaiws] added `EaiwsSession.eventBasketLanguagesChanged`
 - [eaiws] `SessionService.getSystemInformation()` now also available as non static function
 - [eaiws] added `SessionService.importFile()`
 - [eaiws] added `CatalogService.getLanguages()`
 - [eaiws] added `BasketService.getLanguages()`
 - [eaiws] added `BasketService.moveItems()`
 - [eaiws] added functions for basket column handling to `BasketService`
 - [eaiws] added support for EAIWS 4.7 beta 1
 - [bsk] added `Basket.eventModified`
 - [bsk] added `Basket.updateSessionLanguage()`
 - [bsk] added `Basket.checkConsistency()`
 - [bsk] added `Basket.mergeArticles()`
 - [bsk] added `Basket.importPec()`
 - [bsk] added `Basket.moveItems()` and `Basket.getPossibleMoveDirections()`
 - [bsk] added `BasketItem.setTmText()`
 - [bsk] added `FolderItem.setShowSubTotal()`
 - [bsk] added `CalculationManager.eventTaxSchemeChanged`
 - [bsk] added `CalculationManager.eventCurrencyChanged`
 - [bsk] added `CalculationManager.getReferenceCurrency()`
 - [bsk] added support for user defined images to basket items
 - [bsk] added functions for address, contact and project data handling to `ProjectInfo`

### Changes
 - [bsk] `ProjectInfo.getSettings()` and `ProjectInfo.changeSettings()` are now marked as obsolete
 - [libs] updated to blueimp-md5 2.11.0
 - [libs] updated to JSZip 3.2.2

### Bug fixes
 - [core] prevent selection of the canvas in IOS 13
 - [cf] during loading of article geometries, geometries with an invalid bounding box will be ignored to prevent consequential errors
 - [cf] `ArticleManager.insertArticle()` didn't handle the `varCodeType` of `eaiws.catalog.ArticleCatalogItem`
 - [cf] fixed wrong event order during `OAP` processing which could lead to some side effects
 - [cf] fixed wrong handling of OAP object definitions which resulted in some failed OAP actions
 - [cf] visibility check for `OAP` interactors did only check the current child article instead of checking the whole main article
 - [bsk] wrong return type of `Basket.insertUserArticle()`
 - [eaiws] soap requests returned an empty error message in case of network errors or timeouts
 - [eaiws] added missing `OAPPropChangeAction` to basket service
 - [eaiws] added missing type `Import` to `SessionCacheFileType` of session service

### Breaking changes
 - [core] implementations of `io.DocumentContainer` have to implement the `listFiles()` function
 - [utils] renamed `async.ajaxError` into `async.AjaxErrorInfo`
 - [utils] renamed `async.ajaxError.debugInfo` into `async.AjaxErrorInfo.requestInfo`
 - [utils] renamed `async.ajaxErrorDebugInfo` into `async.AjaxRequestInfo`
 - [utils] renamed `async.AjaxErrorMessageCallback` into `async.AjaxCustomErrorCallback`
 - [utils] `async.ajaxDefaultOptions` has to be used instead of `qwest.setDefaultOptions()`
 - [utils] removed `object.className()` as its not working as intended for minified code
 - [eaiws] EAIWS 4.7 beta 1 or higher is required now
 - [eaiws] changed parameters of `EaiwsSession.open()`
 - [eaiws] moved `SessionService` and all related types from `eaiws` to `eaiws.session` namespace
 - [eaiws] moved `BasketService` and all related types from `eaiws` to `eaiws.basket` namespace
 - [eaiws] moved `CatalogService` and all related types from `eaiws` to `eaiws.catalog` namespace
 - [bsk] `Basket.importObx()` may now return `null` if the file upload was aborted
 - [bsk] renamed `Basket.moveItems()` to `Basket.relocateItems()`
 - [pl] deleted unnecessary `styles/pl.css` from distribution
 - [libs] `qwest` is no longer used and therefore is no longer part of the W-CF distribution
 - [libs] updated to BabylonJS 4.0.3 which introduces some breaking changes
 - [libs] updated to core-js 3.3.6 therefore `libs/core-js/shim.min.js` is now named `libs/core-js/minified.js`

## 4.4.1

### Bug fixes
 - [core] `tool.SelectionDefault.eventBackgroundClick` was triggered even if an element was picked after a long touch

## 4.4.0

### New features
 - [cf] added title support for OAP action choice actions
 - [cf] added support for nested OAP action choice actions
 - [cf] added support for OAP create object actions with attach area placement
 - [cf] added `ArticleManager.initializeSession()` which has to be called to enable new OAP features
 - [cf] added `MainArticleElement.fetchBasketItems()`
 - [cf] added `ArticleElement.getBasketItem()`
 - [cf] article properties also store the source `eaiws.ArticleData` in its user data, added `ArticlePropertyHelpers.GetPropertyUserData()` to retrieve the user data
 - [core] added `prop.MultiPropertyProvider.isPropertyValueUndetermined()`
 - [core] bounding box can be disabled for SceneElements (see `mdl.SceneElement.isSelectionHighlightEnabled()`)
 - [core] added `boundingBoxEnabled` flag to `AppSnappingSettings`
 - [core] added `CommandManager.eventHistoryChanged`
 - [core] horizontal and vertical zoom to fit margin can be configured separately, see `view.CameraControl.CameraZoomToFitOptions`
 - [core] improved camera navigation for touchpad users (e.g. `ctrl` can be pressed to switch from orbit to panning)
 - [bsk] added `Basket.InitSessionGeneratedImageOptions()`
 - [eaiws] added support for EAIWS 4.6
 - [eaiws] added `BasketService.getItemFields()`
 - [eaiws] added `BasketService.resetItemFields()`
 - [eaiws] added `BasketService.setItemFields()`

### Changes
 - [eaiws] changed type for array parameters from `Array` to `ReadonlyArray`
 - [core] feedback of rectangle selection tool now respects the application theme

### Bug fixes
 - [utils] `async.Timer.isRunning` was always true after the timer was started once
 - [bsk] operating with multiple basket views could lead to wrong article images

### Breaking changes
 - [core] fixed a typo in `multiSelectAutoStartEnabled` and `multiSelectDeselectAllEnabled` of `tool.SelectionDefault`
 - [eaiws] EAIWS 4.6 or higher is required now
 - [eaiws] `OAPActionListItem.action` is now optional

## 4.3.2

### Bug fixes
 - [core] disabled texture binding optimization in BabylonJS for android devices to prevent rendering errors

## 4.3.1

### Changes
 - [core] `AppDocument.saveToContainer()` and `saveToZip()` do no longer disable the rendering while saving
 - [core] pointer move tolerance now depends on device pixel ratio

## 4.3.0

### New features
 - [core] added `settings` to `Application` which contain global settings for the snapping grid
 - [core] added `tool.SelectionMenu` class which can be used to provide a custom menu for the selected SceneElements
 - [core] added `mdl.SceneElement.getSelectableParentElement()`
 - [core] added `mdl.ModelManager.selectParentSubElement()`
 - [core] added `mdl.SceneElement.boundingBoxVisible` which represents the visible bounds of an object
 - [core] added `eventInteractorTriggered` to `tool.ToolManager`
 - [core] added `eventMultiSelectModeChanged` to `tool.SelectionDefault`
 - [core] added `eventElementClick` to `tool.SelectionDefault`
 - [core] added `eventBackgroundClickImmediate` to `tool.SelectionDefault`
 - [core] added option `multiSelectAutoStartEnabled` to `tool.SelectionDefault`
 - [core] added option `multiSelectDeselectAllEnabled` to `tool.SelectionDefault`
 - [core] added `addResourceFromCache()` to `DocumentOutputContext`
 - [core] added `Color3` as new property type
 - [utils] added `PATCH` as available `AjaxMethod`
 - [utils] added optional `pBeforeCallback` to `async.ajax()`
 - [utils] added `object.toMap()`
 - [utils] added `object.shallowEqual()`
 - [utils] added `dom.loadContentAsBlobUrl()`
 - [utils] added `dom.submitForm()`
 - [utils] added `retryCount` property to `async.ajaxError`
 - [utils] added `async.Timer()`
 - [utils] added `async.DelayedTask()`

### Changes
 - [core] the visible bounding box is used for the selection highlight instead of the complete one
 - [core] the `RectangleSelect` tool no longer toggles the selection in multi selection mode (it only adds new elements)
 - [cf] reduced number of network requests for OAP interactos by caching the interactor images
 - [pl] placement and snapping logics now operate on the visible element bounds instead of the complete one
 - [pl] improved touch handling for `tool.TouchDefault` if camera controls are disabled
 - [utils] improved typings of `ListenableEvent` and `AsyncListenableEvent`, event parameter may only be undefined if is type supports it
 - [libs] updated to core-js 2.6.5
 - [libs] updated to JSZip 3.2.0

### Bug fixes
 - [core] camera orbit inertia animation wasn't stopped when switching camera modes
 - [core] `view.CameraControl.zoomToFitMeshes()` ignored the `pOptions` parameter
 - [pl] moving elements didn't work in snapped orthographic views
 - [libs] fixed memory leak in BabylonJS (a custom BabylonJs build is now used based on version 3.3.0)

## 4.2.0

### New features
 - [core] added optional progress handler to `prop.MultiPropertyProvider.setPropertyValueUndoable()`

### Changes
 - [core] `prop.MultiPropertyProvider` ignores property classes while merging properties (properties with different classes but same key are now identical)
 - [cf] the key of article properties now also contains the property type to increase uniqueness
 - [cf] the key of article property classes now also contains the manfacturer ID and series ID to increase uniqueness
 - [libs] updated to core-js 2.6.1

## 4.1.0

### New features
 - [bsk] added `CalculationManager.getTaxSchemeId()` and `setTaxSchemeId()`
 - [bsk] added `CalculationManager.getTaxScheme()` and `getDefaultTaxScheme()`
 - [bsk] added `CalculationManager.setTaxRate()`
 - [bsk] added `CalculationManager.resetTaxRate()` and `resetTaxScheme()`
 - [bsk] added `ArticleItem.getTaxInformation()`
 - [bsk] added `UserArticleItem.setTaxInformation()`
 - [bsk] added `BaseItem.childIndex`
 - [bsk] added `BaseItem.getPositionNumber()`
 - [bsk] added `ArticleConfiguration.startMultiConfiguration()` which starts configuration of multiple articles
 - [bsk] added `Basket.fetchOfmlUpdateStates()`
 - [core] added `mdl.SceneElement.isDisposed` property
 - [eaiws] added `BasketService.resetTaxConfiguration()`
 - [eaiws] added `BasketService.resetTaxScheme()`
 - [eaiws] added `BasketService.resetTaxRate()`
 - [eaiws] added `BasketService.setTaxRate()`
 - [utils] added `dom.loadScript()`
 - [utils] added `dom.loadStyleSheet()`

### Changes
 - [bsk] speedup of `ArticleConfiguration.start()` (if started again for same article) by caching configuration related article data
 - [cf] `eventPropertiesChanged` is now triggered from `ArticleElement.setEaiwsPropertyValue()` after the article geometry was updated instead of before

### Bug fixes
 - [cf] added missing `pBasketItems` parameter to `ArticleManager.createArticleById()`
 - [cf] handling of `OAPPropEditAction` triggered an `unknown item id` exception on EAIWS side in some edge cases
 - [cf] some `OAP` actions didn't get executed during processing of action lists which include user interactions
 - [cf] execution of `OAP` actions didn't trigger the property changed event in some cases
 - [core] `ModelManager.eventModified` got triggered if an element not part of the scene was modified
 - [eaiws] progress callback for `EaiwsSession.uploadFile()` and `uploadFileToUrl()` wasn't working as intended
 - [eaiws] `ItemProperties.positionNumber` was declared as `boolean` instead of `string`

### Breaking changes
 - [bsk] moved `ArticleConfiguration` from `bsk` to `bsk.cfg` namespace
 - [libs] removed `js` subfolder for each library and moved javascript files to the root of each library
 - [libs] `babylon.max.js` is no longer part of the W-CF distribution

## 4.0.0

### New features
 - [core] added support for arbitrary up-vector to `CameraControl.setTarget()` and `setDirection()`
 - [core] position of `rendering.ShadowPlane` on Y axis can be changed (see `setPlaneYPosition()`)
 - [core] transparency of `rendering.ShadowPlane` can be changed (see `setTransparency()`)
 - [core] added `MaterialManager.pbrImageProcessing` property which gives access to the image processing configuration of PBR materials
 - [core] its now possible to add a custom background to screenshots (see `BaseScreenshotOptions.onDrawBackground`)
 - [core] added `tool.SelectionDefault` as a default tool which handles element selection
 - [core] `MultiPropertyProvider` can also show the union of all properties instead of the intersection
 - [core] added `Viewer.forceRenderFrame()`
 - [eaiws] added `PricingProcedureInfo.getLineTags()` and `CalculationSheetInfo.getLineTags()`
 - [eaiws] added `descriptionMode` to `ArticleProperties` and `ArticleData`
 - [eaiws] added `visibleOnly` and `editableOnly` flag to `OAPPropEditAction`
 - [pl] added basic multi touch default tool (see `tool.TouchDefault`)
 - [pl] added property `groundYPosition` to `tool.Default`
 - [pl] added property `automaticInteractorVisibility` to `tool.Default`
 - [pl] move and rotate interactor images now have a white border
 - [bsk] camera setup will be loaded from article images stored inside the .obk
 - [bsk] it possible to reset the article image camera to its defaults (see, `ArticleConfiguration.assignArticleImageCamera()`)
 - [bsk] added `ArticleConfiguration.resetView()`
 - [bsk] added `ArticleConfiguration.getArticleImageCamera()`
 - [bsk] added `Basket.updateOfmlArticles()`
 - [bsk] added `Basket.eventOfmlArticleUpdated`
 - [bsk] added `Basket.projectInfo`
 - [bsk] added `Basket.generatedImageResolution` property to adjust size of server generated images
 - [bsk] added `ViewItem.findSetArticle()`
 - [bsk] added `ViewArticleItem.findMainArticle()`
 - [bsk] added `CalculationManager.setConditionDescription()`
 - [bsk] added `CalculationManager.setConditionAmount()`
 - [bsk] added `CalculationManager.resetConditionAmount()`
 - [bsk] added `CalculationManager.getGroupCalculation()`
 - [bsk] added `CalculationManager.addManualCondition()`
 - [bsk] added `CalculationManager.removeCondition()`
 - [bsk] added `CalculationManager.setQuantityRelation()`
 - [bsk] added `CalculationManager.resetQuantityRelation()`
 - [bsk] ofml update state can be retrieved from article items
 - [cf] added property `cameraFov` to `ArticleScreenshotOptions`
 - [cf] `ArticleManager.importFromSession()` and `importObx()` now optionally load articles which do not have a position
 - [utils] added `async.Lock.waitWhileLocked()`

### Changes
 - most static class members start with an uppercase letter now (see breaking changes)
 - `unknown` is used instead of `any` in many cases
 - [core] `mdl.ModelManager` no longer creates default lights as they are not required for PBR materials
 - [core] replaced uncompressed env texture (`defaultHDR_256.dds`) with a compressed version to reduce file size and in the same time increase the resolution
 - [pl] `tool.Default` is now derived from `core.tool.SelectionDefault`
 - [cf] `GfjLoader` will clamp incoming color values to prevent potential errors
 - [cf] improved mapping of material roughness values
 - [libs] updated to BabylonJS 3.3.0

### Breaking changes
 - TypeScript 3.1 or higher is required now
 - [core] removed deprecated material `mdl.Material`, use `mdl.PbrMaterial` instead
 - [core] removed translation support from `I18nManager`
 - [core] renamed `io.ZipDocumentContainer.newContainer()` into `NewContainer()`
 - [core] renamed `io.ZipDocumentContainer.loadContainer()` into `LoadContainer()`
 - [core] renamed `mdl.PbrMaterial.convertToPbrParameters()` into `ConvertToPbrParameters()`
 - [core] renamed `mdl.BoundingBox.fromNode()` into `FromNode()`
 - [core] renamed `mdl.BoundingBox.fromMesh()` into `FromMesh()`
 - [core] renamed `mdl.BoundingBox.fromElements()` into `FromElements()`
 - [core] renamed `mdl.io.GltfMesh.importFromUrl()` into `ImportFromUrl()`
 - [core] renamed `mdl.io.GltfMesh.import()` into `Import()`
 - [core] renamed `mdl.io.GltfMesh.export()` into `Export()`
 - [core] renamed `mdl.NodeUserData.fromNode()` into `FromNode()`
 - [core] renamed `mdl.NodeUserData.getData()` into `GetData()`
 - [core] renamed `mdl.NodeUserData.setData()` into `SetData()`
 - [core] renamed `mdl.SceneElement.fromNode()` into `FromNode()`
 - [core] renamed `prop.StringProperty.convertValueToString()` into `ConvertValueToString()`
 - [core] renamed `prop.BoolProperty.convertValueToBool()` into `ConvertValueToBool()`
 - [core] renamed `prop.NumberProperty.convertValueToNumber()` into `ConvertValueToNumber()`
 - [core] renamed `tool.SnapLine.fromAxis()` into `FromAxis()`
 - [core] renamed `tool.SnapLine.snap()` into `Snap()`
 - [core] renamed `tool.SnapPoint.snap()` into `Snap()`
 - [core] renamed `view.CameraControl.setMeshCameraModeMask()` into `SetMeshCameraModeMask()`
 - [core] renamed `view.CameraControl.getMeshCameraModeMask()` into `GetMeshCameraModeMask()`
 - [core] renamed `view.InputState.isMousePointer()` into `IsMousePointer()`
 - [core] renamed `view.InputState.isPrimaryMousePointer()` into `IsPrimaryMousePointer()`
 - [cf] renamed `ArticleElement.getEaiwsProperty()` into `GetEaiwsProperty()`
 - [cf] moved `getOfmlUpdateState()` and `getKnownOfmlUpdateState` from `ArticleElement` to `MainArticleElement`
 - [cf] function signature of `ArticleManager.importFromSession()` and `importObx` has changed
 - [eaiws] EAIWS 4.4 rc 2 or higher is required now
 - [eaiws] renamed `SoapService.logSoapErrors` into `LogSoapErrors`
 - [eaiws] renamed `SessionService.getSystemInformation()` into `GetSystemInformation()`
 - [eaiws] renamed `SessionService.openSession()` into `OpenSession()`
 - [eaiws] renamed `PricingProcedureInfo.createInfo()` into `CreateInfo()`
 - [eaiws] removed `CalculationSheetInfo.vat`, `unitVat` and `vatAmount` because there can be multiple VATs, use `CalculationSheetInfo.getLineTags()` instead
 - [eaiws] removed additional wrappers for literal types as they are no longer necessary, use literals directly
 - [pl] renamed `tool.Default.moveYBelowZeroEnabled` to `tool.Default.moveYBelowGroundEnabled`
 - [libs] removed `i18next`

### Bug fixes
 - [core] `rendering.ShadowPlane` was rendered incorrectly if the scenes clearColor was changed
 - [core] fixed wrong colors in transparent screenshots (objects had an outline)
 - [core] prevent numerical issues with flat objects (size y = 0) in `core.tool.SelectionDefault` bounds calulation

## 3.1.2

### Bug fixes
 - [cf] fixed cache handling in gfj loader, already loaded materials were loaded again

## 3.1.1

### changes
 - [core] added an internal lock to prevent saving of the document while its still loading and vice versa

### Bug fixes
 - [cf] handling of missing textures wasn't correct for PBR materials

## 3.1.0

### New features
 - [core/cf] non-PBR materials will be automatically converted to PBR materials (set `MaterialManager.pbrConversionEnabled` false to disable the conversion)
 - [core] added `Viewer.antiAliasingQuality` property
 - [core] camera FOV can be changed, see `CameraControl.setFov()` property
 - [pl] element deselection can be disabled for default tool, atleast one element always stays selected (see `tool.Default.deselectionEnabled`)
 - [pl] added `tool.Default.showElementInteractors`
 - [bsk] starting an article configuration optionally initializes the camera of a given view
 - [bsk] `ArticleConfiguration.assignArticleImageCamera` can be used to define the camera which is used for the article image generation
 - [bsk] added `Basket.deleteItems()`
 - [bsk] added `Basket.insertFolder()`
 - [bsk] added `Basket.insertTextItem()`
 - [bsk] added `Basket.insertUserArticle()`
 - [bsk] added `Basket.insertSetArticle()`
 - [bsk] added `Basket.insertContainerItem()`
 - [bsk] added `Basket.copyItems()`
 - [bsk] added `Basket.pasteItems()`
 - [bsk] added `Basket.moveItems()`
 - [bsk] added `Basket.importObx()`
 - [bsk] added `Basket.beginSelectionChange()` and `Basket.endSelectionChange()`
 - [bsk] added `Basket.setItemAlternativeState()`
 - [bsk] added `Basket.convertToUserArticles()`
 - [bsk] added `Basket.convertToSetArticle()`
 - [bsk] added `Basket.breakUpSetArticle()`
 - [bsk] added `pShouldFetchCallback` to `BaseItem.fetchItemProperties()` and `BaseItem.fetchCalculations()`
 - [bsk] added `eventHeaderCalculationChanged` to Basket and View
 - [bsk] added `ArticleItem.hasIndependentChildren()`
 - [bsk] added `ArticleItem.getCompositeCalculation()`
 - [bsk] added `BaseItemManager.waitUntilItemsUpdated()`
 - [bsk] added `BaseItem.isExcludedFromCalculations()`
 - [bsk] added `CalculationManager.get/setExchangeRates()`
 - [bsk] added support for basket views
 - [cf] added `MainArticleElement.getCompositeCalculation()`
 - [cf] support `RotateNY90` and `RotatePY90` OAP interactor symbols
 - [eaiws] added `sessionId` property to `EaiwsSession`
 - [eaiws] added support for basket views
 - [eaiws] added `plugins.PriceProfileService` as wrapper for the SOAP interface of the eaiws PriceProfile plugin
 - [eaiws] added `manufacturer`, `program` and `distributionRegion` to `ArticleProperties`
 - [eaiws] added `BasketService.changeAlternativePositionState()`
 - [eaiws] added `BasketService.insertUserArticle()`
 - [eaiws] added `BasketService.convertToUserArticles()`
 - [eaiws] added `BasketService.removeFromSetArticle()`
 - [eaiws] added `BasketService.breakUpSetArticle()`
 - [utils] the maximum number of concurrent operations can be defined for `async.Lock`
 - [utils] added `string.joinPath()`
 - [utils] added `string.compare()`
 - [utils] added `number.toLocaleCurrencyString()`

### Changes
 - [core] removed special handling of mirrored geometries, this is now done from BabylonJs (results in reduced memory usage)
 - [core] `mdl.Material` is now marked as deprecated and will be removed in later releases, use `mdl.PbrMaterial` instead
 - [bsk] article configuration view uses a camera FOV of 30°
 - [bsk] enabled PBR render mode for article images
 - [cf] a fallback OAP interactor symbol will be used if the specified symbol size is not available
 - [cf] updated OAP interactor symbols
 - [cf] a camera FOV of 30° will be used for article screenshots
 - [libs] updated to BabylonJS 3.2.0
 - [libs] updated to core-js 2.5.7
 - [libs] updated to i18next 11.5.0

### Breaking changes
 - [core] function signature of `AppCallbacks.showPropertyEditor()` has changed
 - [bsk] removed `Basket.deleteItem()`, use `Basket.deleteItems()` instead
 - [bsk] moved `invalidateHeaderCalculation()` and `getHeaderCalculation()` from `CalculationManager` to `Basket`
 - [bsk] renamed `BasketItemUpdateFlags` to `ItemUpdateFlags`
 - [bsk] EAIWS 4.4 beta 1 or higher is required now
 - [eaiws] `BasketItem.getMainArticleId()` returns undefined if `BasketItem.mainArticleId` is undefined
 - [utils] the `pErrorMessageCallback` of the `ajax` function now gets the thrown error as first argument
 - [dev_utils] the `dev_utils` module was removed, the `createAxisTrihedron` function is now part of the `pl` module (see `utils.planning.createAxisTrihedron()`)

### Bug fixes
 - [core] camera navigation temporarily not working correctly after zoom to fit for orthographic cameras
 - [core] prevent clipping of small objects (<10 cm) after zoom to fit for perspective cameras
 - [bsk] fixed issues regarding header calculation updates
 - [cf] OAP PropEditAction didn't work correctly for multiple properties
 - [eaiws] pItemIds parameter of `BasketService.getAllItems()` and `BasketService.getItemProperties()` is now optional
 - [eaiws] SOAP services didn't work if base-url contained a trailing slash
 - [eaiws] wrong handling of `Value` types in soap requests
 - [utils] parallel execution of `AsyncListenableEvent.trigger()` is now prevented using `async.Lock`

## 3.0.1

### New features
 - [pl] `moveYBelowZeroEnabled` property of default tool can be set to false to prevent moving objects below zero

## 3.0.0

### New features
 - [bsk] new module which is a wrapper for the eaiws basket functionality
 - [core] experimental support for PBR materials
 - [core] WebGL 2.0 is disabled by default, see `AppInitOptions.disableWebGL2Support`
 - [core] added support for `BABYLON.TransformNode`
 - [core] `CameraControl.zoomToFitElements()` and `zoomToFitMeshes()` now support zoom based on the bounding sphere
 - [core] a minimum pixel based margin can be defined for zoom to fit (see `CameraZoomToFitOptions.minMarginPx` )
 - [core] added property `providers` to `MultiPropertyProvider`
 - [core] added support for horizontal fov mode to camera (`BABYLON.Camera.FOVMODE_HORIZONTAL_FIXED`)
 - [core] added `Application.eventAnimate`
 - [core] added `Application.theme.fontFamily`
 - [core] default camera position and zoom can be changed, see `CameraControl.DEFAULT_CAMERA_POSITION` and `CameraControl.DEFAULT_CAMERA_ORTHO`
 - [core] its now possible to draw an overlay on screenshots, see `BaseScreenshotOptions.onDrawOverlay`
 - [core] added `BaseScreenshotOptions.pixelScaleFactor` to adjust scaling of certain elements like 2D text
 - [core] added `Application.appCallbacks.showActionChoice`
 - [core] added orthographic orbit snapping to CameraControl, see `CameraControl.orthoOrbitSnappingEnabled`
 - [core] added `Application.dispose()`
 - [cf] added `hideMainArticle` and `visibleSubArticles` properties to `MainArticleElement` to control article visibility
 - [cf] added `ArticleManager.eventArticleAdded` and `eventArticleRemoved` and `eventArticleInstanceRestored`
 - [cf] added `ArticleManager.createArticlesById()`
 - [cf] added `ArticleManager.getArticleById()`
 - [cf] added `ArticleManager.fatherItemId` property
 - [cf] added `MainArticleElement.hasSubArticles()`
 - [cf] added calculation support
 - [cf] added support for custom article geometry placeholders
 - [cf] added support for sub articles to article geometry placeholders
 - [cf] added support for sub articles which do not have a geometry
 - [cf] sub article highlighting, see `MainArticleElement.highlightSubArticles()`
 - [cf] bounding box dimensions for articles, see `MainArticleElement.showDimensions`
 - [cf] PEC import no longer requires an open EAIWS session
 - [cf] PEC import supports loading of camera position from PEC
 - [cf] added support for OAP interactor visibility and action choice
 - [pl] rotation and movement can be enabled/disabled in default tool for each axis
 - [pl] main and sub selection box can be disabled in default tool, see `showMainElementSelection` and `showSubElementSelection`
 - [pl] enabled bounding box snapping on walls for move tool
 - [pl] added `eventBackgroundClick` to default tool
 - [eaiws] added `relocateItems()` to basket soap interface
 - [eaiws] added `getImages()` to basket soap interface
 - [eaiws] added `getSessionProperty()` to session soap interface
 - [eaiws] added `set/getProjectSettings()` to session soap interface
 - [eaiws] added `configureSessionLog()` and `getSessionLog()` to session soap interface
 - [eaiws] added helper classes for calculation handling, see `PricingProcedureInfo` and `CalculationSheetInfo`
 - [eaiws] default request timeout can be defined, see `SoapService.requestTimeout`
 - [eaiws] added support for OAP interactor visibilit and action choicey
 - [utils] added `object.Indexable` interface
 - [utils] added `string.isNotNullOrEmpty()`
 - [utils] added `newError()` and `rejectError()` helper functions
 - [utils] added `AsyncListenableEvent`
 - [utils] added `async.Lock`
 - [utils] `string.fromBlob()` optionally returns a data-uri instead of a text

### Changes
 - whole framework is compiled with strictNullCheck and strictFunctionTypes compiler option enabled (it is recommended that the host application also enables it)
 - [cf] TransformNodes are used now for GFJ-nodes without geometry
 - [libs] updated to BabylonJS 3.1.1
 - [libs] updated to core-js 2.5.4
 - [libs] updated to JSZip 3.1.5
 - [libs] updated to i18next 10.6.0

### Breaking changes
 - [room] room is no longer part of the W-CF distribution, it is distributed separately
 - [core] replaced `SceneElement.mesh` with `SceneElement.node`
 - [core] replaced `SceneElement.getMeshes()` with `SceneElement.getNodes()`
 - [core] replaced `SceneElement.cloneMesh()` with `SceneElement.cloneNode()`
 - [core] `BABYLON.Node.getChildTransformNodes()` should be used instead of `BABYLON.Node.getChildMeshes()` to ensure correct handling of TransformNodes
 - [core] replaced `pMargin` parameter of `CameraControl.zoomToFitElements()` and `zoomToFitMeshes()` with `pOptions` parameter
 - [core] replaced `CameraControl.dblClickZoomToFitMargin` with `dblClickZoomToFitOptions` property
 - [core] moved `Serializable` interface from `core.io` to `utils.object` namespace
 - [core] moved and renamed `core.util.CustomDataMap` to `utils.GroupedMap`
 - [core] removed `pImageData` parameter from `BaseScreenshotOptions.onAfterRender` callback
 - [core] signature of `Application.appCallbacks.showPropertyEditor` has changed
 - [cf] EAIWS 4.3.0 beta 2 or higher is required now
 - [cf] renamed `EaiwsManager` to `ArticleManager`
 - [cf] renamed `MainArticleElement.cacheItemProperties()` to `fetchItemProperties()`
 - [pl] removed `simpleEditMode` from default tool, use `rotateXEnabled = false` and `rotateZEnabled = false` instead
 - [utils] several functions no longer silently ignore null parameters, an `ERR_INVALID_ARGUMENT` exception is now thrown
 - [eaiws] removed `SoapService.isValid()` and  `SoapService.setSessionId()`
 - [eaiws] `SessionService.openSession()` is now a static member function
 - [eaiws] `SessionService.getSystemInformation()` is now a static member function

### Bug fixes
 - [eaiws] added missing `originalItemIds` to `PasteContainerResult`

## 2.1.1

### Breaking changes
 - [cf] path to stored catalog images is now lowercase

### Bug fixes
 - documentation failed to build

## 2.1.0

### New features
 - [core] SceneElements can implement own interactors (`SceneElement.showInteractors()`)
 - [core] SceneElements can provide additional undo data for delete and transform commands (`SceneElement.saveUndoData()`)
 - [core] SceneElements can provide a custom bounding box for the selection highlight (`SceneElement.getSelectionHighlightBoundingBox()`)
 - [core] Its now possible to hide meshes for certain camera modes, see `view.CameraControl.setMeshCameraModeMask()`
 - [core] added `tool.InteractorManager.dispose()`
 - [core] added `I18nManager.lengthUnit` and `I18nManager.setLengthUnit()`
 - [core] `I18nManager.translate()` now supports fallback keys and interpolation
 - [core] added basic theme support (`Application.theme`)
 - [core] added application callbacks (`Application.appCallbacks`)
 - [core] added support for 3d transformed interactors
 - [core] AppModules can abort the document load and save process
 - [core] added support for custom document validation during loading, see (`AppDocumentLoadOptions.onValidateDocument`)
 - [core] added failed/aborted parameter to `eventAfterLoad` and `eventAfterSave` of `AppDocument`
 - [core] added `ModelManager.eventBeginTransformElements` and `eventEndTransformElements` (will be triggered from TransformElements command)
 - [core] `Viewer.createScreenshot()` optionally returns the image as blob (`pAsBlob` parameter)
 - [core] `GltfMesh.import()` and `importFromUrl()` also support glTF 2.0
 - [core] added `mdl.BasicElement`
 - [core] added `mdl.SceneElement.getSelectableElement()`
 - [eaiws] added calculation support to basket soap interface
 - [eaiws] added oap support to basket soap interface
 - [eaiws] added `setSessionProperty()` to session soap interface
 - [utils] added functions for length unit handling to `number` namespace
 - [utils] added `object.isNullOrEmpty()`
 - [pl] DefaultMove tool uses application settings for length feedback
 - [pl] application theme is used for selection bounding box and tool feedback
 - [cf] a placeholder will be shown for articles without geometry
 - [cf] PEC import (`io.PecImport`)
 - [cf] basic support for user articles
 - [cf] added support for OAP interactors
 - [cf] added `ArticleElement.hasGeometry()`
 - [cf] added `ArticleElement.getKnownOfmlUpdateState()`
 - [cf] support selectable flag of sub articles
 - [utils] added `trim()`, `trimLeft()`, `trimRight()`, `regExpEscape()` and `fromBlob()` to string utils

### Changes
 - [core] `rendering.ShadowPlane` is only visible in perspective and orthographic views
 - [core] `rendering.ShadowPlane` ignores objects which are positioned at y = 0 and have zero height (eg. planes)
 - [pl] default tool only selects sub elements if they are selectable
 - [cf] maximum texture size of gfj materials is now 1024 (can be changed with `EaiwsManager.setGfjMaxTextureSize()`)
 - [libs] updated to BabylonJS 3.1.0-alpha
 - [libs] added blueimp-md5 2.10.0
 - [libs] updated to core-js 2.5.1
 - [libs] updated to i18next 9.0.0
 - [libs] updated to JSZip 3.1.4
 - [libs] updated to PEP 0.4.3
 - [libs] updated to qwest 4.5.0

### Breaking changes
 - [core] interactores will override the css tranform style of the HTML element, use `Interactor.customCssTransform` to define additional transforms
 - [core] `GltfMesh.export()` exports glTF version 2.0 and uses a right handed coordinate system
 - [core] changed document major file version to 2 (loading of version 1 files is supported)
 - [room] reimplemented whole module, replaced polygon based concept with simple wall system based on pCon.planner
 - [cf] blueimp-md5 library is required now
 - [cf] `EaiwsManager.importObx()` does no longer add the loaded articles to the `ModelManager` automatically
 - [cf] EAIWS 4.2.0 beta 5 or higher is required now
 - [cf] Parameter of `ArticleElement.getArticleData()` has changed
 - [cf] moved `OfflineContext` and `GfjLoader` to `io` namespace
 - [cf] requires that stylesheet `dist/cf.css` is loaded
 - [pl] requires that stylesheet `dist/pl.css` is loaded

### Bug fixes
 - [core] env map was visible even for materials with reflection = 0
 - [core] `prop.LengthProperty` didn't implement `clone()`
 - [core] memory leak after cloning a `ThickLinesMesh`
 - [core] mirrored top and bottom view in Firefox 64bit
 - [core] mirrored shadow plane in Firefox 64bit
 - [core] property choice lists of multi selection contained invalid choices
 - [core] `GltfMesh.import()` failed if glTF mesh did not had indices
 - [cf] `EaiwsManager.synchronizeSession()` didn't save article transformations correctly
 - [cf] `ArticleElement` didn't handle intervals of eaiws properties
 - [cf] GfjLoader used same id for different materials in some cases
 - [cf] OfflineContext returned wrong data in some cases
 - [pl] `utils.placeElementsAtFreePosition()` didn't consider given position if model was not empty
 - [pl] fixed sub element selection under chrome and some android devices

## 2.0.0

### New features
 - [core] new persistence concept
 - [core] added localization support
 - [core] added `mdl.GeometryManager` which handles geometry caching
 - [core] added `AppDocument` for document handling (e.g. load, save)
 - [core] new AppModule system, modules can now register an`AppModule` at the application
 - [core] reduced texture memory usage by disabling the alpha channel if possible
 - [core] updated to BabylonJS 3.0 alpha
 - [core] added `prop.Property.type` which returns the property type as enum
 - [core] added `ThickLinesMesh` to mesh utils
 - [core] added `disableWebGL2Support` option to `AppInitOptions` (default: false)
 - [eaiws] added support for catalog resources
 - [cf] added `EaiwsManager.importObx()` and `exportObx()`
 - [cf] offline article information
 - [cf] ofml article migration support
 - [pl] changed style of the selection bounding box

### Breaking changes
 - [core] TypeScript 2.3 or higher is required now
 - [core] JSZip and i18next as new library dependency
 - [core] `document.clear()` should be used instead of `model.clear()` to start a new document/project
 - [core] moved `eventBeforeClear` and `eventAfterClear` from model to document
 - [core] moved `eventBeforeLoad` and `eventAfterLoad` from model to document
 - [core] moved `eventBeforeSave` and `eventAfterSave` from model to document
 - [core] replaced `mdl.MaterialManager.getOrCreateTexture()` with `createTexture()` and `createResourceTexture()`
 - [core] `mdl.MaterialManager` now operates on `mdl.Material` instead of `BABYLON.StandardMaterial`
 - [core] BabylonJs audio engine is disabled by default
 - [room] moved `RoomManager` from room.mdl to room namespace
 - [cf] EAIWS 4.1.0 or higher is required now
 - [cf] camera settings and scene are no longer saved inside the obk file, they are part of the document now
 - [cf] renamed `EaiwsManager.loadFromSession()` to `importFromSession()`
 - [cf] added parameter `pSaveArticleTransformations` to `EaiwsManager.synchronizeSession()` and `saveToObk()`

### Bug fixes
 - [core] `utils.math.orientationToLine2()` returned wrong results
 - [core] double click detection did not work on windows tablets
 - [cf] configuring multiple articles at once created geometrical artifacts
 - [pl] rectangle selection tool wasn't aborted if default tool was stopped
 - [pl] rectangle selection tool selected all elements if the user entered a zero sized area

## 1.3.0

### New features
 - [pl] improved placing logic of `utils.planning.placeElementsInViewCenter()` and `utils.planning.placeElementsAtFreePosition()`
 - [pl] snapping grid and placing area can be defined for `utils.planning.placeElementsInViewCenter()`
 - [pl] rotate interactors of default tool are only shown if they are useful with the current camera viewing direction
 - [core] a navigation area can be defined for `view.CameraControl` to limit certain camera interactions (e.g. zoom)
 - [core] added `view.CameraControl.yawMin` and `yawMax`
 - [core] `rendering.ShadowPlane` is no longer limited to an 10x10m area, the area size will be updated automatically
 - [core] reduced gpu memory usage of `rendering.ShadowPlane` by 25% (from 16 MB to 12 MB)
 - [core] improved anti-aliasing performance

### Breaking changes
 - [pl] `pMaxOriginDistance` parameter of `utils.planning.placeElementsInViewCenter()` got replaced by `pOptions` parameter
 - [pl] `pDesiredPos` parameter of `utils.planning.placeElementsAtFreePosition()` is now of type Vector2 instead of Vector3
 - [cf] `pShouldMigrateCallback` of `EaiwsManager.loadFromSession()` will be called for migratable and updatable articles

### Bug fixes
 - [cf] fixed wrong item properties after article migration in `EaiwsManager.loadFromSession()`

## 1.2.0

### New features
 - [utils] added `async.ajaxResolvedEvent` and `async.ajaxRejectedEvent`
 - [utils] added some `ArrayBuffer` utility functions
 - [core] added `math.angleDistance()` which returns the signed distance between 2 angles
 - [core] added `mdl.io.GltfMesh` class which provides import and export functionality for glTF meshes
 - [eaiws] added `CatalogService.getCatalogPath()`

### Breaking changes
 - [utils] `async.ajax()` is now based on qwest instead of jQuery
 - [utils] jQuery is no longer part of the W-CF distribution
 - [core] `tool.SnapGrid.size` is now of type `BABYLON.Vector3` instead of `number`
 - [cf] removed `GltfMeshLoader` class, `core.mdl.io.GltfMesh` can be used instead

### Bug fixes
 - [eaiws] "no element found" error in EaiwsSession.uploadFile() and deleteFile() (Firefox)
 - [pl] angle feedback value of rotate tool was sometimes invisible inside Android WebView
 - [core] orbit for orthographic camera wasn't working correctly

## 1.1.0

### New features
 - [utils] added `array.unique()` which returns the unique entries of a given array
 - [utils] type checking helpers `array.isArray()`, `string.isString()`, `number.isNumber()` and `boolean.isBoolean()`
 - [core] current view is given as paramater for `tool.Interactor.onBeforeUpdateViewPosition` callback
 - [core] `view.Viewer.onDemandRenderingEnabled` which can be used to enable permanent rendering
 - [core] `view.Viewer.beginDisableRendering()` and `view.Viewer.endDisableRendering()`
 - [core] `mdl.LayerManager.getMeshesOnLayer()` which retrieves all meshes for a given layer
 - [core] `mdl.BoundingBox.intersectsPoint()` and `mdl.BoundingBox.intersectsMinMax()`
 - [cf] added article migration support to `EaiwsManager.loadFromSession()`
 - [cf] added event `MainArticleElement.eventGeometryChanged` which will be triggered inside updateGeometry()
 - [cf] added `MainArticleElement.waitUntilGeometryUpdated()` which waits for pending geometry updates
 - [build] generate map files for minified js

### Breaking changes
 - [core] renamed `math.quaternionFromAxis()` to `math.quaternionFromAxes()`
 - [core] `view.Viewer.renderingEnabled` is now readonly, use `view.Viewer.beginDisableRendering()` and `view.Viewer.endDisableRendering()` instead
 - [core] added additional parameter `pBorderIntersections` to `mdl.BoundingBox.intersects()` to control
   the behavior on the border of the bounding box. Use `false` for behavior from previous version.
 - [core] changed `pEpsilon` parameter default value of `mdl.BoundingBox.intersects()` to `utils.math.EPSILON`.
   Use `0.0` for default behavior from previous version.

### Bug fixes
 - [utils] `math.roundTo()` returned NaN for very small values
 - [core] fixed "null is not an object" exception in `io.stringifyToJson()`
 - [core] camera panning and orbit didn't work in some cases if camera was very close to an object
 - [pl] bounding box snapping wasn't working for different sized objects