exsuite/js - what's new
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}, specifies 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 9601 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: Uncaught 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: Uncaught 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