www-thermferm/jqwidgets/jqximport.js

changeset 709
5b6d7b640e52
parent 708
13555c27b592
child 710
abe60578d695
--- a/www-thermferm/jqwidgets/jqximport.js	Thu Apr 25 14:26:47 2024 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2946 +0,0 @@
-
-/* tslint:disable */
-/* eslint-disable */
-(function ($) {
-    class DataAdapter {
-    constructor ( config ) {
-        if ( !config ) {
-            config = {};
-        }
-
-        const that = Object.assign( this, config );
-
-        const generateKey = function () {
-            const S4 = function () {
-                return ( ( ( 1 + Math.random() ) * 0x10000 ) | 0 ).toString( 16 ).substring( 1 );
-            };
-            return S4();
-        };
-
-        that.key = generateKey();
-
-        that.boundSource = [];
-        that.dataItemById = [];
-
-        if ( that.allowAdd === undefined ) {
-            that.allowAdd = true;
-        }
-
-        if ( that.allowRemove === undefined ) {
-            that.allowRemove = true;
-        }
-
-        if ( that.allowUpdate === undefined ) {
-            that.allowUpdate = true;
-        }
-
-        if ( config.observable === undefined ) {
-            that.observable = true;
-        }
-
-
-        if ( !config.dataSource ) {
-            that.dataSource = [];
-        }
-
-        if ( !config.dataFields ) {
-            that.dataFields = [];
-        }
-        else {
-            /* if (config.dataSource && config.dataSource.length > 0) {
-                 const keys = Object.keys(config.dataSource[0]);
-
-                 //     that.dataFields = [];
-
-                 for (let i = 0; i < keys.length; i++) {
-
-                 }
-             }
-             */
-        }
-
-        if ( !config.dataSourceType ) {
-            that.dataSourceType = 'array';
-        }
-
-        if ( !config.id ) {
-            that.id = null;
-        }
-
-        if ( !config.autoFetch ) {
-            that.autoFetch = true;
-        }
-
-        if ( config.dataFields ) {
-            that.dataFields = config.dataFields;
-        }
-
-        Object.defineProperty( that, 'groupBy', {
-            configurable: false,
-            enumerable: true,
-            get() {
-                if ( !that._groupBy ) {
-                    return [];
-                }
-
-                return that._groupBy;
-            },
-            set( value ) {
-                const updateGrouping = () => {
-                    that.boundHierarchy = null;
-                    that.refreshHierarchy();
-
-                    if ( that.onGroup ) {
-                        that.onGroup();
-                    }
-                }
-
-                that._groupBy = [].concat(value);
-              
-                if ( that.isInitialized ) {
-                    updateGrouping();
-                }
-            }
-        } );
-
-        if ( !config.groupBy ) {
-            that.groupBy = [];
-        }
-        else {
-            if ( config.groupBy.toArray ) {
-                that.groupBy = config.groupBy.toArray();
-            }
-            else {
-                that.groupBy = config.groupBy;
-            }
-        }
-
-        if ( config && config.autoBind !== false ) {
-            that.dataBind();
-        }
-
-        that.isInitialized = true;
-    }
-
-    get dataFields() {
-        const that = this;
-
-        return that._dataFields;
-    }
-
-    set dataFields( value ) {
-        const that = this;
-
-        that._dataFields = that._getDataFieldObjects( value );
-
-        return that._dataFields;
-    }
-
-    _getDataFieldObjects( dataFields ) {
-        //const that = this;
-
-        let dataFieldObjects = [];
-
-        if ( typeof dataFields === 'number' ) {
-            const charCode = 'A'.charCodeAt( 0 );
-            let prefix = '';
-            let index = 0;
-
-            for ( let i = 0; i < dataFields; i++ ) {
-                const letter = String.fromCharCode( charCode + index );
-
-                index++;
-
-                const label = prefix + letter;
-
-                dataFieldObjects.push( { name: label, dataType: 'string' } )
-
-                if ( index >= 26 ) {
-                    index = 0;
-                    prefix += 'A';
-                }
-            }
-        }
-        else if ( dataFields.length > 0 ) {
-            for ( let i = 0; i < dataFields.length; i++ ) {
-                const dataField = dataFields[ i ];
-
-                if ( typeof dataField === 'string' ) {
-                    const dataFieldParts = dataField.split( ':' );
-                    const name = dataFieldParts[ 0 ].trim();
-                    const dataType = dataFieldParts.length > 1 ? dataFieldParts[ 1 ].trim() : 'string';
-
-                    dataFieldObjects.push( { name: name, dataType: dataType } );
-                }
-                else {
-                    dataFieldObjects.push( dataField );
-                }
-            }
-        }
-
-        return dataFieldObjects;
-    }
-
-    get dataSource() {
-        const that = this;
-
-        if ( !that._dataSource ) {
-            that._dataSource = [];
-        }
-
-        return that._dataSource;
-    }
-
-    set dataSource( value ) {
-        const that = this;
-
-        that._dataSource = value;
-
-        if ( that.isInitialized ) {
-            that.boundSource = false === that.observable ? [] : new JQX.ObservableArray();
-            that.dataItemById = [];
-            that.bindingCompleted = false;
-            that.dataBind();
-        }
-    }
-
-    get canNotify() {
-        const that = this;
-
-        if ( that._canNotify === undefined ) {
-            that._canNotify = true;
-        }
-
-        return that._canNotify;
-    }
-
-    set canNotify( value ) {
-        const that = this;
-
-        that._canNotify = value;
-    }
-
-    _notify( changeArgs ) {
-        const that = this;
-
-        if ( !that.canNotify ) {
-            return;
-        }
-
-        if ( that.notifyFn ) {
-            that.notifyFn( changeArgs );
-        }
-    }
-
-    notify( notifyFn ) {
-        const that = this;
-
-        if ( notifyFn ) {
-            that.notifyFn = notifyFn;
-        }
-    }
-
-    toArray() {
-        const that = this;
-
-        return that.boundSource.toArray();
-    }
-
-    dataBind() {
-        const that = this;
-
-        that.clear();
-
-        const completed = () => {
-       
-
-            that._onBindingComplete();
-        }
-
-        if ( typeof that.dataSource === 'string' && ( that.dataSource.indexOf( '.json' ) >= 0 ) ) {
-            that.url = that.dataSource;
-            that.dataSourceType = 'json';
-
-            new Ajax( that, ( data/*, status*/ ) => {
-                that.dataSource = data;
-
-                that._bindToJSON();
-            } );
-        }
-        else if ( typeof that.dataSource === 'string' && ( that.dataSource.indexOf( '.xlsx' ) >= 0 ) ) {
-            that.url = that.dataSource;
-            that.dataSourceType = 'xlsx';
-
-            new Ajax( that, ( data/*, status*/ ) => {
-                if ( !data[ 0 ] ) {
-                    data = [];
-                    that._bindToArray();
-                    completed();
-                    return;
-                }
-
-                const keys = Object.keys( data[ 0 ] );
-                const dataFieldMap = {};
-                const dataRows = [];
-
-                if ( that.exportHeader !== false ) {
-                    let index = 0;
-
-                    for ( let key in keys ) {
-                        const name = keys[ key ];
-
-                        dataFieldMap[ name ] = that.dataFields[ index++ ].name;
-                    }
-
-                    for ( let i = 1; i < data.length; i++ ) {
-                        const row = data[ i ];
-                        const dataRow = {};
-
-                        for ( let key in keys ) {
-                            const name = keys[ key ];
-
-                            dataRow[ dataFieldMap[ name ] ] = row[ name ];
-                        }
-
-                        dataRows.push( dataRow );
-                    }
-
-                    that.dataSource = dataRows;
-                }
-
-                that._bindToArray();
-                completed();
-            } );
-        }
-        else if ( typeof that.dataSource === 'string' && ( that.dataSource.indexOf( '.csv' ) >= 0 ) ) {
-            that.dataSourceType = 'csv';
-
-            new Ajax( that, (/*data, status*/ ) => {
-                that._bindToArray();
-            } );
-        }
-        else if ( typeof that.dataSource === 'string' && ( that.dataSource.indexOf( '.tsv' ) >= 0 ) ) {
-            that.dataSourceType = 'tsv';
-
-            new Ajax( that, (/*data, status*/ ) => {
-            } );
-        }
-        else if ( that.dataSourceType === 'array' ) {
-            that._bindToArray();
-            completed();
-        }
-        else if ( that.dataSourceType === 'json' ) {
-            that._bindToJSON();
-            completed();
-        }
-    }
-
-    _onBindingComplete() {
-        const that = this;
-
-        that._buildHierarchy();
-
-        if ( that.onBindingComplete ) {
-            that.onBindingComplete( { data: that.boundSource } );
-        }
-
-        if ( that._notify ) {
-            that._notify( { action: 'bindingComplete', data: that.boundSource } );
-        }
-
-        that.bindingCompleted = true;
-    }
-
-    refreshHierarchy() {
-        const that = this;
-
-        that._buildHierarchy();
-    }
-
-    find() {
-        const that = this;
-
-        return that.boundSource.find.apply( that.boundSource, arguments );
-    }
-
-    onVirtualDataSourceRequested( requestCallback, details ) {
-        const that = this;
-
-        let first = details ? details.first : Infinity;
-        let last = details ? details.last : Infinity;
-        let row = details ? details.row : null;
-
-        if ( undefined === first ) {
-            first = Infinity;
-        }
-
-        if ( undefined === last ) {
-            last = Infinity;
-        }
-
-        that.virtualFirstIndex = first;
-        that.virtualLastIndex = last;
-
-        if ( that.virtualDataSource ) {
-            const getDataSource = function ( ExcelAdapterSettings ) {
-                if ( ExcelAdapterSettings.virtualDataSourceLength !== undefined ) {
-                    that.virtualDataSourceLength = ExcelAdapterSettings.virtualDataSourceLength;
-                }
-
-                new JQX.ExcelAdapter(
-                    {
-                        dataSource: ExcelAdapterSettings.dataSource,
-                        dataFields: ExcelAdapterSettings.dataFields || that.dataFields,
-                        data: details,
-                        onBindingComplete( event ) {
-
-                            if ( that.virtualDataSourceOnExpand && row ) {
-                                if ( event.data && event.data.length > 0 ) {
-                                    that.add( event.data, row.$.id );
-                                }
-                                else {
-                                    row.leaf = true;
-                                }
-
-                                if ( that.onFilter ) {
-                                    that.onFilter()
-                                }
-
-                                requestCallback();
-
-                                return;
-                            }
-
-                            if ( first === Infinity ) {
-                                that.add( event.data );
-                            }
-                            else {
-                                let items = [];
-                                let indexes = [];
-
-                                for ( let i = 0; i < event.data.length; i++ ) {
-                                    const item = event.data[ i ];
-
-                                    if ( first + i <= last ) {
-                                        items.push( item );
-                                        indexes.push( first + i );
-                                    }
-                                }
-
-                                that.update( indexes, items );
-                            }
-
-
-                            if ( that.onFilter ) {
-                                that.onFilter()
-                            }
-
-                            requestCallback();
-                        }
-                    } );
-            }
-
-            let hasCache = false;
-
-            const isEmpty = ( obj ) => Object.entries( obj ).length === 0 && ( obj.constructor === Object || obj.constructor === Array );
-            const canCache = isEmpty( details.sorting ) && isEmpty( details.filtering ) && isEmpty( details.grouping ) && !details.row && ( details.action !== 'filter' && details.action !== 'sort' && details.action !== 'group' );
-
-            if ( that.virtualDataSourceCache && first !== Infinity && canCache ) {
-                let cachedCount = 0;
-
-                for ( let i = first; i < last; i++ ) {
-                    if ( !that[ i ].$.isEmpty ) {
-                        cachedCount++;
-                    }
-                }
-
-                if ( cachedCount === last - first ) {
-                    hasCache = true;
-                }
-            }
-
-            if ( hasCache ) {
-                requestCallback();
-            }
-            else {
-                if ( details.action === 'expand' ) {
-                    that.virtualDataSourceOnExpand( getDataSource, {
-                        first: first,
-                        last: last,
-                        row: details.row,
-                        sorting: details.sorting,
-                        filtering: details.filtering,
-                        grouping: details.grouping,
-                        action: details.action
-                    } );
-                }
-                else {
-                    that.virtualDataSource( getDataSource, {
-                        first: first,
-                        last: last,
-                        sorting: details.sorting,
-                        filtering: details.filtering,
-                        filterOperator: details.filterOperator || 'and',
-                        grouping: details.grouping,
-                        action: details.action
-                    } );
-                }
-            }
-        }
-        else {
-            requestCallback();
-        }
-    }
-
-    add( item, parentId ) {
-        const that = this;
-
-        if ( !item ) {
-            return;
-        }
-
-        let result = true;
-
-        const addItem = function ( item ) {
-            const itemObject = that._getDataItem( item, that.boundSource.length );
-
-            that[ that.boundSource.length ] = itemObject;
-            that.dataItemById[ itemObject.$.id ] = itemObject;
-
-            const pushResult = that.boundSource.push( itemObject );
-
-            if ( parentId !== undefined ) {
-                itemObject.$.parentId = parentId;
-            }
-
-            if ( !pushResult ) {
-                result = false;
-            }
-
-            return itemObject;
-        }
-
-        if ( item.length ) {
-            let itemObjects = [];
-
-            for ( let i = 0; i < item.length; i++ ) {
-                const itemObject = addItem( item[ i ] );
-
-                itemObjects.push( itemObject );
-            }
-
-            that._notify( { action: 'add', data: itemObjects } );
-        }
-        else {
-            const itemObject = addItem( item );
-
-            that._notify( { action: 'add', data: itemObject } );
-        }
-
-        that.refreshHierarchy();
-
-        return result;
-    }
-
-    refreshIndexes() {
-        const that = this;
-
-        for (let i = 0; i < that.boundSource.length; i++) {
-            that[i] = that.boundSource[i];
-            that[i].$.index = i;
-            that.dataItemById[that[i].$.id] = that[i];
-        }
-
-        let i = that.boundSource.length;
-
-        while (that[i]) {
-            delete that[i];
-            i++;
-        }
-    }
-
-    removeLast() {
-        const that = this;
-
-        delete that[that.boundSource.length - 1];
-        const result = that.boundSource.pop();
-        delete that.dataItemById[result.$.id];
-
-        that._notify({ action: 'removeLast', data: result });
-
-        that.refreshHierarchy();
-
-        return result;
-    }
-
-    removeAt(index) {
-        const that = this;
-
-        const item = that.boundSource[index];
-
-        if (!item) {
-            throw new Error('Invalid Item Index');
-        }
-
-        that.boundSource.splice(index, 1);
-        delete that.dataItemById[item.$.id];
-        that.refreshIndexes();
-
-        that._notify({ action: 'remove', index: index, data: item });
-
-        that.refreshHierarchy();
-    }
-
-    update( index, dataSourceItem ) {
-        const that = this;
-
-        if ( JQX.Utilities.Types.isArray( index ) && JQX.Utilities.Types.isArray( dataSourceItem ) ) {
-            if ( index.length === 0 && dataSourceItem.length === 0 ) {
-                that.refreshHierarchy();
-                return;
-            }
-        }
-
-        if ( dataSourceItem.length && index.length ) {
-            let itemObjects = [];
-
-            for ( let i = 0; i < index.length; i++ ) {
-                const itemObject = that._getDataItem( dataSourceItem[ i ], index[ i ] );
-                const currentIndex = index[ i ];
-
-                itemObjects.push( itemObject );
-
-                that.boundSource[ currentIndex ] = itemObject;
-                that[ currentIndex ] = that.boundSource[ currentIndex ];
-                that.dataItemById[ itemObject.$.id ] = that[ currentIndex ];
-            }
-
-            that._notify( { action: 'update', index: index, data: itemObjects } );
-
-            that.refreshHierarchy();
-
-            return;
-        }
-
-        const itemObject = that._getDataItem( dataSourceItem, index );
-
-        that.boundSource[ index ] = itemObject;
-        that[ index ] = that.boundSource[ index ];
-        that.dataItemById[ itemObject.$.id ] = that[ index ];
-
-        that._notify( { action: 'update', index: index, data: itemObject } );
-
-        that.refreshHierarchy();
-
-        return itemObject;
-    }
-
-    insert( index, item ) {
-        const that = this;
-
-        item = that._getDataItem( item, index );
-
-        const result = that.boundSource.splice( index, 0, item );
-
-        that.refreshIndexes();
-
-        that._notify( { action: 'insert', index: index, data: item } );
-
-        that.refreshHierarchy();
-
-        return result;
-    }
-
-    move( from, to ) {
-        if ( to > from && to - from === 1 || from === to ) {
-            return;
-        }
-
-        const that = this,
-            recordToMove = that.boundSource.splice( from, 1 )[ 0 ];
-
-        if ( to > from ) {
-            to--;
-            that.boundSource.splice( to, 0, recordToMove );
-        }
-        else {
-            that.boundSource.splice( to, 0, recordToMove );
-        }
-
-        that.refreshIndexes();
-
-        that._notify( { action: 'move', index: to, data: that.boundSource[ to ] } );
-
-        that.refreshHierarchy();
-    }
-
-    indexOf( item ) {
-        const that = this;
-        const index = that.boundSource.indexOf( item );
-
-        return index;
-    }
-
-    get length() {
-        const that = this;
-
-        if ( that.virtualDataSourceLength !== undefined ) {
-            return that.virtualDataSourceLength;
-        }
-
-        if ( that.dataSourceLength ) {
-            return that.dataSourceLength;
-        }
-
-        if ( typeof ( that.dataSource ) === 'number' ) {
-            return that.dataSource;
-        }
-
-        if ( that.bindingCompleted ) {
-            return that.boundSource.length;
-        }
-
-        if ( that.dataSource && typeof that.dataSource !== 'string' && that.dataSource.length ) {
-            return that.dataSource.length;
-        }
-
-        return that.boundSource.length;
-    }
-
-    clear() {
-        const that = this;
-
-        if ( !that.isInitialized ) {
-            that._cachedValues = [];
-            that.dataItemById = [];
-            return;
-        }
-
-        for ( let i = 0; i < that.boundSource.length; i++ ) {
-            delete that[ i ];
-        }
-
-        that._cachedValues = [];
-        that.boundSource = that.observable ? new JQX.ObservableArray() : [];
-        that.dataItemById = [];
-        that.refreshHierarchy();
-    }
-
-    _getId( id, item, index ) {
-        if ( id !== null && id.name !== undefined ) {
-            if ( id.name && item.getAttribute ) {
-                let result = item.getAttribute( id.name );
-                if ( result !== null && result.toString().length > 0 ) {
-                    return result;
-                }
-                else if ( id.map ) {
-                    try {
-                        let result = item.getAttribute( id.map );
-                        if ( result !== null && result.toString().length > 0 ) {
-                            return result;
-                        }
-                    }
-                    catch ( error ) {
-                        return index;
-                    }
-                }
-                return;
-            }
-        }
-
-        if ( id ) {
-            if ( id.toString().length > 0 && item.getAttribute ) {
-                let result = item.getAttribute( id );
-                if ( result !== null && result.toString().length > 0 ) {
-                    return result.trim().split( ' ' ).join( '' ).replace( /([ #;?%&,.+*~\':'!^$[\]()=>|\/@])/g, '' );
-                }
-                else {
-                    let splitMap = id.split( this.mapChar );
-                    if ( splitMap.length > 1 ) {
-                        let d = item;
-                        for ( let p = 0; p < splitMap.length; p++ ) {
-                            if ( d !== undefined ) {
-                                d = d[ splitMap[ p ] ];
-                            }
-                        }
-                        if ( d !== undefined ) {
-                            return d;
-                        }
-                    }
-                    else {
-                        if ( item[ id ] !== undefined ) {
-                            return item[ id ];
-                        }
-                    }
-                }
-            }
-        }
-
-        return index;
-    }
-
-    _buildHierarchy() {
-        const that = this;
-
-        if ( !that.reservedNames ) {
-            that.reservedNames = {
-                leaf: 'leaf',
-                parent: 'parent',
-                expanded: 'expanded',
-                checked: 'checked',
-                selected: 'selected',
-                level: 'level',
-                icon: 'icon',
-                data: 'data'
-            }
-        }
-        else {
-            const names = that.reservedNames;
-
-            if ( !names.leaf ) {
-                names.leaf = 'leaf';
-            }
-            if ( !names.parent ) {
-                names.parent = 'parent';
-            }
-            if ( !names.expanded ) {
-                names.expanded = 'expanded';
-            }
-            if ( !names.checked ) {
-                names.checked = 'checked';
-            }
-            if ( !names.selected ) {
-                names.selected = 'selected';
-            }
-            if ( !names.level ) {
-                names.level = 'level';
-            }
-            if ( !names.data ) {
-                names.data = 'data';
-            }
-
-        }
-
-        const names = that.reservedNames;
-
-        if ( that.childrenDataField ) {
-            const hierarchy = [];
-
-            for ( let i = 0; i < that.boundSource.length; i++ ) {
-                const item = Object.assign( {}, that.boundSource[ i ] );
-
-                if ( !item ) {
-                    continue;
-                }
-
-                hierarchy.push( item );
-
-                const addItems = function ( item ) {
-                    const splitMap = that.childrenDataField.split( that.mapChar );
-                    let children = null;
-
-                    if ( splitMap.length > 1 ) {
-                        let data = item;
-
-                        for ( let p = 0; p < splitMap.length; p++ ) {
-                            if ( data !== undefined ) {
-                                data = data[ splitMap[ p ] ];
-                            }
-                        }
-
-                        children = data;
-                    }
-                    else {
-                        children = item[ 'children' ];
-                    }
-
-                    item[ 'children' ] = children;
-
-                    if ( item[ 'children' ] === null || item[ 'children' ] === undefined || ( item[ 'children' ] && item[ 'children' ].length === 0 ) ) {
-                        item[ names.leaf ] = true;
-                    }
-                }
-
-                addItems( item );
-                item[ names.level ] = 0;
-
-                if ( !item.$ ) {
-                    item.$ = {};
-                }
-
-                item[ names.parent ] = null;
-                item[ names.data ] = item;
-
-                if ( item[ names.expanded ] === undefined ) {
-                    item[ names.expanded ] = false;
-                }
-
-                const drillThrough = function ( parent, children ) {
-                    if ( !children ) {
-                        parent[ 'children' ] = new Array();
-                        return;
-                    }
-
-                    for ( let i = 0; i < children.length; i++ ) {
-                        let item = that._getDataItem( children[ i ], i );
-
-                        if ( !item ) {
-                            continue;
-                        }
-
-                        addItems( item );
-                        item[ names.level ] = parent[ names.level ] + 1;
-                        item[ names.parent ] = parent;
-                        item[ names.data ] = item;
-
-                        if ( parent ) {
-                            parent[ 'children' ][ i ] = item;
-                        }
-
-
-                        if ( item[ names.expanded ] === undefined ) {
-                            item[ names.expanded ] = false;
-                        }
-
-                        drillThrough( item, item[ 'children' ] );
-                    }
-                }
-
-                drillThrough( item, item[ 'children' ] );
-            }
-
-
-            that.boundHierarchy = hierarchy;
-
-            if ( !that._boundSourceUpdate ) {
-                for ( let i = 0; i < that.boundHierarchy.length; i++ ) {
-                    const item = that.boundHierarchy[ i ];
-
-                    if ( item.children ) {
-                        const drillThrough = function ( item ) {
-                            if ( !that.dataItemById[ item.$.id ] ) {
-                                that.boundSource.canNotify = false;
-                                that.dataItemById[ item.$.id ] = item;
-                                that[ that.boundSource.length ] = item;
-                                that.boundSource.push( item );
-                                that.boundSource.canNotify = true;
-                            }
-
-                            if ( item.children ) {
-                                for ( let i = 0; i < item.children.length; i++ ) {
-                                    const child = item.children[ i ];
-
-                                    if ( child.children ) {
-                                        drillThrough( child );
-                                    }
-                                }
-                            }
-                        }
-
-                        drillThrough( item );
-                    }
-                }
-
-                that._boundSourceUpdate = true;
-            }
-        }
-
-        if ( that.xmlRoot && that.dataSourceType === 'xml' ) {
-            that.boundHierarchy = this._getHierarchy( 'uid', '_parentuid', 'children', null, that.boundSource );
-        }
-
-        if ( that.keyDataField && that.parentDataField ) {
-            that.boundHierarchy = this._getHierarchy( that.keyDataField, that.parentDataField, 'children', null, that.boundSource );
-        }
-
-        if ( that.groupBy && that.groupBy.length > 0 ) {
-            that.boundHierarchy = this._getGroupHierarchy( that.groupBy, 'children', 'label', null, 'data', null, 'parent', that.boundSource );
-        }
-
-        if ( that.virtualDataSourceOnExpand ) {
-            that.boundHierarchy = this._getHierarchy( 'id', 'parentId', 'children', null, that.boundSource );
-        }
-    }
-
-
-    _getGroupHierarchy( groups, collectionName, groupName, mappingFields, itemName, valueName, parentName, data, startIndex ) {
-        let that = this;
-
-        if ( !startIndex ) {
-            startIndex = 0;
-        }
-
-        let names = that.reservedNames;
-
-        const guid = function () {
-            function s4() {
-                return Math.floor( ( 1 + Math.random() ) * 0x10000 )
-                    .toString( 16 )
-                    .substring( 1 );
-            }
-
-            return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
-        }
-
-        let groupHashCodes = new Array();
-        for ( let iGroupColumn = 0; iGroupColumn < groups.length; iGroupColumn++ ) {
-            groupHashCodes[ iGroupColumn ] = guid();
-        }
-
-        if ( !collectionName ) {
-            collectionName = 'children';
-        }
-
-        if ( !groupName ) {
-            groupName = 'group';
-        }
-
-        if ( !itemName ) {
-            itemName = 'item';
-        }
-
-        if ( !parentName ) {
-            parentName = 'parent';
-        }
-
-        if ( undefined === valueName ) {
-            valueName = 'value';
-        }
-
-        const groupboundSource = new Array();
-        const hashItemGroups = new Array();
-
-        let groupboundSourceIndex = 0;
-
-        const getItem = function ( item ) {
-            let itemObj = item;
-            if ( mappingFields ) {
-                for ( let mappingField in mappingFields ) {
-                    const mappingObject = mappingFields[ mappingField ];
-
-                    if ( mappingObject.name && mappingObject.map ) {
-                        itemObj[ mappingObject.map ] = itemObj[ mappingObject.name ];
-                    }
-                }
-            }
-
-            return itemObj;
-        }
-
-        for ( let obj = 0; obj < data.length; obj++ ) {
-            let item = Object.assign( {}, getItem( data[ obj ] ) );
-
-            item[ names.leaf ] = false;
-
-            let itemKeysHierarchy = new Array();
-            let keys = 0;
-
-            for ( let iGroupColumn = 0; iGroupColumn < groups.length; iGroupColumn++ ) {
-                const group = groups[ iGroupColumn ];
-                const value = item[ group ];
-
-                if ( null === value ) {
-                    continue;
-                }
-
-                itemKeysHierarchy[ keys++ ] = { value: value, group: group, hash: groupHashCodes[ iGroupColumn ] };
-            }
-
-            if ( itemKeysHierarchy.length !== groups.length ) {
-                break;
-            }
-
-            let parentItem = null;
-            let lookupKey = '';
-
-            for ( let q = 0; q < itemKeysHierarchy.length; q++ ) {
-                const itemKey = itemKeysHierarchy[ q ].value;
-                const groupDataField = itemKeysHierarchy[ q ].group;
-                const columnHash = itemKeysHierarchy[ q ].hash;
-
-                lookupKey = lookupKey + '_' + columnHash + '_' + itemKey;
-
-                if ( hashItemGroups[ lookupKey ] !== undefined && hashItemGroups[ lookupKey ] !== null ) {
-                    parentItem = hashItemGroups[ lookupKey ];
-                    continue;
-                }
-
-                if ( parentItem === null ) {
-                    parentItem = { $: {} };
-
-                    parentItem[ names.level ] = 0;
-                    parentItem[ names.leaf ] = false;
-                    parentItem[ parentName ] = null;
-                    parentItem[ groupName ] = itemKey;
-                    parentItem[ itemName ] = item;
-                    parentItem[ 'groupDataField' ] = groupDataField;
-
-                    if ( !parentItem[ groupDataField ] ) {
-                        parentItem[ groupDataField ] = parentItem.data[ groupDataField ];
-                    }
-
-                    if ( item[ names.expanded ] !== undefined ) {
-                        parentItem[ names.expanded ] = item[ names.expanded ];
-                    }
-                    else {
-                        parentItem[ names.expanded ] = false;
-                    }
-
-                    if ( valueName ) {
-                        parentItem[ valueName ] = item[ valueName ];
-                    }
-
-                    parentItem[ collectionName ] = new Array();
-
-                    let uid = groupboundSource.length + startIndex;
-
-                    if ( !this.id || typeof item.$.id === 'number' || isFinite( item.$.id ) ) {
-                        uid = 'Item' + uid;
-                    }
-                    if ( parentItem.$.id === undefined ) {
-                        parentItem.$.id = uid;
-                    }
-
-                    groupboundSource[ groupboundSourceIndex++ ] = parentItem;
-                }
-                else {
-                    const subItem = { $: {} };
-
-                    subItem[ names.level ] = parentItem[ names.level ] + 1;
-                    subItem[ parentName ] = parentItem;
-                    subItem[ groupName ] = itemKey;
-                    subItem[ collectionName ] = new Array();
-                    subItem[ itemName ] = item;
-                    subItem[ 'groupDataField' ] = groupDataField;
-                    subItem[ names.leaf ] = false;
-
-                    if ( !subItem[ groupDataField ] ) {
-                        subItem[ groupDataField ] = subItem.data[ groupDataField ];
-                    }
-
-                    if ( item[ names.expanded ] !== undefined ) {
-                        subItem[ names.expanded ] = item[ names.expanded ];
-                    }
-                    else {
-                        subItem[ names.expanded ] = false;
-                    }
-
-                    if ( valueName ) {
-                        subItem[ valueName ] = item[ valueName ];
-                    }
-
-                    if ( subItem.$.id === undefined ) {
-                        subItem.$.id = parentItem.$.id + '_' + parentItem[ collectionName ].length;
-                    }
-
-                    parentItem[ collectionName ][ parentItem[ collectionName ].length ] = subItem;
-                    parentItem = subItem;
-                }
-
-                hashItemGroups[ lookupKey ] = parentItem;
-            }
-
-            if ( item ) {
-                item[ names.leaf ] = true;
-            }
-
-            if ( parentItem !== null ) {
-                if ( this.id === null ) {
-                    if ( undefined === item.$.id ) {
-                        item.$.id = parentItem.$.id + '_' + parentItem[ collectionName ].length;
-                    }
-                }
-                else {
-                    if ( undefined === item.$.id ) {
-                        if ( item.$.id.toString().indexOf( parentItem.$.id ) === -1 ) {
-                            item.$.id = parentItem.$.id + '_' + item.$.id;
-                        }
-                    }
-                }
-
-                item[ parentName ] = parentItem;
-                item[ names.level ] = parentItem[ names.level ] + 1;
-                parentItem[ collectionName ][ parentItem[ collectionName ].length ] = item;
-            }
-            else {
-                if ( undefined === item.$.id ) {
-                    item.$.id = guid();
-                }
-            }
-        }
-
-        return groupboundSource;
-    }
-
-    _getHierarchy( fieldName, parentFieldName, collectionName, mappingFields, boundSource ) {
-        const that = this;
-
-        const databoundHierarchy = new Array();
-        let flatData = this.boundSource;
-
-        if ( boundSource ) {
-            flatData = boundSource;
-        }
-
-        if ( this.boundSource.length === 0 )
-            return null;
-
-        const childrenName = collectionName !== null ? collectionName : 'children';
-        let items = new Array();
-        let data = flatData;
-        let dataLength = data.length;
-        let names = that.reservedNames;
-
-        const getItem = function ( item ) {
-            let itemObj = item;
-            if ( mappingFields ) {
-                for ( let mappingField in mappingFields ) {
-                    const mappingObject = mappingFields[ mappingField ];
-
-                    if ( mappingObject.name && mappingObject.map ) {
-                        itemObj[ mappingObject.map ] = itemObj[ mappingObject.name ];
-                    }
-                }
-            }
-
-            return itemObj;
-        }
-
-        // build hierarchical source.
-        for ( let i = 0; i < dataLength; i++ ) {
-            let item = data[ i ];
-            let parentId = item[ parentFieldName ];
-            let id = item[ fieldName ];
-
-            if ( parentFieldName === 'parentId' ) {
-                parentId = item.$.parentId;
-            }
-
-            if ( fieldName === 'id' ) {
-                id = item.$.id;
-            }
-
-            item[ childrenName ] = new Array();
-
-            items[ id ] = { parentId: parentId, item: item };
-        }
-
-        for ( let i = 0; i < dataLength; i++ ) {
-            const item = data[ i ];
-            let parentId = item[ parentFieldName ];
-            let id = item[ fieldName ];
-
-            if ( parentFieldName === 'parentId' ) {
-                parentId = item.$.parentId;
-            }
-
-            if ( fieldName === 'id' ) {
-                id = item.$.id;
-            }
-
-            if ( items[ parentId ] !== undefined ) {
-                let item = { parentId: parentId, item: items[ id ].item };
-                let parentItem = items[ parentId ].item;
-                if ( !parentItem[ childrenName ] ) {
-                    parentItem[ childrenName ] = new Array();
-                }
-                let length = parentItem[ childrenName ].length;
-                item = item.item;
-
-                if ( !names ) {
-                    if ( item.parent === undefined ) {
-                        item.parent = parentItem;
-                    }
-                }
-                else {
-                    if ( item[ names.parent ] === undefined ) {
-                        item[ names.parent ] = parentItem;
-                    }
-                }
-
-                const itemObj = getItem( item );
-
-                parentItem[ childrenName ][ length ] = itemObj;
-                items[ parentId ].item = parentItem;
-                items[ id ].item = item;
-
-            }
-            else {
-                let item = items[ id ].item;
-                if ( !names ) {
-                    if ( item.parent === undefined ) {
-                        item.parent = null;
-                    }
-                }
-                else {
-                    if ( item[ names.parent ] === undefined ) {
-                        item[ names.parent ] = null;
-                    }
-                }
-
-                const itemObj = getItem( item );
-
-                if ( !names ) {
-                    itemObj.level = 0;
-                }
-                else {
-                    itemObj[ names.level ] = 0;
-                }
-
-                databoundHierarchy[ databoundHierarchy.length ] = itemObj;
-            }
-        }
-        if ( databoundHierarchy.length !== 0 ) {
-            let updateLevels = function ( level, children ) {
-                for ( let i = 0; i < children.length; i++ ) {
-                    const child = children[ i ];
-
-                    if ( !names ) {
-                        child.level = level;
-                    }
-                    else {
-                        child[ names.level ] = level;
-                    }
-
-                    const childChildren = child[ childrenName ];
-
-                    if ( childChildren ) {
-                        if ( childChildren.length > 0 ) {
-                            updateLevels( level + 1, childChildren );
-                        }
-                        else {
-                            if ( that.virtualDataSourceOnExpand ) {
-                                if ( child.leaf === undefined ) {
-                                    child.leaf = false;
-                                }
-                            }
-                            else {
-                                if ( !names ) {
-                                    child.leaf = true;
-                                }
-                                else {
-                                    child[ names.leaf ] = true;
-                                }
-                            }
-                        }
-                    }
-                    else {
-                        if ( that.virtualDataSourceOnExpand ) {
-                            if ( child.leaf === undefined ) {
-                                child.leaf = false;
-                            }
-                        }
-                        else {
-                            if ( !names ) {
-                                child.leaf = true;
-                            }
-                            else {
-                                child[ names.leaf ] = true;
-                            }
-                        }
-                    }
-                }
-            };
-            updateLevels( 0, databoundHierarchy );
-        }
-        return databoundHierarchy;
-    }
-
-    summarize( summaryItems, boundSource ) {
-        const that = this;
-
-        if ( !Array.isArray( summaryItems ) ) {
-            summaryItems = [ summaryItems ];
-        }
-
-        let tempSummaryItems = [];
-
-        for ( let i = 0; i < summaryItems.length; i++ ) {
-            const summaryItem = summaryItems[ i ];
-
-            for ( let name in summaryItem ) {
-                const functions = summaryItem[ name ];
-
-                tempSummaryItems.push( { dataField: name, functions: functions } )
-            }
-        }
-
-        summaryItems = tempSummaryItems;
-
-        let data = {};
-        let summaryByDataField = new Array();
-
-        if ( !boundSource ) {
-            boundSource = that.boundSource;
-        }
-
-        let length = boundSource.length;
-
-        if ( length === 0 ) {
-            return;
-        }
-
-        if ( length === undefined ) {
-            return;
-        }
-
-        for ( let i = 0; i < length; i++ ) {
-            let dataItem = boundSource[ i ];
-
-            for ( let j = 0; j < summaryItems.length; j++ ) {
-                const summaryItem = summaryItems[ j ];
-                let value = dataItem[ summaryItem.dataField ];
-
-                if ( summaryItem.functions ) {
-                    data[ summaryItem.dataField ] = data[ summaryItem.dataField ] || {};
-                    summaryByDataField[ summaryItem.dataField ] = summaryByDataField[ summaryItem.dataField ] || 0;
-                    summaryByDataField[ summaryItem.dataField ]++;
-
-                    const _summaryItemFunction = function ( summaryItemObject ) {
-                        for ( let name in summaryItemObject ) {
-                            let oldValue = data[ summaryItem.dataField ][ name ];
-
-                            if ( oldValue === null || oldValue === undefined ) {
-                                data[ summaryItem.dataField ][ name ] = 0;
-                                oldValue = 0;
-                            }
-
-                            if ( typeof summaryItemObject[ name ] === 'function' ) {
-                                oldValue = summaryItemObject[ name ]( oldValue, value, summaryItem.dataField, dataItem );
-                            }
-                            data[ summaryItem.dataField ][ name ] = oldValue;
-                        }
-                    }
-
-                    let canParse = parseFloat( value );
-
-                    if ( isNaN( canParse ) ) {
-                        canParse = false;
-                    }
-                    else {
-                        canParse = true;
-                    }
-
-                    if ( canParse ) {
-                        value = parseFloat( value );
-                    }
-
-                    if ( typeof value === 'number' && isFinite( value ) ) {
-                        summaryItem.functions.forEach( function ( summaryItemFunction ) {
-                            let oldValue = data[ summaryItem.dataField ][ summaryItemFunction ];
-
-                            if ( oldValue === null || oldValue === undefined ) {
-                                oldValue = 0;
-
-                                if ( summaryItemFunction === 'min' ) {
-                                    oldValue = 9999999999999;
-                                }
-
-                                if ( summaryItemFunction === 'max' ) {
-                                    oldValue = -9999999999999;
-                                }
-
-                                if (summaryItemFunction === 'median') {
-                                    oldValue = [];
-                                }
-                            }
-
-                            if ( summaryItemFunction === 'sum' || summaryItemFunction === 'avg' || summaryItemFunction === 'stdev'
-                                || summaryItemFunction === 'stdevp' || summaryItemFunction === 'var' || summaryItemFunction === 'varp' ) {
-                                oldValue += parseFloat( value );
-                            }
-                            else if ( summaryItemFunction === 'product' ) {
-                                if ( i === 0 )
-                                    oldValue = parseFloat( value );
-                                else
-                                    oldValue *= parseFloat( value );
-                            }
-                            else if ( summaryItemFunction === 'min' ) {
-                                oldValue = Math.min( oldValue, parseFloat( value ) );
-                            }
-                            else if ( summaryItemFunction === 'max' ) {
-                                oldValue = Math.max( oldValue, parseFloat( value ) );
-                            }
-                            else if ( summaryItemFunction === 'count' ) {
-                                oldValue++;
-                            }
-                            else if (summaryItemFunction === 'median') {
-                                oldValue.push(parseFloat(value));
-                            }
-                            else if ( typeof ( summaryItemFunction ) === 'object' ) {
-                                _summaryItemFunction( summaryItemFunction );
-                                return;
-                            }
-
-                            data[ summaryItem.dataField ][ summaryItemFunction ] = oldValue;
-                        } );
-                    }
-                    else {
-                        summaryItem.functions.forEach( function ( summaryItemFunction ) {
-                            if ( summaryItemFunction === 'min' || summaryItemFunction === 'max' || summaryItemFunction === 'count' || summaryItemFunction === 'product' || summaryItemFunction === 'sum'
-                                || summaryItemFunction === 'avg' || summaryItemFunction === 'stdev'
-                                || summaryItemFunction === 'stdevp' || summaryItemFunction === 'var' || summaryItemFunction === 'varp' ) {
-                                if ( value === null ) {
-                                    return true;
-                                }
-
-                                let oldValue = data[ summaryItem.dataField ][ summaryItemFunction ];
-
-                                if ( oldValue === null || oldValue === undefined ) {
-                                    oldValue = 0;
-                                }
-
-                                data[ summaryItem.dataField ][ summaryItemFunction ] = oldValue;
-
-                                return true;
-                            }
-
-                            if ( typeof ( summaryItemFunction ) === 'object' ) {
-                                _summaryItemFunction( summaryItemFunction );
-                            }
-                        } );
-                    }
-                }
-            }
-        }
-
-        for ( let j = 0; j < summaryItems.length; j++ ) {
-            const summaryItem = summaryItems[ j ];
-
-            if ( !summaryItem.functions ) {
-                continue;
-            }
-            if ( !data[ summaryItem.dataField ] ) {
-                data[ summaryItem.dataField ] = {};
-
-                summaryItem.functions.forEach( function ( summaryItemFunction ) {
-                    data[ summaryItem.dataField ][ summaryItemFunction ] = 0;
-                } );
-            }
-
-            if ( data[ summaryItem.dataField ][ 'avg' ] !== undefined ) {
-                const value = data[ summaryItem.dataField ][ 'avg' ];
-                const dataValues = summaryByDataField[ summaryItem.dataField ];
-
-                if ( dataValues === 0 || dataValues === undefined ) {
-                    data[ summaryItem.dataField ][ 'avg' ] = 0;
-                }
-                else {
-                    data[ summaryItem.dataField ][ 'avg' ] = value / dataValues;
-                }
-            }
-            else if ( data[ summaryItem.dataField ][ 'count' ] !== undefined ) {
-                data[ summaryItem.dataField ][ 'count' ] = length;
-            }
-            else if (data[summaryItem.dataField]['median'] !== undefined) {
-                let population = data[summaryItem.dataField]['median'];
-
-                population.sort(function (a, b) {
-                    return a - b;
-                });
-
-                data[summaryItem.dataField]['median'] =
-                    0.5 * (population[Math.floor((population.length + 1) / 2) - 1] + population[Math.ceil((population.length + 1) / 2) - 1]);
-            }
-
-            // stdev, stdevp, var, varp.
-            // stdev - Standard deviation on a sample.
-            // varp - Variance on an entire population.
-            // let - Variance on a sample.
-            if ( data[ summaryItem.dataField ][ 'stdev' ] || data[ summaryItem.dataField ][ 'stdevp' ]
-                || data[ summaryItem.dataField ][ 'var' ] || data[ summaryItem.dataField ][ 'varp' ] ) {
-                summaryItem.functions.forEach( function ( summaryItemFunction ) {
-                    if ( summaryItemFunction === 'stdev' || summaryItemFunction === 'var' || summaryItemFunction === 'varp' || summaryItemFunction === 'stdevp' ) {
-                        const value = data[ summaryItem.dataField ][ summaryItemFunction ];
-                        const count = length;
-                        const average = ( value / length );
-                        let sumSq = 0.0;
-
-                        for ( let i = 0; i < length; i++ ) {
-                            let dataItem = boundSource[ i ];
-                            let value = dataItem[ summaryItem.dataField ];
-
-                            sumSq += ( value - average ) * ( value - average );
-                        }
-
-                        let denominator = ( summaryItemFunction === 'stdevp' || summaryItemFunction === 'varp' ) ? count : count - 1;
-
-                        if ( denominator === 0 ) {
-                            denominator = 1;
-                        }
-
-                        if ( summaryItemFunction === 'var' || summaryItemFunction === 'varp' ) {
-                            data[ summaryItem.dataField ][ summaryItemFunction ] = sumSq / denominator;
-                        }
-                        else if ( summaryItemFunction === 'stdevp' || summaryItemFunction === 'stdev' ) {
-                            data[ summaryItem.dataField ][ summaryItemFunction ] = Math.sqrt( sumSq / denominator );
-                        }
-                    }
-                } );
-            }
-        }
-        return data;
-    }
-
-    deserialize(stringValue, type, nullable) {
-        const nullValue = stringValue === 'null';
-
-        if (stringValue === undefined || (nullValue && !nullable)) {
-            return undefined;
-        }
-
-        if (nullValue && nullable) {
-            return null;
-        }
-
-        if (type === 'boolean' || type === 'bool') {
-            if (stringValue === null) {
-                return false;
-            }
-
-            // Boolean properties are set based on the presence of the attribute: if the attribute exists at all, the value is true.
-            return true;
-        }
-        else if (type === 'number' || type === 'float') {
-            if (stringValue === 'NaN') {
-                return NaN;
-            }
-
-            if (stringValue === 'Infinity') {
-                return Infinity;
-            }
-
-            if (stringValue === '-Infinity') {
-                return -Infinity;
-            }
-
-            return parseFloat(stringValue);
-        }
-        else if (type === 'int' || type === 'integer') {
-            if (stringValue === 'NaN') {
-                return NaN;
-            }
-
-            if (stringValue === 'Infinity') {
-                return Infinity;
-            }
-
-            if (stringValue === '-Infinity') {
-                return -Infinity;
-            }
-
-            return parseInt(stringValue);
-        }
-        else if (type === 'string') {
-            return stringValue;
-        }
-        else if (type === 'any') {
-            return stringValue;
-        }
-        else if (type === 'date') {
-            return new Date(stringValue);
-        }
-        else if (type === 'function') {
-            if (typeof window[stringValue] === 'function') {
-                return window[stringValue];
-            }
-        }
-        else if (type === 'array' || type === 'object') {
-            try {
-                const jsonObject = JSON.parse(stringValue);
-
-                if (jsonObject) {
-                    return jsonObject;
-                }
-            }
-            catch (er) {
-                if (window[stringValue] && (typeof window[stringValue] === 'object')) {
-                    return window[stringValue];
-                }
-                else if (type === 'array' && stringValue.indexOf('[') >= 0) {
-                    if (stringValue.indexOf('{') >= 0) {
-                        let array = stringValue.replace(/{/ig, '').replace('[', '').replace(']', '').replace(/'/ig, '').replace(/"/ig, '').trim();
-
-                        array = array.split('},');
-
-                        for (let i = 0; i < array.length; i++) {
-                            let parsedObject = {
-                            };
-
-                            let parts = array[i].trim().split(',');
-
-                            for (let j = 0; j < parts.length; j++) {
-                                const key = parts[j].split(':')[0].trim();
-                                const value = parts[j].split(':')[1].trim();
-
-                                parsedObject[key] = value;
-                            }
-
-                            array[i] = parsedObject;
-                        }
-
-                        return array;
-                    }
-
-                    const array = stringValue.replace('[', '').replace(']', '').replace(/'/ig, '').replace(/"/ig, '').trim().split(',');
-
-                    return array;
-                }
-            }
-        }
-
-        return undefined;
-    }
-
-    _getDataItem( dataSourceItem, index ) {
-        const that = this;
-        const itemObject = {};
-        const unboundMode = typeof ( that.dataSource ) === 'number' || that.dataSourceLength;
-
-        if ( !dataSourceItem ) {
-            return { $: { id: index, isEmpty: true, index: index } }
-        }
-
-        if ( typeof dataSourceItem === 'string' ) {
-            dataSourceItem = { '': dataSourceItem };
-        }
-
-        if ( unboundMode ) {
-            for ( let j = 0; j < that.dataFields.length; j++ ) {
-                const dataField = that.dataFields ? that.dataFields[ j ] : {};
-
-                itemObject[ dataField.name ] = '';
-            }
-
-            itemObject.$ = {};
-            itemObject.$.id = index;
-            itemObject.$.index = index;
-
-            return itemObject;
-        }
-
-        const dataItem = dataSourceItem;
-
-        if ( dataItem.expanded !== undefined ) {
-            itemObject.expanded = dataItem.expanded;
-
-            if ( dataItem.expanded === 'true' || dataItem.expanded === true || dataItem.expanded === 1 ) {
-                itemObject.expanded = true;
-            }
-            else {
-                itemObject.expanded = false;
-            }
-        }
-
-        if ( that.childrenDataField ) {
-            if ( dataItem[ that.childrenDataField ] !== undefined ) {
-                itemObject.children = dataItem[ that.childrenDataField ];
-            }
-        }
-        else {
-            if ( dataItem.children !== undefined ) {
-                itemObject.children = dataItem.children;
-            }
-            else if ( dataItem.items !== undefined ) {
-                itemObject.children = dataItem.items;
-            }
-        }
-        if ( dataItem.leaf !== undefined ) {
-            itemObject.leaf = dataItem.leaf;
-        }
-
-        if ( dataItem.level !== undefined ) {
-            itemObject.level = dataItem.level;
-        }
-
-        if ( that.keyDataField ) {
-            if ( dataItem[ that.keyDataField ] !== undefined ) {
-                itemObject[ that.keyDataField ] = dataItem[ that.keyDataField ];
-            }
-        }
-
-        if ( that.parentDataField ) {
-            if ( dataItem[ that.parentDataField ] !== undefined ) {
-                itemObject[ that.parentDataField ] = dataItem[ that.parentDataField ];
-            }
-        }
-
-        if ( that.dataFields.length === 0 ) {
-            const names = Object.getOwnPropertyNames( dataSourceItem );
-
-            for ( let i = 0; i < names.length; i++ ) {
-                if ( names[ i ] === '$' ) {
-                    continue;
-                }
-
-                that.dataFields.push( { name: names[ i ], dataType: 'string' } );
-            }
-        }
-
-        for ( let j = 0; j < that.dataFields.length; j++ ) {
-            const dataField = that.dataFields ? that.dataFields[ j ] : {};
-            let value = '';
-
-            dataField.dataType = dataField.type;
-            
-            if ( undefined === dataField || dataField === null ) {
-                continue;
-            }
-
-            if ( dataSourceItem.length ) {
-                value = dataSourceItem[ j ];
-            }
-
-            if ( dataField.map ) {
-                let splitMap = dataField.map.split( that.mapChar );
-
-                if ( splitMap.length > 0 ) {
-                    let dataMappedItem = dataItem;
-
-                    for ( let p = 0; p < splitMap.length; p++ ) {
-                        if ( !dataItem ) {
-                            continue;
-                        }
-
-                        dataMappedItem = dataMappedItem[ splitMap[ p ] ];
-                    }
-
-                    value = dataMappedItem;
-                }
-                else {
-                    value = dataItem[ dataField.map ];
-                }
-            }
-
-            if ( value !== undefined && value !== null ) {
-                value = value.toString();
-            }
-            else {
-                if ( value === undefined && value !== null ) {
-                    value = '';
-                }
-            }
-
-
-            let isEmptyString = false;
-            // searches by both selectors when necessary.
-            if ( value === '' ) {
-                isEmptyString = true;
-                value = dataSourceItem[ dataField.name ];
-
-                if ( value !== undefined && value !== null ) {
-                    if ( dataField.dataType !== 'array' ) {
-                        if ( dataField.dataType !== 'date' ) {
-                            value = value.toString();
-                        }
-                    }
-                }
-                else {
-                    value = '';
-                }
-            }
-
-            if ( value === '[object Object]' && dataField.map && isEmptyString ) {
-                value = '';
-            }
-
-            if ( that._cachedValues[ '' + value + '_' + dataField.dataType ] ) {
-                value = that._cachedValues[ '' + value + '_' + dataField.dataType ];
-            }
-            else {
-                if ( dataField.dataType === 'bool' || dataField.dataType === 'boolean' ) {
-                    if ( value === 'true' || value === '1' ) {
-                        value = true;
-                    }
-                    else if ( value === 'false' || value === '0' ) {
-                        value = false;
-                    }
-                }
-                else {
-                    value = that.deserialize( '' + value, dataField.dataType, true );
-                }
-
-                that._cachedValues[ value + '_' + dataField.dataType ] = value;
-            }
-
-            if ( dataField.dataType !== 'string' && dataField.dataType !== 'boolean' && dataField.dataType !== 'bool' ) {
-                if ( isNaN( value ) || value === -Infinity || value === Infinity ) {
-                    value = 0;
-                }
-            }
-
-            itemObject[ dataField.name ] = value;
-        }
-
-        let itemObjectId = index;
-
-        if ( that.id ) {
-            itemObjectId = dataItem[ that.id ];
-            if ( typeof ( itemObjectId ) === 'object' ) {
-                itemObjectId = index;
-            }
-        }
-        else if ( !that.virtualDataSource && that.dataItemById && that.dataItemById[ itemObjectId ] ) {
-            itemObjectId = that.length;
-        }
-
-        if ( !itemObject.$ ) {
-            itemObject.$ = {};
-        }
-
-        itemObject.$.id = itemObjectId;
-        itemObject.$.index = index;
-
-        return new Object( itemObject );
-    }
-
-    _bindToArray() {
-        const that = this;
-
-        const unboundMode = typeof ( that.dataSource ) === 'number' || that.dataSourceLength;
-        const dataArray = [];
-
-        that.boundSource.canNotify = false;
-
-        for ( let i = 0; i < that.length; i++ ) {
-            const dataSourceItem = unboundMode ? {} : that.dataSource[ i ];
-            const itemObject = that._getDataItem( dataSourceItem, i );
-
-            dataArray.push( itemObject );
-        }
-
-        if ( unboundMode && that.dataSourceLength && that.dataSource.length > 0 ) {
-            for ( let i = 0; i < that.dataSource.length; i++ ) {
-                const cell = that.dataSource[ i ].cell;
-                const value = that.dataSource[ i ].value;
-
-                const row = cell.replace( /[^0-9]/g, '' );
-                const dataField = cell.replace( /[0-9]/g, '' );
-
-                dataArray[ row - 1 ][ dataField ] = value;
-            }
-        }
-
-        that.boundSource = dataArray;
-
-        for ( let i = 0; i < that.length; i++ ) {
-            that[ i ] = that.boundSource[ i ];
-            that.dataItemById[ that[ i ].$.id ] = that[ i ];
-        }
-
-        that.boundSource.canNotify = true;
-    }
-
-    _bindToJSON() {
-        const that = this;
-
-        const dataArray = [];
-
-        const dataEntries = Object.entries( that.dataSource );
-
-        that.boundSource.canNotify = false;
-
-        for ( let i = 0; i < dataEntries.length; i++ ) {
-            const dataSourceItem = dataEntries[ i ];
-            const itemObject = that._getDataItem( dataSourceItem, i );
-
-            dataArray.push( itemObject );
-        }
-
-        that.boundSource = false === that.observable ? dataArray : new JQX.ObservableArray( dataArray );
-
-        for ( let i = 0; i < that.length; i++ ) {
-            that[ i ] = that.boundSource[ i ];
-            that.dataItemById[ that[ i ].$.id ] = that[ i ];
-        }
-
-        that.boundSource.canNotify = true;
-    }
-
-    sortBy( dataField, dataType, orderBy ) {
-        const that = this;
-
-        if ( !dataType ) {
-            for ( let i = 0; i < that.dataFields.length; i++ ) {
-                const field = that.dataFields[ i ];
-
-                if ( field.name === dataField ) {
-                    dataType = field.dataType;
-                    break;
-                }
-            }
-        }
-
-        if ( that.boundHierarchy ) {
-            if ( ( !dataField || dataField.length === 0 ) && that.groupBy.length > 0 ) {
-                that.refreshHierarchy();
-                return;
-            }
-
-            const sortBy = function ( hierarchy ) {
-                that._sort( hierarchy, dataField, orderBy, dataType );
-
-                for ( let i = 0; i < hierarchy.length; i++ ) {
-                    const item = hierarchy[ i ];
-
-                    if ( item[ 'children' ] ) {
-                        sortBy( item[ 'children' ], dataField, orderBy, dataType );
-                    }
-                }
-            }
-
-            sortBy( that.boundHierarchy );
-        }
-        else {
-            that._sort( that.boundSource, dataField, orderBy, dataType );
-        }
-    }
-
-    _createFilter( dataType, filterExpressions ) {
-        const filterOperators = {
-            '=': 'EQUAL',
-            '<>': 'NOT_EQUAL',
-            '<': 'LESS_THAN',
-            '>': 'GREATER_THAN',
-            '<=': 'LESS_THAN_OR_EQUAL',
-            '>=': 'GREATER_THAN_OR_EQUAL',
-            'equal': 'EQUAL',
-            'not equal': 'NOT_EQUAL',
-            'less than': 'LESS_THAN',
-            'greater than': 'GREATER_THAN',
-            'greater than or equal': 'GREATER_THAN_OR_EQUAL',
-            'less than or equal': 'LESS_THAN_OR_EQUAL',
-            'starts with': 'STARTS_WITH',
-            'ends with': 'ENDS_WITH',
-            'null': 'null',
-            '': 'EMPTY',
-            'isblank': 'EMPTY',
-            'isnotblank': 'NOT_EMPTY',
-            'contains': 'CONTAINS',
-            'notcontains': 'DOES_NOT_CONTAIN',
-            'startswith': 'STARTS_WITH',
-            'endswith': 'ENDS_WITH',
-            'NULL': 'NULL',
-            'NOT_NULL': 'NOT_NULL'
-        };
-
-        let filterExpressionsArray = [];
-
-        for ( let i = 0; i < filterExpressions.length; i++ ) {
-            const filterExpression = filterExpressions[ i ];
-
-            const filterExpressionParts = filterExpression.indexOf( '"' ) === -1 ? filterExpression.split( ' ' ) : filterExpression.split( '"' );
-            let filter = [];
-
-            for ( let j = 0; j < filterExpressionParts.length; j++ ) {
-                const part = filterExpressionParts[ j ];
-
-                if ( part !== '' ) {
-                    filter.push( part.trim() );
-                }
-            }
-
-            filterExpressionsArray.push( filter );
-        }
-
-        const filterGroup = new JQX.FilterGroup();
-        const filterGroupOperators = [];
-        const filterSubGroups = [];
-
-        for ( let i = 0; i < filterExpressionsArray.length; i++ ) {
-            const filterExpression = filterExpressionsArray[ i ];
-
-
-            if ( filterExpression.length > 1 ) {
-                const filterSubGroup = new JQX.FilterGroup();
-
-                let operator = 'and';
-                let filterExpressionPartsCounter = 0;
-
-                for ( let j = 0; j < filterExpression.length; j++ ) {
-                    const value = filterExpression[ j ];
-
-                    if ( value === 'and' || value === 'or' ) {
-                        operator = value;
-                        continue;
-                    }
-
-                    filterExpressionPartsCounter++;
-
-                    if ( filterExpressionPartsCounter === 2 ) {
-                        const filter = filterSubGroup.createFilter( dataType, value, filterOperators[ filterExpression[ j - 1 ] ] );
-
-                        filterExpressionPartsCounter = 0;
-
-                        if ( operator ) {
-                            filterSubGroup.addFilter( operator, filter );
-                        }
-                    }
-                }
-
-                filterSubGroups.push( filterSubGroup );
-            }
-            else {
-                const filterGroupOperator = filterExpression[ 0 ];
-
-                if ( filterGroupOperator !== 'and' && filterGroupOperator !== 'or' ) {
-                    throw new Error( 'Filter Exprresion expects "AND" or "OR", but the token is: ' + filterGroupOperator );
-                }
-
-                filterGroupOperators.push( filterGroupOperator );
-            }
-        }
-
-        let operatorsCounter = 0;
-
-        if ( filterSubGroups.length === 1 ) {
-            return filterSubGroups[ 0 ];
-        }
-
-        for ( let i = 0; i < filterSubGroups.length; i++ ) {
-            let operator = filterGroupOperators[ operatorsCounter ];
-
-            if ( ( i + 1 ) % 2 === 0 ) {
-                operatorsCounter++;
-            }
-
-            if ( !operator ) {
-                operator = 'and';
-            }
-
-            filterGroup.addFilter( operator, filterSubGroups[ i ] );
-        }
-
-        return filterGroup;
-    }
-
-    filterBy( dataField, ...filterExpressions ) {
-        const that = this;
-
-
-        const dataType = ( () => {
-            for ( let i = 0; i < that.dataFields.length; i++ ) {
-                const field = that.dataFields[ i ];
-
-                if ( field.name === dataField ) {
-                    return field.dataType;
-                }
-            }
-        } )();
-
-
-        const filterGroup = that._createFilter( dataType, filterExpressions );
-
-        let filteredData = that.boundSource.filter( ( value ) => {
-            const evaluation = filterGroup.evaluate( value[ dataField ] );
-
-            return evaluation;
-        } );
-
-        return filteredData;
-    }
-
-    _filter( filters, operator = 'and' ) {
-        const that = this;
-        const filterGroups = [];
-        const dataFields = [];
-
-        if ( filters.length === 0 ) {
-            that.clearFilter();
-            return;
-        }
-
-        const dataType = ( dataField ) => {
-            for ( let i = 0; i < that.dataFields.length; i++ ) {
-                const field = that.dataFields[ i ];
-
-                if ( field.name === dataField ) {
-                    return field.dataType;
-                }
-            }
-        };
-        let defaultResult, operatorSpecificEval;
-
-        if ( operator === 'and' ) {
-            defaultResult = true;
-            operatorSpecificEval = function ( result, filterGroup, row ) {
-                return result && filterGroup.evaluate( row[ filterGroup.dataField ] );
-            };
-        }
-        else {
-            defaultResult = false;
-            operatorSpecificEval = function ( result, filterGroup, row ) {
-                return result || filterGroup.evaluate( row[ filterGroup.dataField ] );
-            };
-        }
-
-        for ( let i = 0; i < filters.length; i++ ) {
-            const filter = filters[ i ];
-            const dataField = filter[ 0 ];
-            let filterGroup = null;
-
-            if ( filter[ 1 ] instanceof JQX.FilterGroup ) {
-                filterGroup = filter[ 1 ];
-            }
-            else {
-                filterGroup = that._createFilter( dataType( dataField ), filter.splice( 1 ) );
-            }
-
-            if ( filterGroup ) {
-                dataFields.push( dataField );
-                filterGroup.dataField = dataField;
-                filterGroups.push( filterGroup );
-            }
-        }
-
-        if ( that.boundHierarchy ) {
-            const filter = function ( row ) {
-                let result = defaultResult;
-
-                for ( let j = 0; j < filterGroups.length; j++ ) {
-                    const filterGroup = filterGroups[ j ];
-
-                    result = operatorSpecificEval( result, filterGroup, row );
-                }
-
-                row.$.filtered = result;
-
-                return result;
-            }
-
-            const filterBy = function ( hierarchy, parentItem, root ) {
-                let filteredCount = 0;
-
-                for ( let i = 0; i < hierarchy.length; i++ ) {
-                    const item = hierarchy[ i ];
-
-                    filter( item );
-
-                    if ( item.$.filtered ) {
-                        filteredCount++;
-                    }
-
-                    if ( item[ 'children' ] ) {
-                        filterBy( item[ 'children' ], item, parentItem );
-                    }
-                }
-
-                if ( filteredCount > 0 && that.groupBy.length > 0 && parentItem ) {
-                    parentItem.$.filtered = true;
-
-                    if ( root && !root.$.filtered ) {
-                        root.$.filtered = true;
-                    }
-                }
-                else {
-                    if ( filteredCount > 0 && filteredCount !== hierarchy.length && parentItem ) {
-                        parentItem.$.filtered = null;
-
-                        if ( root && !root.$.filtered ) {
-                            root.$.filtered = null;
-                        }
-                    }
-                }
-            }
-
-            filterBy( that.boundHierarchy, null, null );
-        }
-        else {
-            for ( let i = 0; i < that.boundSource.length; i++ ) {
-                const row = that.boundSource[ i ];
-
-                let result = defaultResult;
-
-                for ( let j = 0; j < filterGroups.length; j++ ) {
-                    const filterGroup = filterGroups[ j ];
-
-                    result = operatorSpecificEval( result, filterGroup, row );
-                }
-
-                row.$.filtered = result;
-            }
-        }
-
-        if ( that.onFilter ) {
-            that.onFilter()
-        }
-    }
-
-    clearGroup() {
-        const that = this;
-
-        that.groupBy = [];
-        that.boundHierarchy = null;
-        that.refreshHierarchy();
-
-        if ( that.onGroup ) {
-            that.onGroup()
-        }
-    }
-
-    clearFilter() {
-        const that = this;
-
-        for ( let i = 0; i < that.boundSource.length; i++ ) {
-            const row = that.boundSource[ i ];
-
-            row.$.filtered = true;
-        }
-
-        if ( that.boundHierarchy ) {
-            const filterBy = function ( hierarchy, parentItem, root ) {
-                //let filteredCount = 0;
-
-                for ( let i = 0; i < hierarchy.length; i++ ) {
-                    const item = hierarchy[ i ];
-
-                    item.$.filtered = true;
-
-                    if ( item.$.filtered ) {
-                        //filteredCount++;
-                    }
-
-                    if ( item[ 'children' ] ) {
-                        filterBy( item[ 'children' ], item, parentItem );
-                    }
-                }
-
-                if ( parentItem ) {
-                    parentItem.$.filtered = true;
-
-                    if ( root && !root.$.filtered ) {
-                        root.$.filtered = true;
-                    }
-                }
-            }
-
-            filterBy( that.boundHierarchy, null, null );
-        }
-
-        if ( that.onFilter ) {
-            that.onFilter()
-        }
-    }
-
-    clearSort() {
-        const that = this;
-
-        that._sort( that.boundSource, [], [], [] );
-    }
-
-    _sort( dataSource, sortColumns, directions, dataTypes, customSortingCallback ) {
-        const that = this;
-
-        let isObservableArray = false;
-
-        if ( dataSource.length === 0 ) {
-            return;
-        }
-
-        if ( dataSource && dataSource.constructor && dataSource instanceof JQX.ObservableArray ) {
-            isObservableArray = true;
-        }
-
-        if ( !dataSource || !( Array.isArray( dataSource ) ) || dataSource.length === 0 ||
-            !sortColumns || Array.isArray( sortColumns ) && sortColumns.length === 0 ) {
-            if ( !isObservableArray && !that.boundHierarchy ) {
-                throw new Error( 'sort: Missing or Invalid arguments!' );
-            }
-        }
-
-        if ( typeof sortColumns === 'string' ) {
-            sortColumns = [ sortColumns ];
-        }
-
-        const directionCoefficients = [],
-            compareFunctions = [];
-
-        if ( directions === undefined ) {
-            directions = [];
-        }
-
-        const getCompareFunction = function ( a, knownDataType ) {
-            // gets data type of column (not necessary if the Grid provides this information)
-            const dataType = knownDataType || typeof a;
-            let compareFunction;
-
-            switch ( dataType ) {
-                case 'string':
-                    compareFunction = new Intl.Collator().compare;
-                    break;
-                case 'number':
-                    compareFunction = function ( a, b ) {
-                        return a - b;
-                    };
-                    break;
-                case 'boolean':
-                case 'bool':
-                    compareFunction = function ( a, b ) {
-                        if ( a === b ) {
-                            return 0;
-                        }
-                        else if ( a === false ) {
-                            return -1;
-                        }
-                        else {
-                            return 1;
-                        }
-                    };
-                    break;
-                case 'date':
-                case 'time':
-                case 'dateTime':
-                    if ( a instanceof Date ) {
-                        compareFunction = function ( a, b ) {
-                            return a.getTime() - b.getTime();
-                        };
-                    }
-                    else if ( a instanceof JQX.Utilities.DateTime ||
-                        a instanceof JQX.Utilities.BigNumber ) {
-                        compareFunction = function ( a, b ) {
-                            return a.compare( b );
-                        };
-                    }
-                    break;
-                case 'object':
-                    if ( a instanceof Date ) {
-                        compareFunction = function ( a, b ) {
-                            return a.getTime() - b.getTime();
-                        };
-                    }
-                    else if ( a instanceof JQX.Utilities.DateTime ||
-                        a instanceof JQX.Utilities.BigNumber ) {
-                        compareFunction = function ( a, b ) {
-                            return a.compare( b );
-                        };
-                    }
-                    else if ( a instanceof JQX.Utilities.Complex || ( window.NIComplex && a instanceof window.NIComplex ) ) {
-                        const complexNumericProcessor = new JQX.Utilities.ComplexNumericProcessor();
-
-                        compareFunction = function ( a, b ) {
-                            return complexNumericProcessor.compareComplexNumbers( a, b );
-                        }
-                    }
-
-                    break;
-            }
-
-            return compareFunction;
-        }
-
-        for ( let i = 0; i < sortColumns.length; i++ ) {
-            if ( directions[ i ] === undefined || directions[ i ] === 'asc' || directions[ i ] === 'ascending' ) {
-                directionCoefficients[ i ] = 1;
-            }
-            else {
-                directionCoefficients[ i ] = -1;
-            }
-
-            const value = dataSource[ 0 ][ sortColumns[ i ] ];
-
-            compareFunctions[ i ] = getCompareFunction( value, dataTypes[ i ] );
-        }
-
-        if ( customSortingCallback ) {
-            customSortingCallback( dataSource, sortColumns, directions, compareFunctions );
-            return;
-        }
-
-        dataSource.sort( function ( a, b ) {
-            for ( let i = 0; i < sortColumns.length; i++ ) {
-                const result = compareFunctions[ i ]( a[ sortColumns[ i ] ], b[ sortColumns[ i ] ] );
-
-                if ( result === 0 ) {
-                    if ( sortColumns[ i + 1 ] ) {
-                        continue;
-                    }
-                    else if ( a._index !== undefined ) {
-                        // makes sorting stable
-                        return ( a._index - b._index ) * directionCoefficients[ i ];
-                    }
-
-                    return 0;
-                }
-
-                return result * directionCoefficients[ i ];
-            }
-
-            if ( sortColumns.length === 0 ) {
-                if ( a.$.index < b.$.index ) {
-                    return -1;
-                }
-
-                if ( a.$.index > b.$.index ) {
-                    return 1;
-                }
-
-                return 0;
-
-            }
-        } );
-
-        for ( let i = 0; i < dataSource.length; i++ ) {
-            that[ i ] = dataSource[ i ];
-        }
-    }
-
-    static Filter( dataSource, filterColumns, filterGroups, customFilteringCallback, operator = 'and' ) {
-        let defaultResult, operatorSpecificEval;
-
-        if ( operator === 'and' ) {
-            defaultResult = true;
-            operatorSpecificEval = function ( result, dataItem, filterColumn, filterGroup ) {
-                if ( customFilteringCallback ) {
-                    return result && customFilteringCallback( dataItem, filterColumn, filterGroup );
-                }
-
-                return result && filterGroup.evaluate( dataItem[ filterColumn ] );
-            };
-        }
-        else {
-            defaultResult = false;
-            operatorSpecificEval = function ( result, dataItem, filterColumn, filterGroup ) {
-                if ( customFilteringCallback ) {
-                    return result || customFilteringCallback( dataItem, filterColumn, filterGroup );
-                }
-
-                return result || filterGroup.evaluate( dataItem[ filterColumn ] );
-            };
-        }
-
-        const filteredData = dataSource.filter( ( dataItem ) => {
-            let result = defaultResult;
-
-            for ( let i = 0; i < filterGroups.length; i++ ) {
-                const filterGroup = filterGroups[ i ];
-                const filterColumn = filterColumns[ i ];
-
-                result = operatorSpecificEval( result, dataItem, filterColumn, filterGroup );
-            }
-
-            return result;
-        } );
-
-        return filteredData;
-    }
-
-    filter( filterColumns, filterGroups, customFilteringCallback ) {
-        JQX.ExcelAdapter.Filter( this.boundSource, filterColumns, filterGroups, customFilteringCallback );
-    }
-
-    sort( sortColumns, directions, customSortingCallback ) {
-        JQX.ExcelAdapter.Sort( this.boundSource, sortColumns, directions, customSortingCallback );
-    }
-
-    static Sort( dataSource, sortColumns, directions, customSortingCallback ) {
-        const getCompareFunction = function ( a ) {
-            // gets data type of column (not necessary if the Grid provides this information)
-            const dataType = typeof a;
-            let compareFunction;
-
-            switch ( dataType ) {
-                case 'string':
-                    compareFunction = new Intl.Collator().compare;
-                    break;
-                case 'number':
-                    compareFunction = function ( a, b ) {
-                        return a - b;
-                    };
-                    break;
-                case 'boolean':
-                    compareFunction = function ( a, b ) {
-                        if ( a === b ) {
-                            return 0;
-                        }
-                        else if ( a === false ) {
-                            return -1;
-                        }
-                        else {
-                            return 1;
-                        }
-                    };
-                    break;
-                case 'object':
-                    if ( a instanceof Date ) {
-                        compareFunction = function ( a, b ) {
-                            return a.getTime() - b.getTime();
-                        };
-                    }
-                    else if ( a instanceof JQX.Utilities.DateTime ||
-                        a instanceof BigNumberNG ) {
-                        compareFunction = function ( a, b ) {
-                            return a.compare( b );
-                        };
-                    }
-                    else if ( a instanceof JQX.Utilities.Complex || ( window.NIComplex && a instanceof window.NIComplex ) ) {
-                        const complexNumericProcessor = new JQX.Utilities.ComplexNumericProcessor();
-
-                        compareFunction = function ( a, b ) {
-                            return complexNumericProcessor.compareComplexNumbers( a, b );
-                        }
-                    }
-
-                    break;
-            }
-
-            return compareFunction;
-        }
-
-        if ( !dataSource || !( Array.isArray( dataSource ) ) || dataSource.length === 0 ||
-            !sortColumns || Array.isArray( sortColumns ) && sortColumns.length === 0 ) {
-            return;
-        }
-
-        if ( typeof sortColumns === 'string' ) {
-            sortColumns = [ sortColumns ];
-        }
-
-        const directionCoefficients = [],
-            compareFunctions = [];
-
-        if ( directions === undefined ) {
-            directions = [];
-        }
-
-        for ( let i = 0; i < sortColumns.length; i++ ) {
-            if ( directions[ i ] === undefined || directions[ i ] === 'asc' || directions[ i ] === 'ascending' ) {
-                directionCoefficients[ i ] = 1;
-            }
-            else {
-                directionCoefficients[ i ] = -1;
-            }
-
-            compareFunctions[ i ] = getCompareFunction( dataSource[ 0 ][ sortColumns[ i ] ] );
-        }
-
-        if ( customSortingCallback ) {
-            customSortingCallback( dataSource, sortColumns, directions, compareFunctions );
-            return;
-        }
-
-        const sortedData = dataSource.slice( 0 );
-
-        sortedData.sort( function ( a, b ) {
-            for ( let i = 0; i < sortColumns.length; i++ ) {
-                const result = compareFunctions[ i ]( a[ sortColumns[ i ] ], b[ sortColumns[ i ] ] );
-
-                if ( result === 0 ) {
-                    if ( sortColumns[ i + 1 ] ) {
-                        continue;
-                    }
-                    else if ( a._index !== undefined ) {
-                        // makes sorting stable
-                        return ( a._index - b._index ) * directionCoefficients[ i ];
-                    }
-
-                    return 0;
-                }
-
-                return result * directionCoefficients[ i ];
-            }
-        } );
-
-        return sortedData;
-    }
-}
-
-window.jqxDataSource = DataAdapter;
-
-class Ajax {
-    constructor ( config, callback ) {
-        const that = this;
-
-        that.config = config;
-        that.callback = callback;
-
-        if ( config.autoFetch === false ) {
-            return;
-        }
-
-        that.call( config );
-    }
-
-    call( config ) {
-        const that = this;
-
-        if ( !config ) {
-            config = that.config;
-        }
-
-        let method = 'GET',
-            url = config.url,
-            body = null,
-            async = true;
-
-        if ( config.type ) {
-            method = config.type;
-        }
-
-        if ( config.data ) {
-            if ( method === 'GET' ) {
-                url += '?';
-
-                for ( let prop in config.data ) {
-                    if ( config.data.hasOwnProperty( prop ) ) {
-                        url += encodeURI( prop + '=' + config.data[ prop ] + '&' );
-                    }
-                }
-
-                if ( url.charAt( url.length - 1 ) === '&' ) {
-                    url = url.slice( 0, url.length - 1 );
-                }
-            }
-            else if ( method === 'POST' ) {
-                body = JSON.stringify( config.data );
-            }
-        }
-
-        if ( config && config.async === false && config.dataSourceType !== 'xlsx' ) {
-            async = false;
-        }
-
-        if ( window.fetch !== undefined && async ) {
-            that.ajaxFetch( config, method, url, body );
-        }
-        else {
-            that.ajaxXMLHttpRequest( config, method, url, body, async );
-        }
-    }
-
-    ajaxFetch( config, method, url, body ) {
-        // prepare fetch config
-        const that = this;
-        const fetchInit = { method: method };
-        let parseMethod;
-
-        switch ( config.dataSourceType ) {
-            case 'json':
-                parseMethod = 'json';
-                break;
-            case 'xlsx':
-                parseMethod = 'arrayBuffer';
-                break;
-            default:
-                parseMethod = 'text';
-        }
-
-        if ( config ) {
-            if ( config.contentType ) {
-                fetchInit.headers = new Headers( {
-                    'Content-Type': config.contentType
-                } );
-            }
-        }
-
-        if ( body !== null ) {
-            fetchInit.body = body;
-        }
-
-        let status, fetchTimeout, timeouted;
-
-        if ( config.timeout ) {
-            fetchTimeout = setTimeout( function () {
-                timeouted = true;
-            }, config.timeout );
-        }
-
-        if ( config.beforeSend ) {
-            const beforeSendResult = config.beforeSend( fetchInit, config );
-
-            if ( beforeSendResult === false ) {
-                return;
-            }
-        }
-
-        // fetch resource
-        fetch( url, fetchInit )
-            .then( function ( response ) {
-                if ( timeouted ) {
-                    status = 408;
-                    throw new Error( 'timeout' );
-                }
-
-                if ( fetchTimeout ) {
-                    clearTimeout( fetchTimeout );
-                }
-
-                status = response.status;
-
-                if ( !response.ok ) {
-                    throw new Error( response.statusText );
-                }
-
-                return response[ parseMethod ]();
-            } )
-            .then( function ( data ) {
-                if ( parseMethod === 'arrayBuffer' ) {
-                    return JSZip.loadAsync( data ).then( function ( zipData ) {
-                        // "data" represents the whole XLSX/ZIP file
-                        return zipData.files[ 'xl/worksheets/sheet1.xml' ].async( 'text' ).then( function ( sheet1 ) {
-                            return zipData.files[ 'xl/sharedStrings.xml' ].async( 'text' ).then( function ( sharedStrings ) {
-                                const parsedData = that.parseXLSXData( sheet1, sharedStrings );
-
-                                that.ajaxComplete( config, parsedData, status );
-                            } );
-                        } );
-                    } );
-                }
-                else {
-                    that.ajaxComplete( config, data, status );
-                }
-            } )
-            .catch( function ( error ) {
-                if ( error.message === 'JSZip is not defined' ) {
-                    error.message = 'JSZip is not defined. Please include a reference to JSZip to be able to load data from XLSX files.';
-                }
-
-                if ( config && config.loadError ) {
-                    config.loadError( status, error );
-                }
-
-                if ( that.callback ) {
-                    that.callback( error, status );
-                }
-            } );
-    }
-
-    ajaxXMLHttpRequest( config, method, url, body, async ) {
-        const request = new XMLHttpRequest();
-        const that = this;
-
-        request.open( method, url, async );
-
-        request.ontimeout = function () {
-            if ( config && config.loadError ) {
-                config.loadError( 408, 'timeout' );
-            }
-        };
-
-        request.onload = function () {
-            if ( request.readyState === 4 ) {
-                const status = request.status;
-                let data = request.response;
-
-                if ( status >= 200 && status <= 299 ) {
-                    if ( config.dataSourceType === 'json' ) {
-                        data = JSON.parse( data );
-                    }
-
-                    that.ajaxComplete( config, data, status );
-                }
-                else if ( config && config.loadError ) {
-                    config.loadError( status, data );
-                }
-            }
-        };
-
-        request.onerror = function () {
-            if ( config && config.loadError ) {
-                config.loadError( request.status, request.response );
-            }
-        };
-
-        if ( config && config.contentType ) {
-            request.setRequestHeader( 'Content-Type', config.contentType );
-        }
-
-        if ( async && config.timeout ) {
-            request.timeout = config.timeout;
-        }
-
-        if ( config.beforeSend ) {
-            const beforeSendResult = config.beforeSend( request, config );
-
-            if ( beforeSendResult === false ) {
-                return;
-            }
-        }
-
-        request.send( body );
-    }
-
-    ajaxComplete( config, data, status ) {
-        if ( !config ) {
-            return;
-        }
-
-        if ( config.beforeLoadComplete ) {
-            const processedData = config.beforeLoadComplete( data );
-
-            if ( processedData ) {
-                data = processedData;
-            }
-        }
-
-        if ( config.loadComplete ) {
-            config.loadComplete( data, status );
-        }
-
-        if ( this.callback ) {
-            this.callback( data, status );
-        }
-    }
-
-    parseXLSXData( sheet1, sharedStrings ) {
-        const parser = new DOMParser(),
-            sharedStringsDocument = parser.parseFromString( sharedStrings, 'text/xml' ),
-            sharedStringsContainers = Array.from( sharedStringsDocument.getElementsByTagName( 'si' ) ),
-            sharedStringsCollection = [],
-            sheet1Document = parser.parseFromString( sheet1, 'text/xml' ),
-            rows = Array.from( sheet1Document.getElementsByTagName( 'row' ) ),
-            parsedData = [];
-
-        sharedStringsContainers.forEach( function ( si ) {
-            let texts = si.getElementsByTagName( 't' );
-
-            if ( texts.length === 1 ) {
-                sharedStringsCollection.push( texts[ 0 ].innerHTML );
-            }
-            else {
-                let text = '';
-
-                texts = Array.from( texts );
-                texts.forEach( function ( t ) {
-                    text += t.innerHTML;
-                } );
-                sharedStringsCollection.push( text );
-            }
-        } );
-
-        rows.forEach( function ( row ) {
-            const rowObject = {},
-                cells = Array.from( row.getElementsByTagName( 'c' ) );
-
-            cells.forEach( function ( cell/*, index*/ ) {
-                const column = cell.getAttribute( 'r' ).match( /\D+/ )[ 0 ],
-                    type = cell.getAttribute( 't' ),
-                    xmlValue = cell.getElementsByTagName( 'v' )[ 0 ].innerHTML;
-                let value;
-
-                switch ( type ) {
-                    case 's':
-                        // string
-                        value = sharedStringsCollection[ parseFloat( xmlValue ) ];
-                        break;
-                    case 'b':
-                        // boolean
-                        value = parseFloat( xmlValue ) === 1;
-                        break;
-                    default:
-                        // number or date
-                        value = parseFloat( xmlValue );
-                }
-
-                rowObject[ column ] = value;
-            } );
-
-            parsedData.push( rowObject );
-        } );
-
-        return parsedData;
-    }
-}
-if ($.jqx && $.jqx.dataAdapter) {
-    $.jqx.dataAdapter.Importer = DataAdapter;
-}
-})(jqxBaseFramework);

mercurial