exsuite/js - what's new
3.0 Mar 25, 2024
*NEW:   Synchronizes the screen resolution or zoom level with the control's Zoom feature (for instance CTRL + Plus key enlarges everything on the page) (exontrol.combobox, exontrol.gantt, exontrol.graph, exontrol.orgchart, exontrol.pivot, exontrol.surface, exontrol.swimlane, exontrol.tree)
*Added: Prevents blurry on retina screens when screen resolution or zoom-level changes (exontrol.combobox, exontrol.gantt, exontrol.graph, exontrol.orgchart, exontrol.pivot, exontrol.surface, exontrol.swimlane, exontrol.tree)
*Added: GetCanvas() {HTMLCanvasElement}, returns the HTMLCanvasElement object where the control is currently running on (exontrol.combobox, exontrol.gantt, exontrol.graph, exontrol.pivot, exontrol.tree)
*Added: Misc changes to allow exhelper/js to work properly with a different screen-resolution or zoom level (exontrol.exhelper)
*Added: ZoomLevels property initialized to "25,50,75,100,110,125,150,175,200,250,300,400,500" (exontrol.graph)
*Added: MiscellaneousOptions.allowValueScroll {number}, indicates a positive number that defines whether the value-scroll is visible or hidden (valid for area-type charts only). The value-scroll is the vertical-scroll bar for horizontal charts (categories goes horizontally), and horizontal scroll bars for vertical charts (categories goes vertically). By default, the control shows no value-scroll. For instance, the value-scroll could be shown if the control is zoomed (exontrol.graph)
*Fixed: Uncaught TypeError: Cannot read properties of undefined (reading 'GetCaption') (exontrol.common)
*Fixed: TypeError: element.getBoundingClientRect is not a function (FireFox) (exontrol.common)
*Fixed: The float-element that's shown while user drag and drop objects shows at wrong position when the canvas's zoom CSS style is not 1 (exontrol.common)
*Fixed: The tooltip position is not showing at the right position where the canvas's zoom CSS style is not 1 (exontrol.common)
*Fixed: Updates the popup-menu's CSS zoom factor based on the CSS zoom factor of the "client" parameter of the contructor (CANVAS type) (exontrol.menu)
*Fixed: The drop-down filter context-menu is shown at a different position, if CSS zoom factor is not 1 (exontrol.tree)
*Fixed: TypeError: Cannot read properties of null (reading 'getTime') during hD(histogramData) method (exontrol.gantt)
*Fixed: Sometimes, the drop-down panel may be increased indefinitely if allowResize property is used (exontrol.combobox)
*Fixed: Clear, Remove methods of Series object, requires calling the Refresh method to take effect (exontrol.graph)
*Fixed: TypeError: Cannot read properties of undefined (reading 'd'), while the user clicks an item of the legend for "scatter", "scatterLine" or "bubble" chart-types (exontrol.graph)
*Fixed: The Serie(id) property does not return named series (name option has been set) (exontrol.graph)

2.5 Dec 21, 2023
*NEW:   ExGraph/JS is a component that offers excellent graphical data visualization. It has many different types and styles of charts. Easy to use, zoom, resize, scroll, overview, legend, cursor view, owner-draw, numerous chart types to different axes in the same view, multiple views, and much more are features of the ExGraph/JS package. The ExGraph/JS is a HTML standalone-component, written in JavaScript, that uses no third-party libraries.
*Added: exontrol.D.P.PieRing defines the pie-ring primitive (slice of doughnut). The PieRing primitive requires startAngle (defines the angle (radians) to start the pie), sweepAngle (specifies the sweep angle in radians relative to the starting angle) and width(Specifies the width of the ring (if 0 the method defines an arc, if deep enough it defines a pie of an ellipse) (exontrol.common)
*Fixed: Sometimes after horizontal and vertical scroll bars are shown both, they are continuously shown or hidden (exontrol.common)
*Fixed: The alpha field of the rgba() syntax shows too many decimals (exontrol.C.C2S method) (exontrol.common)
*Fixed: Rarely, the curved lines goes through (0,0) even if the range of points are not close to origin (exontrol.common)
*Fixed: The properties of enum type may lock indefinitely the application if using integers instead of literals. For instance, scrollBars: "min,3" should translate to exBoth,exMinSBS, instead the app freezes (exontrol.common)
*Fixed: Improves performances for methods of the exontrol.C(olor) and exontrol.S(hape) namespaces (exontrol.common)
*Fixed: The 1-pixel frame-wide rectangle look thicker (exontrol.patch)
*Fixed: Shows bezier/spline curves smoother (exontrol.bezier)
*Fixed: The scrollBarsHome/ScrollBarsHome/SetScrollBarsHome(value) property/method has no effect (exontrol.surface)
*Fixed: Prevents showing the resizing cursor over the margins of the overview-selection, while control's Locked property is true (exontrol.gantt)

2.4 Oct 02, 2023
*NEW:   Ability to resize the chart using the left/right margins of the overview-selection (exontrol.gantt)
*Added: Properties of Enum type support partial literals separated by comma. For instance, Chart.OverviewVisible = "scroll,margin" is equivalent with 24832(0x6100) equivalent of exOverviewAllowVerticalScroll | exOverviewShowMargins | exOverviewShowSelMargins (exontrol.common)
*Added: shapes option supports the "select-overview-resize" part, that defines the visual-appearance to display left/right resize-margins of the overview-selection (exontrol.gantt)
*Added: shapes option supports the "selectout-overview" part, that defines the visual-appearance to display the left/right parts outside of the overview-selection (exontrol.gantt)
*Added: shapes option supports the "selectunit-overview", that defines the visual-appearance to display the selected unit within the control's overview (exontrol.gantt)
*Added: shapes option supports the "unavailableunit-overview", that defines the visual-appearance to display unavailable-units within the control's overview (exontrol.gantt)
*Added: allowActions option supports "overview-selection-resize" action, that resizes the chart using the left/right margins of the overview-selection. The "overview-selection-resize" action allows the [unsmooth] flat, the chart is resized and moved unit by unit rather than pixel by pixel  (exontrol.gantt)
*Added: HeaderEnabled/GetHeaderEnabled()/SetHeaderEnabled(value) {boolean}, enables or disables the control's header (includes the control's sortbar or floatbar). While disabled the user can't move, resize, sort or drag and drop the columns by drag and drop (exontrol.tree)
*Added: Column.Values/GetValues()/SetValues(values) {any}, specifies a list of predefined values that the current column can display. While editing the column, the user can select a value from this predefined values only (exontrol.tree)
*Added: Column.EditOptions/GetEditOptions()/SetEditOptions(value) {object},  specifies the options to apply on cell's editor. For instance, you can specify the type of the <input> element to edit a column of date-type (exontrol.tree)
*Added: EditOptions.client {string}, specifies a collection of up to four expressions that can define a different client area to show the editor. A string expression of "[expression,expression,expression,expression]" type, that determines the x, y, width and height of the new editor. The client field must starts with "[" and ends with "]", else it has no effect (exontrol.tree)
*Added: EditOptions.create {callback}, indicates a function of callback(oHE) type that's invoked once the inner HTML editor is created (by default of HTMLInputElement or HTMLSelectElement type) (exontrol.tree)
*Added: Parent/GetParent()/SetParent(value) {object}, specifies the custom caption and image to be displayed on the "parent" section, as an object of {caption,image} type (if parent is not specified or the caption or image is missing the caption, image of the browsed item is displayed instead) (exontrol.radialmenu)
*Added: Item.Parent/GetParent() {Item}, retrieves the item's parent (exontrol.radialmenu)
*Fixed: The <%loc_*%> fields (<%loc_sdate%>, <%loc_ldate%>, ...),  displays undefined (exontrol.common)
*Fixed: Sometime, the current drag and drop operation is canceled if a allowActions property includes an action with Long flag (Long", specifies that the action requires a "long" click or touch before it begins) (exontrol.common)
*Fixed: The horizontal/vertical lines look thicker (exontrol.patch)
*Fixed: The popup-menu is very small and displayed into the top-left corner of the control (exontrol.menu)
*Fixed: The day's grid-lines are hidden while the cursor hovers the date, while using shapes option includes "gridline(d)" (exontrol.calendar)
*Fixed: Sometime, the click-date (exact-date) of p2UL() method returns wrong value while the cursor hovers the first or last visible date of the view (GV object) (exontrol.gantt)
*Fixed: The right margin of the overview-selection shows the time as last visible date + 1 (exontrol.gantt)
*Fixed: TypeError: Cannot use 'in' operator to search for 'id' in link-cp-all (exontrol.schedule)

2.3 Sep 11, 2023
*NEW:   Visual / Content customization for start / end margins of the bar being created, resized or moved (chart.dateTickerLabel option) (exontrol.gantt)
*NEW:   Predecessor/Successor columns support, or ability to display and edit the links of the bar, using the bar's predecessor/successor(s) fields (exontrol.gantt)
*Added: ItemBar.Predecessor/GetPredecessor()/SetPredecessor(value) {string}, defines the list of bar's predecessors separated by comma. The bar's predecessor is defined in INDEX1["SF"|"FS"|"FF"|"SS"][KEY][:["W"]LAG|:LAG["W"]] format, where INDEX1 is the 1-based index of the item that hosts the bar followed by the type of the link which can be one any of SF(Start-Finish), FS(Finish-Start), SS(Start-Start) or FF(Finish-Finish) sequence (FS if missing), continues with the KEY of the bar (empty is not used), and ends with the LAG of the link (specifies the delay the activity is postponed by the link). The "W" indicates a working-lag for the link (specifies the delay in working-units the activity is postponed by the link). For instance, "2FSZ" specifies that the current item-bar is linked with the "Z" bar of the second item (item with the index 1) using a Finish-Start link. The "1SF:-2" adds a Start-Finish link with the bar '' of the first-item, using a lag of -2 days. Changing the ItemBar(exBarPredecessor) property updates the links related to the current bar (exontrol.gantt)
*Added: ItemBar.Successor/GetSuccessor()/SetSuccessor(value) {string}, defines the list of bar's successors separated by comma. The bar's successor is defined in INDEX1["SF"|"FS"|"FF"|"SS"][KEY][:["W"]LAG|:LAG["W"]] format, where INDEX1 is the 1-based index of the item that hosts the bar followed by the type of the link which can be one any of SF(Start-Finish), FS(Finish-Start), SS(Start-Start) or FF(Finish-Finish) sequence (FS if missing), continues with the KEY of the bar (empty is not used), and ends with the LAG of the link (specifies the delay the activity is postponed by the link). The "W" indicates a working-lag for the link (specifies the delay in working-units the activity is postponed by the link). For instance, "3SFy" specifies that the current item-bar is linked with the "y" bar of the third item (item with the index 1) using a Start-Finish link. Changing the ItemBar(exBarSuccessor) property updates the links related to the current bar (exontrol.gantt)
*Added: The `format` operator of expression properties supports formatting the date values, using d, dd, ddd, ddd (day of the month as digits, with or without leading zeros, abbreviated day of the week, day of the week as specified by the current locale ), m, mm, mmm, mmmm (month as digits, with or without leading zeros, abbreviated month, month as specified by the current locale), y, yy, yyy, yyyy (year represented only by the last digits, by a full four or five digits, depending on the calendar used) literals. For instance, the "date(value) format `mmm d, yyyy`" gets the value in MMM d, YYYY format using the current locale, such as "Jan 12, 2023" (exontrol.common)
*Added: The chart.dateTickerLabel option supports <%=formula%> expression to customize the label to be shown for start and/or end margins of the bar being created, moved or resized. The expression (after the = character) supports keywords such as "value" that defines the DATE being displayed (could be start or end), "start" that defines the start-margin of the bar as a DATE type and "end" that defines the end-margin of the bar as a DATE type. For instance, "<%=shortdate(value=end?value-1:value)%>" displays the end-margin with one day before, or the "<%mmm%> <%d%><fgcolor 808080><%=value=end?` (`+(end - start) + `)`:``%>" displays the month, the day and for the end-margin includes the number of days of the bar being created, resized or moved. The "<%=value=start?``:value%>" specifies that only end-margin of the bar is being shown (exontrol.gantt)
*Added: Chart.DateTickerLabelVAlign/GetDateTickerLabelVAlign()/SetDateTickerLabelVAlign(value) {number}, specifies the vertical alignment of the date label, while create, resize or move the bar (exontrol.gantt)
*Added: Chart.DateTickerLabelHMargin/GetDateTickerLabelHMargin()/SetDateTickerLabelHMargin(value) {number}, indicates the distance between the date-label and the bar, while create, resize or move it (exontrol.gantt)
*Added: "exdatelabel" indicates the class-name for start/end margins to show by chart.dateTickerLabel option (exontrol.gantt)
*Added: Link.Type/GetType()/SetType(value) {number}, specifies the link's type as one of the following values 1(SF, S(tart)-F(inish), 2(FS, F(inish)-S(tart)), 4(FF, F(inish)-F(inish)) or 8(SS, S(tart)-S(tart)) (exontrol.gantt)
*Added: resTLB(), resets the critical-path, temporarily shapes for bars and visual-appearances for links (exontrol.gantt)
*Added: background.psLinkEditSel {DisplayLinkType}, specifies the visual-appearance to apply on links being selected within an editable predecessor/successor column (exontrol.gantt)
*Added: background.psBarShapeEditSel {object}, specifies the shape to apply on incoming/outgoing bars of the links being selected within an editable predecessor/successor column (exontrol.gantt)
*Fixed: The first or last <br> sequences of HTML captions are ignored (exontrol.common)
*Fixed: The create-bar shows as an horizontal-line, if the Chart.Bar("Task").Height is -1 (if negative, the bar's height is identical with the item's height) (exontrol.gantt)
*Fixed: Prevents showing the window's vertical scroll bar when the user creates, resizes or moves the bar, while chart.dateTickerLabel options is set (exontrol.gantt)

2.2 Aug 28, 2023
*NEW:   onanchorclick event, occurs when an anchor element is clicked. An anchor is a piece of text or some other object (for example an image) which marks the beginning and/or the end of a hypertext link. The <a> element is used to mark that piece of text (or inline image), and to give its hypertextual relationship to other documents. The AnchorClick event is fired only if prior clicking the control it shows the hand cursor (exontrol.calendar, exontrol.combobox, exontrol.gantt, exontrol.gauge, exontrol.tree, exontrol.menu, exontrol.orgchart, exontrol.pivot, exontrol.schedule, exontrol.surface, exontrol.swimlane)
*Added: The <solidline> and <dotline> HTML tags support color in RGB format using the <solidline RRGGBB> or <dotline RRGGBB> syntax, which indicates the color to show the solid or dotted line (exontrol.common)
*Added: Element.AutoSize/GetAutoSize()/SetAutoSize(value) {boolean}, resizes the element to fit its content (exontrol.surface)
*Added: Element.Resizable/GetResizable()/SetResizable(value) {boolean}, specifies whether the user can resize the element by drag and drop (exontrol.surface)
*Added: Ability to specify the size to show the link's arrow using the arrowSize option (exontrol.surface, exontrol.gantt, exontrol.orgchart)
*Added: Ability to define a custom-shape to draw the link's arrow using the arrowShape option, as an object of exontrol.Def.Shape type (exontrol.surface, exontrol.gantt, exontrol.orgchart)
*Added: The ExRadialMenu/JS component supports/inherits all objects, properties, members, methods and events of the ExGauge/JS component (exontrol.radialmenu)
*Added: The content, image and caption fields are available for displayParent options to specify where the image and the caption of the browsing item are displayed on the parent layer (exontrol.radialmenu)
*Added: The visible field of the displayParent option supports 16 (0x10) which indicates that the only the browsing item's image or caption is displayed (exontrol.radialmenu)
*Added: The disabled field of "parent", "items" and "subitems" shapes defines the shape to apply on disabled items. For instance, exontrol.Shapes.RadialMenu.items.disabled = {opacity: 0.5, fillColor: 'gray'} specifies that all disabled items should show in gray on a semi-transparent background (exontrol.radialmenu)
*Fixed: The color of the link's caption depends on arrow's color rather than link's color itself (exontrol.common)
*Fixed: The control is not refreshed once a property is changed at runtime (exontrol.gauge, exontrol.radialmenu)
*Fixed: The control is not updated if the Add or Remove method of the Item object is called (exontrol.radialmenu)
*Fixed: The Escape key advances to the parent item, even if the control's Locked property is True (exontrol.radialmenu)
*Fixed: Re-define the CV.Node to Node, CV.NodeOptions to NodeOptions, CV.NodeTypeEnum to NodeTypeEnum, CV.Layout to Layout (exontrol.orgchart)

2.1 Jun 07, 2023
*NEW:   Cut, copy, and paste support (exontrol.surface, exontrol.swimlane, exontrol.schedule)
*Added: Cut(), moves the selection to the Clipboard (exontrol.surface, exontrol.swimlane, exontrol.schedule)
*Added: Copy(), copies the selection to the Clipboard (exontrol.surface, exontrol.swimlane, exontrol.schedule)
*Added: Paste(), pastes the contents of the Clipboard onto the view (exontrol.surface, exontrol.swimlane, exontrol.schedule)
*NEW:   Undo/Redo support (exontrol.schedule)
*Added: AllowUndoRedo/GetAllowUndoRedo()/SetAllowUndoRedo(value) {boolean}, enables or disables the Undo/Redo feature. By default the Undo/Redo feature is disabled (exontrol.schedule)
*Added: UndoRedoQueueLength/GetUndoRedoQueueLength()/SetUndoRedoQueueLength(value) {number}, gets or sets the maximum number of Undo/Redo actions that may be stored to the control's queue. By default the UndoRedoQueueLength property is -1 (exontrol.schedule)
*Added: CanUndo() {boolean}, indicates whether the control can perform an Undo operation (exontrol.schedule)
*Added: CanRedo() {boolean}, indicates whether the control can perform a Redo operation (exontrol.schedule)
*Added: The control fires the onchange("undo-redo") event once the control's Undo/Redo queue is updated, Undo or Redo method is invoked (exontrol.schedule)
*Added: StartBlockUndoRedo(), records all next Undo/Redo operations into a block until the EndBlockUndoRedo method is called. You can use the StartBlockUndoRedo / EndBlockUndoRedo methods to group multiple Undo/Redo operations into a single-block. (exontrol.schedule)
*Added: EndBlockUndoRedo(), ends recording the Undo/Redo operations as a block (exontrol.schedule)
*Added: BlockUndoRedo(callback, thisArg), records the Undo/Redo operations as a block. The BlockUndoRedo() method calls StartBlockUndoRedo / EndBlockUndoRedo methods (exontrol.schedule)
*Added: Undo(), restores the last UI operation that has taken place. For instance, if an event (calendar appointment) has been moved, Undo means moves back the event (calendar appointment) to its position before move. The Undo and Redo features let you remove or repeat single or multiple UI actions, but all actions must be undone or redone in the order you did or undid them   you can't skip actions (exontrol.schedule)
*Added: Redo(), redoes the last action that was undone (reverses the Undo method) (exontrol.schedule)
*Added: UndoListAction([action], [count]) {string}, gets the Undo actions that can be performed (exontrol.schedule)
*Added: RedoListAction([action], [count]) {string}, gets the Redo actions that can be performed (exontrol.schedule)
*Added: UndoRemoveAction([action], [count]), removes the last actions from the Undo queue (exontrol.schedule)
*Added: RedoRemoveAction([action], [count]), removes the first actions from the Undo queue (exontrol.schedule)
*Added: GroupUndoRedoActions([count]), groups the next to current Undo/Redo actions into a single block (exontrol.schedule)
*Added: Event.StartUpdateEvent(), starts changing properties of the event (calendar appointment), so Event.EndUpdateEvent method adds programmatically updated properties to undo/redo queue. You can use the StartBlockUndoRedo / EndBlockUndoRedo methods to group multiple Undo/Redo operations into a single-block. The AllowUndoRedo property specifies whether the control supports undo/redo operations for objects (event (calendar appointment)s, links, ...). No entry is added to the Undo/Redo queue if no property is changed for the current event (calendar appointment) (exontrol.schedule)
*Added: Event.EndUpdateEvent(startUpdateEvent), adds programmatically updated properties of the event (calendar appointment) to undo/redo queue (exontrol.schedule)
*Added: Event.UpdateEvent(callback, thisArg), records the changes of event (calendar appointment)'s properties into control's Undo/Redo queue. The UpdateEvent() method calls StartBlockUndoRedo / EndBlockUndoRedo methods (exontrol.schedule)
*Added: Event.EnsureVisible(), expands the parent-event (calendar appointment)s and scrolls the control's content so the event (calendar appointment) fits the control's client area (exontrol.schedule)
*Added: Clear(), clears the events, groups and mark-zones (exontrol.schedule)
*Fixed: Prevent showing the grouping events when the control has no group of events (Groups collection is empty) (exontrol.schedule)
*Fixed: Rename the Schedule.prototype.SurfaceView to Schedule.prototype.ScheduleView (The ScheduleView() method gets the schedule-view by name which was previously created by the AddScheduleView() method) (exontrol.schedule)
*Fixed: The elements of the pools are not properly restored on "undo" operation if previously a header of the pool has been resized (exontrol.swimlane)

2.0 May 03, 2023
*NEW:   Undo/Redo support (exontrol.surface, exontrol.swimlane)
*Added: AllowUndoRedo/GetAllowUndoRedo()/SetAllowUndoRedo(value) {boolean}, enables or disables the Undo/Redo feature. By default the Undo/Redo feature is disabled (exontrol.surface, exontrol.swimlane)
*Added: UndoRedoQueueLength/GetUndoRedoQueueLength()/SetUndoRedoQueueLength(value) {number}, gets or sets the maximum number of Undo/Redo actions that may be stored to the control's queue. By default the UndoRedoQueueLength property is -1 (exontrol.surface, exontrol.swimlane)
*Added: CanUndo() {boolean}, indicates whether the control can perform an Undo operation (exontrol.surface, exontrol.swimlane)
*Added: CanRedo() {boolean}, indicates whether the control can perform a Redo operation (exontrol.surface, exontrol.swimlane)
*Added: The control fires the onchange("undo-redo") event once the control's Undo/Redo queue is updated, Undo or Redo method is invoked (exontrol.surface, exontrol.swimlane)
*Added: StartBlockUndoRedo(), records all next Undo/Redo operations into a block until the EndBlockUndoRedo method is called. You can use the StartBlockUndoRedo / EndBlockUndoRedo methods to group multiple Undo/Redo operations into a single-block. (exontrol.surface, exontrol.swimlane)
*Added: EndBlockUndoRedo(), ends recording the Undo/Redo operations as a block (exontrol.surface, exontrol.swimlane)
*Added: BlockUndoRedo(callback, thisArg), records the Undo/Redo operations as a block. The BlockUndoRedo() method calls StartBlockUndoRedo / EndBlockUndoRedo methods (exontrol.surface, exontrol.swimlane)
*Added: Undo(), restores the last UI operation that has taken place. For instance, if an element has been moved, Undo means moves back the element to its position before move. The Undo and Redo features let you remove or repeat single or multiple UI actions, but all actions must be undone or redone in the order you did or undid them   you can't skip actions (exontrol.surface, exontrol.swimlane)
*Added: Redo(), redoes the last action that was undone (reverses the Undo method) (exontrol.surface, exontrol.swimlane)
*Added: UndoListAction([action], [count]) {string}, gets the Undo actions that can be performed (exontrol.surface, exontrol.swimlane)
*Added: RedoListAction([action], [count]) {string}, gets the Redo actions that can be performed (exontrol.surface, exontrol.swimlane)
*Added: UndoRemoveAction([action], [count]), removes the last actions from the Undo queue (exontrol.surface, exontrol.swimlane)
*Added: RedoRemoveAction([action], [count]), removes the first actions from the Undo queue (exontrol.surface, exontrol.swimlane)
*Added: GroupUndoRedoActions([count]), groups the next to current Undo/Redo actions into a single block (exontrol.surface, exontrol.swimlane)
*Added: Element.StartUpdateElement(), starts changing properties of the element, so Element.EndUpdateElement method adds programmatically updated properties to undo/redo queue. You can use the StartBlockUndoRedo / EndBlockUndoRedo methods to group multiple Undo/Redo operations into a single-block. The AllowUndoRedo property specifies whether the control supports undo/redo operations for objects (elements, links, ...). No entry is added to the Undo/Redo queue if no property is changed for the current element (exontrol.surface, exontrol.swimlane)
*Added: Element.EndUpdateElement(startUpdateElement), adds programmatically updated properties of the element to undo/redo queue (exontrol.surface, exontrol.swimlane)
*Added: Element.UpdateElement(callback, thisArg), records the changes of element's properties into control's Undo/Redo queue. The UpdateElement() method calls StartBlockUndoRedo / EndBlockUndoRedo methods (exontrol.surface, exontrol.swimlane)
*Added: Link.StartUpdateLink(), starts changing properties of the link, so Link.EndUpdateLink method adds programmatically updated properties to undo/redo queue. You can use the StartBlockUndoRedo / EndBlockUndoRedo methods to group multiple Undo/Redo operations into a single-block. The AllowUndoRedo property specifies whether the control supports undo/redo operations for objects (links, links, ...). No entry is added to the Undo/Redo queue if no property is changed for the current link (exontrol.surface, exontrol.swimlane)
*Added: Link.EndUpdateLink(startUpdateLink), adds programmatically updated properties of the link to undo/redo queue (exontrol.surface, exontrol.swimlane)
*Added: Link.UpdateLink(callback, thisArg), records the changes of link's properties into control's Undo/Redo queue. The UpdateLink() method calls StartBlockUndoRedo / EndBlockUndoRedo methods (exontrol.surface, exontrol.swimlane)
*Added: Smoothless(callback, thisArg), performs the callback with no smooth-transition (exontrol.surface, exontrol.swimlane)
*Added: position {number} option for Surface.ElementOptions, specifies the element's position. An element with a 0-position is displayed on the background, while an element with a greater position is displayed on top (exontrol.surface, exontrol.swimlane)
*Added: Element.EnsureVisible(), expands the parent-elements and scrolls the control's content so the element fits the control's client area (exontrol.surface, exontrol.swimlane)
*Added: Link.EnsureVisible(), scrolls the control's content to ensure that the link fits the control's visible area (expands its from/to elements if case) (exontrol.surface, exontrol.swimlane)
*Added: Clear(), clears the elements and links of the surface (exontrol.surface)
*Added: Clear(), clears the pools, elements and links of the surface (exontrol.swimlane)
*Added: Pool.StartUpdatePool(), starts changing properties of the pool, so Pool.EndUpdatePool method adds programmatically updated properties to undo/redo queue. You can use the StartBlockUndoRedo / EndBlockUndoRedo methods to group multiple Undo/Redo operations into a single-block. The AllowUndoRedo property specifies whether the control supports undo/redo operations for objects (pools, links, ...). No entry is added to the Undo/Redo queue if no property is changed for the current pool (exontrol.swimlane)
*Added: Pool.EndUpdatePool(startUpdatePool), adds programmatically updated properties of the pool to undo/redo queue (exontrol.swimlane)
*Added: Pool.UpdatePool(callback, thisArg), records the changes of pool's properties into control's Undo/Redo queue. The UpdatePool() method calls StartBlockUndoRedo / EndBlockUndoRedo methods (exontrol.swimlane)
*Added: Pool.EnsureVisible(), scrolls the control's content so the pool fits the control's client area (exontrol.swimlane)
*Added: The Pools.Add([oPoolOpts]) {exontrol.Swimlane.Pool} method adds a pool that covers all visible-elements (collapsed child-elements or hidden-elements are excluded) if the oPoolOpts parameter is missing or oPoolOpts.client field is not provided (exontrol.swimlane)
*Fixed: Prevents child-elements to change its parents by drag and drop if there is a parent-element selected. For instance, moving all elements by drag and drop removes the hierarchies (exontrol.surface, exontrol.swimlane)
*Fixed: The pool being created by drag and drop is not removed if user presses ESC key (exontrol.swimlane)
*Fixed: The link's caption is not properly positioned when link displays custom path (exontrol.surface)
*Fixed: Non-selected child elements gets resized if a selected-element gets resized by drag and drop (exontrol.surface)

1.9 Apr 03, 2023
*NEW:   Clear-button support (exontrol.combobox)
*Added: The ShowClearButton/GetShowClearButton()/SetShowClearButton(value) {number} shows or hides the control's clear-button. The clear button clears the control's label and selection. The clear-button is displayed next to drop down button, and can be hidden, always visible or visible only if there is a selection or get hovered. The ShowClearButton property supports the following values: -1 (the clear-button is always shown), 0 (the clear-button is not visible). The ShowClearButton property supports the following flags: 1 (the clear-button is visible only if the control's label is not empty or there are selected-items), 2(the clear-button is visible only if the pointer hovers the combobox). For instance, the ShowClearButton property on 3 (1 OR 2) specifies that the clear-button is shown only if required (the control's label is not empty) and the pointer hovers the control's label (exontrol.combobox)
*Added: The "clear" part of shapes/Shapes/GetShapes/SetShapes {string} option, defines the visual-appearance to show the clear button (exontrol.combobox)
*Added: The "clear" part of cursors/Cursors/GetCursors/SetCursors(value) {string} option defines the mouse-cursor when the mouse pointer hovers the clear button (exontrol.combobox)
*Added: onclear() event occurs once the user clicks the clear button (showClearButton option). The onclear event has no parameters (exontrol.combobox)
*Added: The exontrol.Gantt.DefCBCap {string} field shows or hides the bar's margins (start/end) on combobox's label (exontrol.gantt, exontrol.combobox)
*Added: The label of the date's header (HeaderDayLongLabel,  HeaderDayShortLabel property) is centered relative to the view, instead of the full date (exontrol.schedule)
*Added: selection/Selection {any}, defines the control's selection (exontrol.schedule)
*Fixed: The drop down portion is not aligned to the drop-down button if exontrol.combobox.def.js file is not included (exontrol.combobox)
*Fixed: The control's drop-down looks disabled and can't be clicked if exontrol.combobox.def.js is not included (exontrol.combobox)
*Fixed: Resets the control's label if the host/Host/SetHost(value) method is called again (for instance, changes the control's drop-down host resets the previously label) (exontrol.combobox)
*Fixed: Prevent showing the hierarchy lines within the combobox's label (exontrol.tree, exontrol.combobox)
*Fixed: Can't scroll to date if user clicks the overview map while control's scale is set on minutes or seconds (exontrol.gantt)
*Fixed: TypeError: Cannot read properties of null (reading 'copy') during drawSC prototype of OV (exontrol.gantt)
*Fixed: TypeError: Cannot read properties of null (reading 'getTime') during rurScrollS method of OV object (the exception occurs if the user is trying to scroll the overview section of the control while the chart-panel is not visible) (exontrol.gantt)
*Fixed: Resets the active-objects of the control once the ex-control is removed from the HTML canvas element, using the SetCanvas(null) method (for instance, the HTML canvas element may flicker if hosting different ex-control(s)) (exontrol.common)
*Fixed: TypeError: Cannot read properties of null (reading 'drawHTMLText') from ctxTfi prototype (exontrol.tree, exontrol.calendar, exontrol.schedule)
*Fixed: The HTML canvas element still displays parts of the pivot control when Pivot.oCW.SetCanvas(null) method is called to remove the control from the HTML canvas element (exontrol.pivot)

1.8 Nov 14, 2022
*NEW:   The ExComboBox/JS tool allows you to display a drop-down panel (Bezier, Calendar, Gantt, Gauge, Menu, OrgChart, Pivot, RadialMenu, Schedule, ScrollBar, Surface, SwimLane Tree or any other HTML element) once the user clicks a button. For instance, you can select a different item from a drop-down tree or list control, or you can select a different date from a drop-down calendar control. The ExComboBox/JS is a HTML standalone-component, written in JavaScript, that uses no third-party libraries.
*Added: The control fires the onchange("resize-chart") event once the user resizes the chart by resizing the spliter (exontrol.gantt)
*Added: Serializes the chart's selected bars and dates using Layout/GetLayout()/SetLayout(value) methods (exontrol.gantt)
*Added: PoolSplitter.prototype.GetIndex(), Index {number} gets the index of the splitter (lane or phase, read-only property) (exontrol.swimlane)
*Added: PoolSplitter.prototype.GetCaption(), SetIndex(value), Caption {string} defines the caption of the splitter (lane or phase) (exontrol.swimlane)
*Added: PoolSplitter.prototype.GetSize(), SetSize(value), Size {number} defines the size of the splitter (lane or phase) (exontrol.swimlane)
*Added: PoolSplitter.prototype.GetShape(), SetShape(value), Shape {string} defines the shape of the splitter (lane or phase) (exontrol.swimlane)
*Added: Lane(id, lane) {PoolSplitter}, gets the lane of the pool giving its identifier (exontrol.swimlane)
*Added: Phase(id, phase) {PoolSplitter}, gets the phase of the pool giving its identifier (exontrol.swimlane)
*Added: selection/Selection {any}, defines the control's selection (exontrol.orgchart, exontrol.surface)
*Added: readOnly/ReadOnly {boolean}, indicates whether the control is read-only (exontrol.bezier, exontrol.calendar, exontrol.gauge, exontrol.menu, exontrol.radialmenu, exontrol.scrollbar)
*Added: Prevents changing the cell's state (check-box or radio) once the user clicks a read-only control (control's readOnly property is true)  (exontrol.tree)
*Added: Serializes the control's pivotRows, pivotColumns and pivotTotals options using Layout/GetLayout()/SetLayout(value) methods (exontrol.pivot)
*Added: Layout/GetLayout()/SetLayout(value) {string}, saves or loads the control's layout, such as selected or collapsed nodes, scroll-position, ... (exontrol.orgchart, exontrol.surface, exontrol.swimlane)
*Added: onchange("expand-node") event occurs once the user expands or collapses a node (exontrol.orgchart)
*Added: onscroll(oEvent) event occurs once the view gets scrolled (exontrol.orgchart, exontrol.surface, exontrol.swimlane)
*Fixed: The pool's header displays no lanes or phases if the control's allowActions property includes no "resize-phase" or "resize-lane" flags (exontrol.swimlane)
*Fixed: The user can select new items by clicking the chart-section area, while the control's singleSel property is exontrol.Tree.SingleSelEnum.exDisableSel (exontrol.gantt)
*Fixed: A new defined primitive is not shown until the object is rendered for the second time (exontrol.common)
*Fixed: No thumb or buttons are shown for the control's scroll-bars if shown during drag and drop operations (exontrol.common)
*Fixed: The control's scroll-bars may be initially visible even they are not required (exontrol.common)

1.7 Oct 19, 2022
*NEW:   Drag and drop support (inside or/and outside the controls)
*Added: @media only screen and (max-width: 580px) support for exhelper/js (reorganizes the exhelper/js panels for mobile devices)
*Added: The AllowActions property supports "drag-drop" operation that allows any element to drag and drop inside or outside the control. The ExDrop(event, data) method of the target HTML element is invoked once the user drops the element. The event parameter holds information about the mouse/touch event once the element has been dropped. The data parameter holds information about the source-object that initiated the drag and drop operation, as an object of {object,source,client,shape} type. For instance, "zoom(MButton),drag-drop,scroll" specifies that zoom is possible if user clicks the middle-button, the drag and drop occurs on any key over an element, else the user scrolls the surface (exontrol.surface)
*Added: Element.Selectable/GetSelectable()/SetSelectable(value) {boolean}, indicates whether the user can select, resize or move the element (exontrol.surface)
*Added: ShowOrigin/GetShowOrigin()/SetShowOrigin(value) {boolean}, specifies whether the control shows or hides the origin (exontrol.surface)
*Added: Origin/GetOrigin()/SetOrigin(value) {object}, defines the appearance to draw the origin of the surface, as an object of {size, width, color, style} type (exontrol.surface)
*Added: ShowGridLines/GetShowGridLines()/SetShowGridLines(value) {boolean},  specifies whether the control shows or hides the grid-lines (minor and major grid-lines) (exontrol.surface)
*Added: MinorGridLines/GetMinorGridLines()/SetMinorGridLines(value) {object}, defines the appearance of the surface's minor grid-lines, as an object of {step, width, color, style, cap} type (exontrol.surface)
*Added: MajorGridLines/GetMajorGridLines()/SetMajorGridLines(value) {object}, defines the appearance of the surface's major grid-lines, as an object of {step, width, color, style, cap} type (exontrol.surface)
*Added: ShowAxes/GetShowAxes()/SetShowAxes(value) {boolean}, specifies whether the control shows or hides the axes (horizonal and vertical axes) (exontrol.surface)
*Added: Axes/GetAxes()/SetAxes(value) {object}, defines the appearance to draw the axes of the surface, as an object of {width, color, style, cap} type (exontrol.surface)
*Added: AlignObjectsToGridLines/GetAlignObjectsToGridLines()/SetAlignObjectsToGridLines(value) {number}, specifies whether the objects are aligned to minor or major grid lines (exontrol.surface)
*Added: The oEvent parameter of the "onclick" event include definitions for lane and phase being clicked, as an object of {i(ndex),c(aption),s(ize)} type (exontrol.swimlane)
*Added: Element.Pool/GetPool()/SetPool(id) {Pool}, indicates the element's pool (exontrol.swimlane)
*Added: Element.Lane/GetLane()/SetLane(id) {object}, indicates the element's lane (exontrol.swimlane)
*Added: Element.Phase/GetPhase()/SetPhase(id) {object}, indicates the element's phase (exontrol.swimlane)
*Added: Element.Center(pool, lane, phase), centers the element within specified pool, lane and/or phase (exontrol.swimlane)
*Added: The SelectEventStyle property on 2 indicates that the "select" shape is displayed on the selected-event's background, but it is shown using the event's primitive (rectangle, round, oval...). The misc.padSelectEvent field specifies the space between the event's content and its selection border (exontrol.schedule)
*Added: A not-selectable event is fixed (not movable and not resizable) (exontrol.schedule)
*Added: The AllowActions property supports "drag-drop" operation that allows any node to drag and drop inside or outside the control. The ExDrop(event, data) method of the target HTML element is invoked once the user drops the node. The event parameter holds information about the mouse/touch event once the element has been dropped. The data parameter holds information about the source-object that initiated the drag and drop operation, as an object of {object,source,client,shape} type. For instance, "zoom(MButton),drag-drop,scroll" specifies that zoom is possible if user clicks the middle-button, the drag and drop occurs on any key over an node, else the user scrolls the chart (exontrol.orgchart)
*Added: By default, the ZoomLevels property is set to ""25,35,50,65,75,80,90,100,110,125,150,175,200,250,300,400,500", and so the user can automatically zoom the control usingthe middle-button (exontrol.orgchart)
*Added: Node.Selectable/GetSelectable()/SetSelectable(value) {boolean}, indicates whether the user can select the node (exontrol.orgchart)
*Added: The AllowActions property supports "drag-drop" operation that allows any item to drag and drop inside or outside the control. The ExDrop(event, data) method of the target HTML element is invoked once the user drops the item. The event parameter holds information about the mouse/touch event once the item has been dropped. The data parameter holds information about the source-object that initiated the drag and drop operation, as an object of {object,source,client,shape} type. For instance, "zoom(MButton),drag-drop,scroll" specifies that zoom is possible if user clicks the middle-button, the drag and drop occurs on any key over an item, else the user scrolls the surface (exontrol.tree)
*Added: Prevents showing the control's grid-lines if the control's zoom is less than 50% (increase the speed to display the control) (exontrol.tree)
*Added: The AllowActions property supports "drag-drop" operation that allows any item or item-bar to drag and drop inside or outside the control. The ExDrop(event, data) method of the target HTML element is invoked once the user drops the item. The event parameter holds information about the mouse/touch event once the item has been dropped. The data parameter holds information about the source-object that initiated the drag and drop operation, as an object of {object,source,client,shape} type. The "drag-drop" operation supports flags such as [bar], [item] that specifies whether the "drag-drop" operation is allowed for any item or/and item-bar. For instance, "zoom(MButton),drag-drop[bar](Long),scroll" specifies that the user can zoom in-out the control using the middle-mouse button, can drag and drop bars only after a long-click, else it scrolls the view's content (exontrol.gantt)
*Added: Bars/GetBars()/SetBars(value) {ItemBars}, defines the bars of the current item, as an object of exontrol.Gantt.ItemBars type (allow you to copy bars from one item to another) (exontrol.gantt)
*Added: exontrol.RUR.D3(event, data) method carries out a drag and drop operation. The data parameter specifies the data to drag as an object of {object,source,client,shape,ondrop,onclick,onmove} type (also the data field supports any field of EF.Options type) (exontrol.common)
*Fixed: Exception has occurred: TypeError: Cannot read properties of undefined (reading 'indexOf', exontrol.Mrg.Layout.getObject, exontrol.calendar)
*Fixed: The Zoom method has no effect (exontrol.orgchart)
*Fixed: The node is not erased once the Node.Remove() method is called (exontrol.orgchart)
*Fixed: The cursor is not restored once it hovers the node's expand/collapse glyphs (exontrol.orgchart)
*Fixed: The Node.Nodes property removes the node and its descendents without inserting new nodes based on the string-representation (exontrol.orgchart)
*Fixed: The exception "TypeError: Cannot read properties of null (reading 'getTime')" may occur if calling the Chart.Zoom method for a control with the chart's width on 0 (no right-panel) (exontrol.gantt)
*Fixed: The hover item is shown in columns and chart panels of the control. Also the hover item is shown for all split-views. (exontrol.gantt)
*Fixed: The user can't create an element using ALT + Drag while cursor is over a pool (exontrol.swimlane)
*Fixed: *Fixed: Initially, the control's calendar may not be vertically centered if the selection option of the calendar set on control's options (outside of the window.onload event, exontrol.schedule) 
*Fixed: An event added using "duration" and "start" or "end" options shows to a different position (exontrol.schedule)
*Fixed: The chart is slightly horizontal scroll if adding or removing new events during the HTML element's onclick event (exontrol.schedule)
*Fixed: Prevents showing the selected(hot) items after the last visible-column (exontrol.tree)
*Fixed: Clips the header and the chart of the control according to the "scrollRange" option (exontrol.gantt)

1.6 Sep 16, 2022
*NEW:   Column-Images support or ability to display images within the Pivot control (available for exontrol.tree, exontrol.gantt and exontrol.pivot components)
*Added: Column.FormatImage {string }, defines the expression to determine the images the column display. The exontrol.HTMLPicture.Add method adds new images to the control. For instance, "'logo'" specifies the the image with the identifier 'logo' is being shown for all cells within the column, "value case (default: 'unknown'; 'Austria': 'Austria')" shows 'Austria' image for cells with the value 'Austria', else displays 'unknown' picture (exontrol.tree)
*Added: ItemBar.HistLegend/GetHistLegend()/SetHistLegend(value) {string}, specifies the description to show within the histogram's legend for the bar in the control's histogram. The histLegend option has effect only if the Bar.HistogramCumulativeOriginalColorBars is exKeepOriginalColor. The histLegend option supports built-in HTML format including the <%=formula%> tag, where formula is an expression that supports predefined operators, functions and % operators such as %0, %1, %2, ... specifies the value/option of the item-bar as name, start, end and so on (ItemBarPropertyEnum type); %C0, %C1, %C2, ... specifies the caption of the cell, or the string the cell displays in the column with the index 0, 1 2, ...; %CD0, %CD1, %CD2, ... specifies the item-bar's user-date in the column with the index 0, 1 2, ...; %CS0, %CS1, %CS2, ... specifies the item-bar's state in the column with the index 0, 1 2, ...For instance, "<fgcolor gray><%=lower(%3)%>" {string}, the histogram-legend displays the bar's caption in gray and lowercase (exontrol.gantt)
*Added: Bar(name) {Bar}, gets the bar giving its index, name or reference. The Bar(name) method is equivalent with Chart.Bars.Item(name) method (exontrol.gantt)
*Added: exontrol.Gantt.GV.Zoom(start, end, changeUnitWidth) method zooms the view so the start-end interval fits the client's area (exontrol.gantt)
*Added: The chart gets resized relative to the closest selected-date that fits that view's client area, rather than the first selected date (Chart.SelectDates, AllowActions include "chart-zoom" or "chart-resize"). Shortly you can zoom the chart two ways. One is if no visible-selected dates which makes the chart to zoom at the cursor position, while if a selected-date fits the chart, it stays fixed (same position) while the rest of the chart gets magnified. (exontrol.gantt)
*Added: The width of the left-panel is changed according with the control's zoom-factor (zoom, chart.paneWidthLeft options) (exontrol.gantt)
*Added: The Select(key) method selects the item using shortcut keys, such as "Home", "PageUp", "ArrowUp", "ArrowDown", "PageDown" or "End" (exontrol.tree)
*Fixed: Sometimes, the chart shows empty portion if clicking the unit-scales of overview-zoom section (overviewVisible, allowOverviewZoom options), while scrollRange option is used (exontrol.gantt)
*Fixed: The browser may freeze if resizing the chart using the middle-mouse while there is one selected date (the resizing is relative to the selected date) (exontrol.gantt)
*Fixed: The control's filter-bar is not showing over the chart portion of the control (exontrol.gantt)
*Fixed: Sounds like the Chart.Zoom() method is not working during the "onload" event (exontrol.gantt)
*Fixed: Prevents showing the filter-bar over the control's vertical scroll-bar (exontrol.tree)
*Fixed: The control's Scroll("Up") or Scroll("Down") method scrolls up or down by defaultItemHeight pixels, rather than wheelCount option (exontrol.tree)
*Fixed: The picture holder is still shown (for missing or unloaded images) even if the exontrol.HTMLPicture.DrawPH method is overridden (exontrol.common)

1.5 Sep 01, 2022
*NEW:   Events-support, ability to programmatically highlight dates within the calendar control (exontrol.calendar)
*Added: "onclick" event occurs once the user clicks or double-clicks a date (exontrol.calendar)
*Added: Events/GetEvents()/SetEvents(oEventsDef) {Events}, defines the control's events (exontrol.calendar)
*Added: Event(id) {Event}, returns the event based on its index or identifier/key (exontrol.calendar)
*Added: Events.Add(oEventOpts) {Event}, creates and adds a new event into the control (exontrol.calendar)
*Added: Events.Count/GetCount() {number}, returns the number of events within the collection (exontrol.calendar)
*Added: Events.Event(id) {Event}, gets the event giving its index, identifier/key or reference (exontrol.calendar)
*Added: Events.Remove(id), removes the event giving its index, identifier/key or reference (exontrol.calendar)
*Added: Events.Clear(), removes all events of the control (exontrol.calendar)
*Added: Event.Options/GetOptions()/SetOptions(value) {exontrol.Calendar.EventOptions}, indicates the event's options (at once) such as visibility, position and so on (exontrol.calendar)
*Added: Event.Index/GetIndex() {number}, returns the index of the event (0-based) (exontrol.calendar)
*Added: Event.Date/GetDate()/SetDate(value) {any}, indicates the date of the event (exontrol.calendar)
*Added: Event.Key/GetKey()/SetKey(value) {any}, specifies the event's key (the Events.Event(key) requests an event by its index, identifier/key or reference) (exontrol.calendar)
*Added: Event.Selectable/GetSelectable()/SetSelectable(value) {boolean}, specifies whether the user can select the date (exontrol.calendar)
*Added: Event.Shape/GetShape()/SetShape(value) {any}, the shape for the event (exontrol.calendar)
*Added: Event.Cursor/GetCursor()/SetCursor(value) {string}, the mouse cursor for the event (exontrol.calendar)
*Added: Event.Repetitive/GetRepetitive()/SetRepetitive(value) {string}, returns or sets the expression to define the repetitive-event (exontrol.calendar)
*Added: Event.ToolTip/GetToolTip()/SetToolTip(value) {string}, defines the event's predefined tooltip (exontrol.calendar)
*Added: Event.UserData/GetUserData()/SetUserData(value) {any}, associates any extra-data with the event (exontrol.calendar)
*Added: Event.Remove(), removes the event from events collection ( equivalent of Events.Remove(id) method ) (exontrol.calendar)
*Added: The Event.Repetitive property supports RRULE expressions (requires exontrol.icalendar.js), according with Internet Calendaring and Scheduling Core Object Specification, RFC 5545, if contains the FREQ keyword. The FREQ property determines whether the Repetitive property uses the Value or ICalendar format. In other words, if the Repetitive property contains the FREQ keyword, the ICalendar format is using, else the Value format. For instance, "FREQ=WEEKLY;BYDAY=MO", the event occurs every Monday, and uses ICalendar format to determine the recurrences, while "weekday(value) = 1", the event occurs every Monday uses the Value format. (exontrol.schedule)
*Fixed: The "Hover:" message occurs during drag and drop (exontrol.calendar)
*Fixed: The "key" option of the individual event is ignored if events are loaded using the "events" option. For instance, the key is ignored in the following sequence new exontrol.Schedule('cvsSchedule', {events: {"Event <b>A": { key: "A", start: "#1/1/2022 10:00#", end: "#1/1/2022 11:00#"}}}); (exontrol.schedule)

1.4 Jun 13, 2022
*NEW:   The eXICalendar/JS library implements the ICalendar data format, according with Internet Calendaring and Scheduling Core Object Specification, RFC 5545, especially the RRULE property, which defines a rule or repeating pattern for recurring events, to-dos, journal entries, or time zone definitions. The recurrence rule, is used in computing the recurrence set. The recurrence set is the complete set of recurrence instances for a calendar component. The recurrence set is generated by considering the initial "DTSTART" property. The eXICalendar/JS is a HTML standalone-component, written in JavaScript, that uses no third-party libraries.
*NEW:   Support for hierarchy-lines (the links between children and their parents) (exontrol.tree)
*Added: exontrol.Calendar.decode(htObject) {object}, decodes decodes the hit-test codes into an object of {type,date} type. The type field determines the type of the part, where date is the date associated with the part of the control.
*Added: exontrol.Calendar.getDay(htObject) {object}, decodes the hit-test code for days only, into an object of {type, date} type. The result is defined if htObject points to a day-part of the calendar (day within the day-view), else undefined.
*Added: HasLines/GetHasLines()/SetHasLines(value) {object} propery (hasLines option) defines the color, width and style of the control's hierarchy-lines, as an object of {width, color, style} type (exontrol.tree)
*Added: HasButtons/GetHasButtons()/SetHasButtons(value) {boolean} propery (hasButtons option) indicates whether the control shows or hides the expand/collapse glyphs (+/- buttons to expand-collapse the item) (exontrol.tree)
*Added: LinesAtRoot/GetLinesAtRoot()/SetLinesAtRoot(value) {exontrol.Tree.LinesAtRootEnum} propery (linesAtRoot option) indicates whether the control links the root items (exontrol.tree)
*Fixed: Cannot create property 'fgColor' on string '<fg white>' (exontrol.common)
*Fixed: Date.prototype.GetWeekNumber method renamed to Date.prototype.GetWeekNo
*Fixed: No indentation is applied if expandGlyphSize property is 0 (exontrol.tree)
*Fixed: Prevents expand/collapse indentation (left blank area) for the column with index 0 (treeColumnIndex property) (exontrol.tree)
*Fixed: Exception has occurred: TypeError: Cannot set properties of null (setting 'ao') (exontrol.tree)
*Fixed: When the linesAtRoot option is not set to zero, the item(s) being dragged appear at the incorrect level position (exontrol.tree)

1.3 Feb 14, 2022
*NEW:   The ExSchedule/JS library is our approach to provide scheduling of appointments into your web application. The ExSchedule/JS is a HTML standalone-component, written in JavaScript, that uses no third-party libraries (exontrol.schedule)
*NEW:   Ability to arrange orthogonally the link's path by drag and drop the control-points (exontrol.surface)
*NEW:   Cartesian coordinates (exontrol.surface)
*Added: The first parameter of Date.Create supports ISO 8601 string representation of dates, such as "2011-10-10" (date-only form), "2011-10-10T14:48:00" (date-time form), or "2011-10-10T14:48:00.000+09:00" (date-time form with milliseconds and time zone) (exontrol.common)
*Added: The exontrol.HTMLPicture.Proto object exports the prototype of inside HPic class which holds an image being displayed by <img>image[:width][:height]</img> tag. This way you can provide your custom-drawing over any HTML picture, by overriding the Draw(ctx, client) method of exontrol.HTMLPicture.Proto object (exontrol.common)
*Added: LinkControlPointEnum.exOrthoArrange flag specifies that the user can arrange orthogonally the link's path by drag and drop the link's control- points. For instance, AllowLinkControlPoint on LinkControlPointEnum.exOrthoArrange Or LinkControlPointEnum.exMiddleControlPoint Or LinkControlPointEnum.exControlPoint Or LinkControlPointEnum.exEndControlPoint Or LinkControlPointEnum.exStartControlPoint indicates that the focused link displays all control-points (including the start/end control-points) and it can be orthogonally arranged once the user drag and drop a control-point. The link can be orthogonally arranged only if its path includes orthogonally lines (vertical or horizontal lines). If the LinkControlPointEnum.exOrthoArrange flag is missing the user can freely arrange the link by drag and drop any of its control-points. (exontrol.surface)
*Added: Coord property specifies the type of coordinates the elements display within the surface. For instance, Coord property on exCartesian | exAllowPositiveOnly shows only positive Cartesian coordinates (only the right-up panel relative to origin is displayed). The exAllowPositiveOnly flag prevents element with negative values when the user moves the elements/pools by drag and drop. (exontrol.surface)
*Added: Calendar.prototype.getSel method returns the control's selection as an exontrol.Arr([Date]) type (unique array of dates)
*Added: Layout/GetLayout()/SetLayout(value), saves or loads the control's layout (exontrol.calendar)
*Added: Selection/SetSelection(value), selects nothing(null), one(string, number or Date) or more(array) dates (exontrol.calendar)
*Added: Allow smooth scroll programmatically using the ScrollPos method. For instance, oTree.Smooth(function() {oTree.ScrollPos = {y: 1024}}) smooth vertically scrolls the control's content to 1024 position (exontrol.tree)
*Added: The value parameter of exontrol.ScrollBar.Scroll(action, value) method specifies the number of times the Scroll method is called by, while action is exLineUp, exLineLeft, exLineDown or exLineRight. For instance, Scroll(exLineDown, 2), scrolls down by two lines (exontrol.scrollbar)
*Added: Stops any interval, timeout or requestAnimationFrame that currently runs once the user presses the Escape key (exontrol.exhelper)
*Added: exontrol.exschedule to exhelper/js tool
*Fixed: The "expression in (c1,c2,c3,...cn)" or "expression switch (default,c1,c2,c3,...,cn)" does not work correctly if expression, c1, c2, c3, are dates. For instance, "value in (#2/1/2002#,#2/2/2002#,#2/3/2002#)" does not work correctly (exontrol.common)
*Fixed: The windows are not properly restored once the user presses ESC key while resizing the windows (exontrol.common)
*Fixed: The active-object (hover-state) is not updated once the Smooth method ends (exontrol.common)
*Fixed: The exhelper/js tool freezes if an exception error occurs during animation frames(requestAnimationFrame), timeouts(setTimeout) or intervals(setInterval) (exontrol.exhelper)
*Fixed: Simplifies (removing the duplicate neighbor control-points, reducing the contiguously orthogonal lines, removing the loop once a control-point coincide with another) the link's path while it is customized by drag and drop only (exontrol.surface)
*Fixed: exontrol.SV.prototype.drawObject renamed to exontrol.SV.prototype.drawE = function(ctx, rtObject, oObject, oAO). The drawE/drawEntity() method draws the entity (element, element's glyphs, pool) on the specified context (exontrol.surface)
*Fixed: Cant's select a date if it is includes time. For instance, Calendar.Selection = Date.Now() does not select today, as Calendar.Selection = Date.Today(). The Now() method returns the current date and time, while Today returns date only (no time included) (exontrol.calendar)
*Fixed: The control's layout is lost once the user presses left/right arrows and tfi option is set (exontrol.calendar)
*Fixed: The exontrol.SV namespace renamed to exontrol.Surface.CV  (exontrol.surface)
*Fixed: The exontrol.CV namespace renamed to exontrol.OrgChart.CV (exontrol.orgchart)
*Fixed: The exontrol.TV namespace renamed to exontrol.Tree.TV (exontrol.tree)
*Fixed: The Soom(zoomTo, oPointAbs) method does not scroll exactly to the right position when fit drag and drop operation is performed (Shift + MButton) (exontrol.tree)
*Fixed: The exontrol.GV namespace renamed to exontrol.Gantt.GV (exontrol.gantt)

1.2 Sep 02, 2021
*NEW: 	Zoom in/out support using two-fingers (available for exontrol.tree, exontrol.pivot, exontrol.gantt only if the control's allowActions option contains "zoom"-action)
*NEW: 	Zoom/resize in/out support using two-fingers (available for exontrol.gantt only if the control's allowActions option contains "chart-zoom" or "chart-resize" -action)
*NEW: 	Ability to zoom or resize a portion of the chart by fixing/selecting a date (Chart.SelectDates) and drag the chart (AllowActions include "chart-zoom" or "chart-resize") (exontrol.gantt)
*NEW:   Pen or contact point on a touch-enable surface support (ability to use any contact device such as pens) (exontrol.common)
*NEW:   Ability to apply colors to bars/tasks based on conditional expressions (exontrol.gantt)
*Added: ConditionalFormat.ApplyToBars property specifies the list of bars that the current format is applied to. The list includes the name of the bars separated by comma character. For instance, the ApplyToBars = "Task,Milestone" specifies that the current format is applied to Task and Milestone bars (exontrol.gantt)
*Added: ConditionalFormat.BarShape property specifies the shape to apply on bars if the conditional expression is verified. By default, no shape is applied to bars. The Items.ItemBar(exBarShape) property specifies a different color/skin for a particular bar (exontrol.gantt)
*Added: Ensures that all chart's levels are filled when user zoom the chart by drag and drop (no empty level(s) displayed) (exontrol.gantt)
*Added: Increases drastically the performance to scroll the chart when the control loads a large number of item-bars (exontrol.gantt)
*Fixed: Any drag and drop action stops while the cursor is outside of the iframe, page or document browser (exontrol.common)
*Fixed: Prevents awkward scrolling when it is performed by two or more fingers on a touch screen (exontrol.common)
*Fixed: SCRIPT1046: Multiple definitions of a property not allowed in strict mode (IE)

1.1 Jul 05, 2021
*Added: The expression properties supports `bias` constant that defines the difference, in minutes, between Coordinated Universal Time (UTC) and local time. For example, Middle European Time (MET, GMT+01:00) has a time zone bias of "-60" because it is one hour ahead of UTC. Pacific Standard Time (PST, GMT-08:00) has a time zone bias of "+480" because it is eight hours behind UTC. For instance, "date('now')-bias/24/60" returns the local time
*Added: tfi field of shape object or control's Options supports string representation. For instance, "bold monospace 16" {string} or {bold: true, fontName: "monospace", fontSize: 16} {object} defines Monospace font of 16px height, bold
*Added: formatText / GetFormatText() / SetFormatText(value) method specifies the format to display the layer's caption (Layer.Fore property) (exontrol.Gauge)
*Added: Layer.prototype.drawBack = function(ctx, client, back), draws the layer's background (only if it was specified) (exontrol.Gauge)
*Added: Layer.prototype.drawFore = function(ctx, client, fore), draws the layer's foreground (only if it was specified) (exontrol.Gauge)
*Added: Layer(key) method returns a Layer object giving its index or key (exontrol.Gauge)
*Added: Item.prototype.getParent, gets the item's parent (exontrol.Menu)
*Added: root, parent, path, state, image, visible and enabled properties for Item.prototype (exontrol.Menu)
*Added: Options, Focus, Selection properties for exontrol.OrgChart control
*Added: Layer(key) method returns a Layer object giving its index or key (exontrol.RadialMenu)
*Added: Item(key) method searches for an item giving its key or caption (exontrol.RadialMenu)
*Added: Layer.prototype.drawBack = function(ctx, client, back), draws the layer's background (only if it was specified) (exontrol.RadialMenu)
*Added: Layer.prototype.drawFore = function(ctx, client, fore), draws the layer's foreground (only if it was specified) (exontrol.RadialMenu)
*Added: Pos property (exontrol.ScrollBar)
*Added: Element(id) methd gets the element by its identifier, Link(id)  methd gets the link by its identifier (exontrol.Surface)
*Added: The cross links are shown only for links with no custom path (exontrol.Surface)
*Added: Element.prototype.Add method inserts a new child-element (exontrol.Surface)
*Added: The onchange({action: "resize-lane"}) or onchange({action: "resize-phase"}) is fired once the user creates, resizes or removes a lane or a phase of the pool (exontrol.Swimlane)
*Added: Removes empty [lanes=] and [phases=] from pool's string representation (Pools.Save method) (exontrol.Swimlane)
*Added: TreeView(name) {TV}, gets the tree-view by name (which was previously created by the AddTreeView() method) (exontrol.Tree)
*Added: The size of the filter bar's close (X) is based on the control's font (tfi option), rather than fixed (exontrol.Tree)
*Added: The Value/GetValue()/SetValue(value) {any[]} method of Item object defines the values for each cell within the item, as an array of [any] type (exontrol.Tree)
*Added: The Locked {number} property of Item object determines whether the item is locked, and returns 0 (unlocked), -1(top-locked) or +1(bottom-locked) (exontrol.Tree)
*Added: exontrol.Tree.EditOptions.selectAll {boolean}, selects all the text into the <input> element, as soon as the cell gets edited (exontrol.Tree)
*Added: The data/Data/SetData(value) method can load data from an XML string (must begins with '<content author="Exontrol"') (exontrol.Tree)
*Added: The "onadditem" event is fired once the entire item is loaded during the LoadXML method (so the values for each cell is known during the "onadditem" event) (exontrol.Tree)
*Added: The aggregates shortcut menu is aligned to the right of the cursor (exontrol.Pivot)
*Added: Inherits the source-column's formatText, shape and cellShape properties on aggregate-columns (for instance, if a column is aligned to the right (formatText & 2), any aggregate column based on this column will be displayed to the right)  (exontrol.Pivot)
*Added: Gantt.prototype.feL = function(callback, thisArg), invokes the callback for each link of the control (exontrol.Gantt)
*Added: Gantt.prototype.feLU = function(callback, thisArg), invokes the callback for each link of the control, until the callback returns a not-empty value (exontrol.Gantt)
*Added: Gantt.prototype.Link = function(id), gets the link giving its index, identifier/key or reference (exontrol.Gantt)
*Fixed: Rotates the "pointer" layer while user drags and rotates the radial-menu (exontrol.RadialMenu)
*Fixed: ReferenceError: thisz is not defined (occurs if "frameDrag" is set) (exontrol.Surface)
*Fixed: The cross links are not shown due allowLinkControlPoint support (exontrol.Surface)
*Fixed: No option is applied to element using the Options property of Element object (exontrol.Surface)
*Fixed: No option is applied to link using the Options property of Link object (exontrol.Surface)
*Fixed: The element field of the oEvent parameter of the onclick event gets null instead of undefined (exontrol.Surface)
*Fixed: The element and pool fields of the oEvent parameter of the onclick event gets null instead of undefined or false (exontrol.Swimlane)
*Fixed: The shape option (element, pool, phase or lane) is ignored if provided as a string (for instance, shape: 'red')  (exontrol.Swimlane, exontrol.Surface)
*Fixed: No option is applied to pool using the Options property (exontrol.Swimlane)
*Fixed: The client position of the filter-prompt is not updated properly once the filter is applied (exontrol.Tree)
*Fixed: ReferenceError: nItems is not defined in Tree.GetStatistics (exontrol.Tree)
*Fixed: The columns float bar can't show group-by columns (allowGroupBy) with a check-box, if columnsFloatBarVisible property is 1 | 2 (exColumnsFloatBarVisibleIncludeGroupByColumns | exColumnsFloatBarVisibleIncludeCheckColumns) (exontrol.Tree)
*Fixed: Can't click the filter-bar's close button while it is displayed on the right (exFilterBarShowCloseOnRight) and the view shows its vertical-scroll bar (exontrol.Tree)
*Fixed: Can't change the foreground filter bar's caption using filterBarCaption on "`<fgcolor red>` + current" (exontrol.Tree)
*Fixed: The cell's state can be changed while its check-box or radio-button is not visible (exontrol.Tree)
*Fixed: No "onchange" event occurs while user types into input field, if the exontrol.Tree.EditOptions.change property is true (exontrol.Tree)
*Fixed: The ondolayout() method is not called once the control's layout changes (exontrol.Pivot)
*Fixed: The control shows two pivot-bar panels when pivotBarVisible property includes exPivotBarFloat flag (floating pivot-bar) (exontrol.Pivot)
*Fixed: The shortcut menu of the pivot-bar is displayed on a wrong position, if the pivotBarVisible property includes exPivotBarFloat flag (exontrol.Pivot)
*Fixed: The control's pivot-bar is not read-only when pivotBarVisible property includes the exPivotBarReadOnly flag (exontrol.Pivot)
*Fixed: The exPivotBarContextSortAscending (shows the columns alphabetically in ascending order) and exPivotBarContextSortReverse (shows the columns in reverse order) flags are ignored (exontrol.Pivot)
*Fixed: The control shows two "Columns" panels when pivotColumnsFloatBarVisible property includes exColumnsFloatBarFloat flag (floating columns) (exontrol.Pivot)
*Fixed: Prevent selecting the item-bar when the user clicks it, when the Chart.SingleSel property is exontrol.Tree.SingleSelEnum.exDisableSel (exontrol.Gantt)

1.0 Jan 01, 2021
*Initial Release