{"version":3,"file":"kendo.pivotgrid.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendopivotgrid","js","this","Navigation","constructor","options","tabIndex","root","eventHandlers","update","elements","Array","from","querySelectorAll","selectors","join","first","querySelector","last","all","length","current","find","el","matches","start","eventType","mouseEvents","ev","target","Element","closest","call","undefined","addEventListener","keyboardEvents","key","stop","removeEventListener","focusElement","element","previous","removeAttribute","classList","remove","setAttribute","String","focus","preventScroll","scrollableValuesSel","scrollableColumnHeaderSel","scrollableRowHeaderSel","emptyCellSel","tableSel","cellSel","scrollables","selectors$1","onEnter","nav","icon","index","indexOf","click","preventDefault","tryScrollLeft","scrollable","elToScroll","offsetLeft","scrollLeft","tryScrollRight","offsetWidth","tryScrollUp","scrollTop","offsetTop","tryScrollDown","offsetHeight","scrollTo","scrollFunc","forEach","scroll","tableMap","table","rows","colsCount","cells","map","c","colSpan","reduce","prev","cur","row","r","curColSpan","colSp","rowSp","rowSpan","ind","findIndex","val","curInd","navigationMap","columnHeader","rowHeader","values","emptyCell","emptyCellRow","fill","i","push","concat","ctrlKey","metaKey","cellAt","pos","targetPos","getTargetPos","nextPos","next","keyboardEvents$1","keydown","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","o","_target","_ev","nextElementSibling","HTMLElement","parentNode","setTimeout","confHeader","Enter","Space","Home","ro","Boolean","x","End","mouseEvents$1","hasAttribute","PivotGridNavigation","super","arguments","$","undefined$1","kendo","window","ui","encode","htmlEncode","Class","Comparer","data","Widget","DataSource","outerWidth","_outerWidth","outerHeight","_outerHeight","common","pivotgrid","fetchDiscover","normalizeFilter","Query","normalizeSort","toString","identity","extend","keys","isFunction","fetchData","createLocalDataState","createDataTree","sumAggregate","averageAggregate","minAggregate","maxAggregate","createDataState","toColumns","toRows","toTree","toData","headersReducer","RESIZE","READ","CHANGE","ERROR","PROGRESS","MEASURES","STATERESET","AUTO","DIV","NS","ROW_TOTAL_KEY","DATABINDING","DATABOUND","EXPANDMEMBER","HEADERTEMPLATE","id","headerClass","colspan","rowspan","expandable","iconClass","role","expanded","COLLAPSEMEMBER","STATE_EXPANDED_ICONNAME","STATE_EXPANDED_SELECTOR","STATE_COLLAPSED_ICONNAME","HEADER_TEMPLATE","member","caption","name","PIVOTGRID_TREND_ICONS_MAP","KPISTATUS_TEMPLATE","dataItem","value","KPITREND_TEMPLATE","DATACELL_TEMPLATE","fmtValue","tableStyles","normalizeMeasures","measure","descriptor","descriptors","d","type","normalizeMembers","expand","slice","normalizeName","accumulateMembers","accumulator","rootTuple","tuple","level","idx","children","members","stringify","buildPath","descriptorsForAxes","tuples","result","k","JSON","parse","descriptorsForMembers","axis","measures","firstTuple","tupleMembers","found","j","getName","hierarchy","addMissingPathMembers","tupletoSearch","findExistingTuple","tupleToDescriptors","createAggregateGetter","m","measureGetter","getter","field","aggregatorContext","state","aggregate","isNumber","isNaN","isDate","getTime","loadLocalData","params","deferred","that","originalData","reader","_pristineData","columnSettings","_createSettings","columnAxes","rowSettings","rowAxes","stateArgs","dataTree","dataField","columnsData","filter","item","reverse","fields","sort","flattenSortDescriptors","_saveState","trigger","resolve","dir","split","pop","createLocalMeasure","format","measureMap","sum","average","min","max","bind","uniqueName","functions","count","PivotCubeBuilder","init","dimensions","_normalizeDescriptors","keyField","_rootTuples","rootNames","measureAggregators","parts","aggregatorsLength","dimensionsSchema","measureIdx","rootNamesLength","levelName","levelNum","hasChildren","parentName","_sortMap","sortDescriptors","flattenTree","mapItem","sortedMaps","sortTree","directParentName","fillSortTree","sortItemsTree","create","flatColumns","_expandedTuples","currentKeys","memberInfo","expandedNames","accumulatorKeys","isEmptyObject","_findExpandedMember","uniquePath","names","expandedIdx","_asTuples","rootInfo","expandedInfo","apply","_measuresInfo","rowAxis","aggregateNames","resultFuncs","formats","_toDataArray","measuresInfo","rowKeys","columnKeys","aggregates","n","column","columnKey","columnMeasureNames","rowMeasureNamesLength","rowMeasureNames","rowLength","columnLength","items","_addData","resultFunc","ordinal","_matchDescriptors","getters","parentField","expectedValue","_calculateAggregate","totalItem","aggregator","_processColumns","columns","rowTotal","updateColumn","path","columnIndex","childrenMap","_measureAggregators","defaultAggregate","measureDescriptors","aggregators","toLowerCase","Error","_buildGetters","_parseDescriptors","parsedDescriptors","parseDescriptors","getRootNames","mapNames","_filter","expr","filters","operator","_normalizeFilter","logic","process","measuresRowAxis","measuresAxis","columnDescriptors","rowDescriptors","rowValue","rowIdx","rowDescriptor","rowName","columnsInfo","rowsInfo","aggregatedData","columnGetters","rowGetters","processed","expandedColumns","expandedRows","hasExpandedRows","axes","PivotTransport","transport","discover","read","destroy","success","catalog","connection","cube","PivotDataSourceV2","schema","cubes","catalogs","hierarchies","levels","cubeSchema","_cubeSchema","fn","transportOptions","_online","XmlaTransportV2","_columns","_rows","_measuresAxis","_measures","serverSorting","serverPaging","serverFiltering","serverGrouping","serverAggregates","normalizeAxis","_mergeState","fetch","callback","_data","_query","done","settings","dimensionsSettings","displayValueFunc","sortValueFunc","displayValue","sortValue","defaultHierarchy","restoreMeasure","memberType","distinct","levelUniqueName","childrenCardinality","isPrevented","_params","Deferred","newDataState","response","_preventRefresh","error","err","promise","measureAxes","schemaMeasures","command","restrictions","catalogName","cubeName","schemaKPIs","schemaDimensions","schemaHierarchies","dimensionName","dimensionUniqueName","schemaLevels","hierarchyName","hierarchyUniqueName","schemaCubes","schemaCatalogs","schemaMembers","_columnTuples","_rowTuples","_view","PivotDataSource","cubeBuilder","_skipNormalize","_axes","memberUniqueName","schemaData","dataGetter","_rawData","treeOp","_clearAxesData","query","rowsAxisDescriptors","columnsAxisDescriptors","_expandPath","origin","other","memberToExpand","_lastExpanded","_descriptorsForAxis","_process","e","page","pageSize","group","_updateLocalData","expandColumn","expandRow","_processResult","processedData","_requestData","columnIndexes","rowIndexes","resultAxis","axisToSkip","hasColumnTuples","_rowMeasures","_normalizeTuples","_columnMeasures","_normalizeData","columnsLength","rowsLength","validateAxis","sourceTuples","targetTuples","columnIdx","dataIdx","targetColumnsLength","membersCount","measuresLength","tupleIndex","adjustDataByColumn","adjustDataByRow","_mergeAxes","_readData","newData","_createTuple","buildRoot","Number","_hasRoot","source","isRoot","sourceAxes","startIndex","columnMeasures","rowMeasures","oldRowsLength","newRowsLength","oldColumnsLength","newColumnsLength","rowIndex","dataIndex","calcIndex","indices","buildDataIndices","Math","prepareDataOnColumns","parseSource","mergedColumns","mergeTuples","targetIndex","sourceIndex","parseInt","prepareDataOnRows","mergedRows","findDataIndex","parsedRoot","memberIndex","offset","_mergeColumnData","_mergeRowData","toAdd","toJSON","drop","splice","_observe","_ranges","_addRange","_total","_pristineTotal","memberIdx","roots","indexes","tupleName","_addMissingDataItems","metadata","addEmptyDataItem","_normalizeOrdinals","lastOrdinal","converter","_handleCustomErrors","status","reject","kpis","sortFunction","currentItem","newAxis","collection","queue","shift","counter","targetMembers","sourceMembers","equalTuples","second","equal","toFind","membersLength","addMembers","len","findParentMember","parentMember","parentPath","normalizeTupleMeasures","measureIndex","measurePosition","spliceIndex","baseHierarchyPath","memberName","expandMemberDescriptor","sortDescriptor","sortDescriptorForMember","crossJoin","crossJoinCommand","tmp","measureNames","rootName","rootLength","l","child","serializeMembers","crossJoinCommands","dataSource","filterFunctionFormats","contains","doesnotcontain","startswith","endswith","eq","neq","serializeExpression","expression","serializeOptions","parentTagName","capitalize","replace","toUpperCase","xmlaDiscoverCommands","convertersMap","serializeFilters","properties","Catalog","XmlaTransport","RemoteTransport","originalOptions","url","setup","dataType","contentType","parameterMap","ajax","fetchOptions","noop","then","catch","asArray","object","translateAxis","captionGetter","unameGetter","levelNameGetter","levelNumGetter","childrenGetter","hierarchyGetter","parentNameGetter","Member","schemaDataReaderMap","description","groupName","displayFolder","defaultFormat","goal","trend","statusGraphic","trendGraphic","defaultMember","orderingProperty","xmlaReaderMethods","XmlaDataReader","XmlDataReader","_extend","methodName","option","xml","errors","fault","faultstring","faultcode","ordinalGetter","valueGetter","fmtValueGetter","_mapSchema","obj","transports","xmla","readers","removeExpr","expressions","PivotSettingTarget","addClass","_refreshHandler","refresh","template","actions","enabled","ns","emptyTemplate","_sortable","on","action","attr","hasClass","sortable","sortDirection","currentTarget","filterable","fieldMenu","PivotFieldMenu","messages","setting","empty","setDataSource","unbind","kendoSortable","connectWith","hint","cursor","change","add","move","newIndex","_isKPI","validate","isMeasure","isArray","sortExpressions","_sort","skipExpr","allowUnsort","html","sortIcon","_sortIcon","off","sortExpr","PivotSettingTargetV2","parent","text","navigatable","chip","keyCode","DELETE","BACKSPACE","configuratorNavigation","DOWN","altKey","shiftKey","LEFT","RIGHT","UP","otherTarget","PivotFieldMenuV2","events","_applyState","_sortState","_stateFilter","_savedState","_cancelChanges","deepExtend","_initialState","_redraw","_state","newState","modifyInit","blur","_savedFilter","_emptyState","enable","removeClass","_targetsHTML","menuenabled","PivotConfiguratorButton","_element","_attachEvents","configurator","setOptions","toggle","pivot","pivotEl","toggleClass","getKendoPivotGridV2","_setContentWidth","_updateDimensions","PivotContainer","_addClasses","configuratorPosition","className","PivotGridV2","_dataSource","_bindConfigurator","_ariaId","guid","_wrapper","_columnHeadersWrapper","_rowHeadersWrapper","_contentWrapper","wrapper","append","_columnBuilder","ColumnRowBuilder","columnHeaderTemplate","ariaId","_rowBuilder","rowHeaderTemplate","_contentBuilder","ContentBuilderV2","dataCellTemplate","_scrollable","button","is","isRow","paths","eventName","reducerPayLoad","payload","tree","getTree","currentAxes","newHeaders","autoBind","_aria","_initPivotGridNavigation","notify","height","columnWidth","emptyCellLabel","_windowResizeHandler","navigation","firstCell","_matchAriaAttributes","rowHeaderRows","rowHeaderCols","acc","curr","getAttribute","colHeaderRows","colHeaderCells","valueTableCells","firstColHeadersRow","firstColHeaderRowCellsIds","valueCellsIds","filterAndMap","idParts","cell","cellColIndex","colHeaderCellsIds","headerCellColIndex","headerCellColspan","arr","predicate","mapper","_progressHandler","_errorHandler","_requestStart","_error","_resize","div","scrollbar","style","setProperty","document","createElement","cssText","innerHTML","body","appendChild","scrollWidth","removeChild","columnsHeader","rowsHeader","_wheelScroll","delta","wheelDeltaY","one","css","_progress","progress","contentTable","columnTable","rowTable","width","kendoPivotConfiguratorV2","cellInfoByElement","cellInfo","contentBuilder","columnsCount","rowsCount","columnTuple","hash","rowTuple","lastFocusedCellID","_activeElement","lastCellIdWithTabIndex","setTuples","build","setRowColumnInfo","columnHeaderLeafs","getHeaderLeafs","rowHeaderLeafs","columnHeaderBreadth","getBreadth","rowHeaderDepth","plugin","PivotGrid","columnBuilder","rowBuilder","support","isRtl","_createLayout","ColumnBuilder","RowBuilder","ContentBuilder","_templates","builder","eventArgs","parseJSON","request","childrenLoaded","maxChildren","reorderable","kpiStatusTemplate","kpiTrendTemplate","measureFields","columnFields","rowFields","columnTemplate","rowTemplate","dataTemplate","useWithBlock","kendoPivotConfigurator","columnInfo","rowInfo","view","measuresTarget","rowsTarget","columnsTarget","clearTimeout","_headerReflowTimeout","_stateResetHandler","_stateReset","reset","_measureFields","_createSettingTarget","pivotOptions","getIcons","_initSettingTargets","layoutTable","leftContainer","rightContainer","gridWrapper","wrap","content","columnsHeaderTree","dom","Tree","rowsHeaderTree","contentTree","firstChild","_setSectionsWidth","_setSectionsHeight","_setContentHeight","_columnHeaderReflow","browser","mozilla","leftColumn","measureFieldsHeight","columnFieldsHeight","rowFieldsHeight","innerHeight","columnsHeight","padding","firstRowHeight","secondRowHeight","calculatedWidth","minWidth","ceil","_resetColspan","skipScrollbar","clientHeight","_colspan","_layoutTimeout","_axisMeasures","hasMeasure","columnAxis","render","_indexes","touchScroller","contentResized","movable","sender","y","htmlNode","createMetadata","maxMembers","addColElements","addRowElements","addColumCell","rowEl","rowItem","cellEl","total","headerTemplate","columnHeaderRows","treeData","headerRows","headerLeafs","breadth","rowHeaderBreadth","_tree","_breadth","_headerLeafs","tbody","_tbody","colgroup","_colGroup","_rowLength","_buildRows","_normalize","cellsLength","cellIdx","tupleAll","_rowIndex","_row","parentRow","rowKey","notFirst","collapsed","measureRow","_cell","_content","childRow","childrenLength","allCell","nextMember","cellChildren","memberCollapsed","rootLevelNum","cellIconEl","maxcolSpan","allRow","firstMemberName","tuplePath","hasChild","axisInfo","axisInfoMember","skipChildren","firstEmpty","_buildRow","templateInfo","cellContent","startIdx","PivotExcelExporter","widget","columnHeaderTable","rowHeaderTable","columnHeaderLength","rowHeaderLength","autoWidth","_cells","background","color","contentRows","columnRows","rowRows","_freezePane","colSplit","rowSplit","workbook","sheets","freezePane","PivotExcelMixin","proto","excel","saveAsExcel","proxyURL","fileName","book","ooxml","Workbook","toDataURLAsync","dataURI","saveAs","forceProxy","prototype","PDFMixin","_drawPDF","_drawPDFShadow","avoidLinks","pdf","jQuery"],"sources":["kendo.pivotgrid.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.pivot.common.js'), require('kendo.dom.js'), require('kendo.data.js'), require('kendo.icons.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.pivot.common', 'kendo.dom', 'kendo.data', 'kendo.icons'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendopivotgrid = global.kendopivotgrid || {}, global.kendopivotgrid.js = factory()));\n})(this, (function () {\n class Navigation {\n constructor(options) {\n this.tabIndex = 0;\n this.root = null;\n this.eventHandlers = {};\n this.update = () => { };\n this.tabIndex = options.tabIndex;\n }\n get elements() {\n return this.root ? Array.from(this.root.querySelectorAll(this.selectors.join(','))) : [];\n }\n get first() {\n return (this.root && this.root.querySelector(this.selectors.join(','))) || null;\n }\n get last() {\n const all = this.elements;\n return all[all.length - 1] || null;\n }\n get current() {\n return this.elements.find(el => el.matches(':focus'));\n }\n start(root) {\n this.root = root;\n for (const eventType in this.mouseEvents) {\n if (this.mouseEvents[eventType]) {\n this.eventHandlers[eventType] = (ev => {\n const target = ev.target instanceof Element && ev.target.closest(this.selectors.join(','));\n if (target) {\n this.mouseEvents[eventType].call(undefined, target, this, ev);\n }\n });\n root.addEventListener(eventType, this.eventHandlers[eventType]);\n }\n }\n for (const eventType in this.keyboardEvents) {\n if (this.keyboardEvents[eventType]) {\n this.eventHandlers[eventType] = (ev => {\n const target = ev.target instanceof Element && ev.target.closest(this.selectors.join(','));\n const key = ev.key === ' ' ? 'Space' : ev.key;\n if (target && this.keyboardEvents[eventType][key]) {\n this.keyboardEvents[eventType][key].call(undefined, target, this, ev);\n }\n });\n root.addEventListener(eventType, this.eventHandlers[eventType]);\n }\n }\n }\n stop() {\n if (this.root) {\n for (const eventType in this.eventHandlers) {\n if (this.eventHandlers[eventType]) {\n this.root.removeEventListener(eventType, this.eventHandlers[eventType]);\n }\n }\n }\n this.root = null;\n }\n focusElement(element, previous) {\n if (element) {\n if (previous) {\n previous.removeAttribute('tabindex');\n previous.classList.remove('k-focus');\n }\n element.setAttribute('tabindex', String(this.tabIndex));\n element.focus({ preventScroll: true });\n }\n }\n }\n\n const scrollableValuesSel = '.k-pivotgrid .k-pivotgrid-values';\n const scrollableColumnHeaderSel = '.k-pivotgrid .k-pivotgrid-column-headers';\n const scrollableRowHeaderSel = '.k-pivotgrid .k-pivotgrid-row-headers';\n const emptyCellSel = '.k-pivotgrid > .k-pivotgrid-empty-cell';\n const tableSel = 'table.k-pivotgrid-table';\n const cellSel = '.k-pivotgrid-cell';\n const scrollables = [scrollableValuesSel, scrollableColumnHeaderSel, scrollableRowHeaderSel].join(',');\n const selectors$1 = [\n emptyCellSel,\n [scrollableColumnHeaderSel, tableSel, cellSel].join(' '),\n [scrollableRowHeaderSel, tableSel, cellSel].join(' '),\n [scrollableValuesSel, tableSel, cellSel].join(' ')\n ];\n const onEnter = (target, nav, ev) => {\n const icon = target.querySelector('.k-icon, .k-svg-icon');\n if (icon) {\n const index = nav.elements.indexOf(target);\n nav.update = () => {\n nav.focusElement(nav.elements[index], null);\n nav.update = () => { };\n };\n icon.click();\n ev.preventDefault();\n }\n };\n const tryScrollLeft = (target, scrollable, elToScroll) => {\n if (target.offsetLeft < scrollable.scrollLeft) {\n elToScroll.scrollLeft = target.offsetLeft;\n }\n };\n const tryScrollRight = (target, scrollable, elToScroll) => {\n if (target.offsetLeft + target.offsetWidth > scrollable.scrollLeft + scrollable.offsetWidth &&\n target.offsetWidth < scrollable.offsetWidth) {\n elToScroll.scrollLeft = target.offsetLeft + target.offsetWidth - scrollable.offsetWidth;\n }\n };\n const tryScrollUp = (target, scrollable, elToScroll) => {\n if (scrollable.scrollTop && target.offsetTop < scrollable.scrollTop) {\n elToScroll.scrollTop = target.offsetTop;\n }\n };\n const tryScrollDown = (target, scrollable, elToScroll) => {\n if (target.offsetTop + target.offsetHeight > scrollable.scrollTop + scrollable.offsetHeight &&\n target.offsetHeight < scrollable.offsetHeight) {\n elToScroll.scrollTop = target.offsetTop + target.offsetHeight - scrollable.offsetHeight;\n }\n };\n const scrollTo = (target, root, scrollFunc) => {\n const elToScroll = root.querySelector(scrollableValuesSel);\n const scrollable = target && target.closest(scrollables);\n if (!elToScroll || !scrollable || !target) {\n return;\n }\n scrollFunc.forEach(scroll => scroll(target, scrollable, elToScroll));\n };\n const tableMap = (table) => {\n const rows = Array.from(table.rows);\n const colsCount = Array.from((rows && rows[0] && rows[0].cells) || [])\n .map(c => c.colSpan)\n .reduce((prev, cur) => prev + cur, 0);\n const map = rows.map(() => new Array(colsCount));\n rows.forEach((row, r) => {\n let curColSpan = 0;\n Array.from(row.cells).forEach((c) => {\n for (let colSp = 0; colSp < c.colSpan; colSp++) {\n for (let rowSp = 0; rowSp < c.rowSpan; rowSp++) {\n const ind = map[r + rowSp].findIndex((val, curInd) => curInd >= curColSpan && !val);\n map[r + rowSp][ind] = c;\n }\n curColSpan++;\n }\n });\n });\n return map;\n };\n const navigationMap = (root) => {\n const columnHeader = tableMap(root.querySelector([scrollableColumnHeaderSel, tableSel].join(' ')));\n const rowHeader = tableMap(root.querySelector([scrollableRowHeaderSel, tableSel].join(' ')));\n const values = tableMap(root.querySelector([scrollableValuesSel, tableSel].join(' ')));\n const emptyCell = root.querySelector(emptyCellSel);\n const emptyCellRow = new Array(rowHeader[0].length).fill(emptyCell);\n const map = [];\n for (let i = 0; i < columnHeader.length; i++) {\n map.push(emptyCellRow.concat(columnHeader[i]));\n }\n for (let i = 0; i < rowHeader.length; i++) {\n map.push(rowHeader[i].concat(values[i]));\n }\n return map;\n };\n const getTargetPos = (map, target) => {\n for (let r = 0; r < map.length; r++) {\n for (let c = 0; c < map[r].length; c++) {\n if (map[r][c] === target) {\n return [r, c];\n }\n }\n }\n return [-1, -1];\n };\n const ctrlKey = (ev) => ev.ctrlKey || ev.metaKey;\n const cellAt = (root, target, pos) => {\n const map = navigationMap(root);\n let targetPos = getTargetPos(map, target);\n let nextPos = [targetPos[0] + pos[0], targetPos[1] + pos[1]];\n let next = map[nextPos[0]] && map[nextPos[0]][nextPos[1]];\n while (next && next === target) {\n nextPos = [nextPos[0] + pos[0], nextPos[1] + pos[1]];\n next = map[nextPos[0]] && map[nextPos[0]][nextPos[1]];\n }\n return next;\n };\n const keyboardEvents$1 = {\n keydown: {\n ArrowLeft: (target, nav, ev) => {\n ev.preventDefault();\n const next = cellAt(nav.root, target, [0, -1]);\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollRight, tryScrollLeft, tryScrollDown, tryScrollUp]);\n },\n ArrowRight: (target, nav, ev) => {\n ev.preventDefault();\n const next = cellAt(nav.root, target, [0, 1]);\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollLeft, tryScrollRight, tryScrollDown, tryScrollUp]);\n },\n ArrowUp: (target, nav, ev) => {\n ev.preventDefault();\n const next = cellAt(nav.root, target, [-1, 0]);\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollRight, tryScrollLeft, tryScrollDown, tryScrollUp]);\n },\n ArrowDown: (target, nav, ev) => {\n ev.preventDefault();\n const next = cellAt(nav.root, target, [1, 0]);\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollRight, tryScrollLeft, tryScrollUp, tryScrollDown]);\n },\n o: (_target, nav, _ev) => {\n if (!nav.root) {\n return;\n }\n // FIX: ADDED manually to fix an issue where depending on the order of the config element and button\n // you either can open the configurator with Ctrl+O, or you can close the configurator with ESC\n let next = nav.root.nextElementSibling;\n if (!(next && next instanceof HTMLElement)) {\n return;\n }\n\n if (!next.matches('div.k-pivotgrid-configurator-button')) {\n next = next.nextElementSibling;\n }\n\n if (next && next instanceof HTMLElement && next.matches('div.k-pivotgrid-configurator-button')) {\n if (!nav.root.parentNode || nav.root.parentNode.querySelector(\".k-pivotgrid-configurator.k-hidden\")) {\n next.click();\n }\n\n setTimeout(() => {\n if (nav.root.parentNode) {\n const confHeader = nav.root.parentNode.querySelector('.k-pivotgrid-configurator-content .k-form-field .k-fields-list-wrapper .k-treeview');\n if (confHeader instanceof HTMLElement) {\n confHeader.setAttribute('tabindex', String(nav.tabIndex));\n confHeader.focus();\n }\n }\n }, 0);\n }\n },\n Enter: onEnter,\n Space: onEnter,\n Home: (target, nav, ev) => {\n const map = navigationMap(nav.root);\n const ctrl = ctrlKey(ev);\n let row = ctrl ? map[0] : (map.find(ro => Boolean(ro.find(x => x === target))) || []);\n let next = row[0];\n if (next) {\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollRight, tryScrollLeft, tryScrollDown, tryScrollUp]);\n ev.preventDefault();\n }\n },\n End: (target, nav, ev) => {\n const map = navigationMap(nav.root);\n const ctrl = ctrlKey(ev);\n let row = ctrl ? map[map.length - 1] : (map.find(ro => Boolean(ro.find(x => x === target))) || []);\n let next = row && row[row.length - 1] || null;\n if (next) {\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollLeft, tryScrollRight, tryScrollUp, tryScrollDown]);\n ev.preventDefault();\n }\n }\n }\n };\n const mouseEvents$1 = {\n click: (target, nav) => {\n if (target && target instanceof HTMLElement) {\n const prev = nav.elements.find(c => c.hasAttribute('tabindex')) || null;\n nav.focusElement(target, prev);\n }\n }\n };\n /**\n * The PivotGrid keyboard navigation functionality.\n *\n * Usage:\n *\n * On Initialize\n * const navigation = new PivotGridNavigation({ tabindex: 0 });\n *\n * Turn on\n * navigation.start(rootDomElement);\n *\n * On After Update\n * navigation.update();\n *\n * On Destroy / Turn off\n * navigation.stop();\n */\n class PivotGridNavigation extends Navigation {\n constructor() {\n super(...arguments);\n this.selectors = selectors$1;\n this.mouseEvents = mouseEvents$1;\n this.keyboardEvents = keyboardEvents$1;\n }\n }\n\n const selectors = [\n '.k-pivotgrid-configurator-content .k-form-field .k-fields-list-wrapper .k-treeview',\n '.k-pivotgrid-configurator-content .k-chip',\n '.k-pivotgrid-configurator-actions button'\n ];\n const onEscape = (_target, nav, ev) => {\n if (ev.target instanceof HTMLElement) {\n if (nav.root) {\n const pivot = nav.root.previousElementSibling;\n const confButton = nav.root.nextElementSibling;\n const pivotCell = Array.from(pivot instanceof HTMLElement ? pivot.querySelectorAll('[tabindex]') : []).find((c) => c.tabIndex >= 0);\n if (pivotCell instanceof HTMLElement) {\n pivotCell.focus();\n if (confButton instanceof HTMLElement) {\n confButton.click();\n }\n }\n }\n }\n };\n const navigate = (target, nav, ev, dir) => {\n ev.preventDefault();\n const all = nav.elements;\n let index = all.indexOf(target) + dir;\n if (index < 0) {\n index = all.length - 1;\n }\n nav.focusElement(all[index % all.length], target);\n };\n const onDelete = (target, nav, ev) => {\n if (ev.target instanceof HTMLElement) {\n const deleteButton = ev.target.querySelector('.k-icon.k-i-x-circle, .k-svg-icon.k-svg-i-x-circle');\n if (deleteButton instanceof HTMLElement) {\n ev.preventDefault();\n navigate(target, nav, ev, -1);\n }\n }\n };\n const keyboardEvents = {\n keydown: {\n Tab: (target, nav, ev) => {\n navigate(target, nav, ev, ev.shiftKey ? -1 : 1);\n },\n Escape: onEscape,\n Delete: onDelete,\n Backspace: onDelete\n }\n };\n const mouseEvents = {\n click: (target, nav) => {\n if (target && target instanceof HTMLElement) {\n const prev = nav.elements.find((c) => c.hasAttribute('tabindex')) || null;\n nav.focusElement(target, prev);\n }\n }\n };\n /**\n * The PivotGrid Configurator keyboard navigation functionality.\n *\n * Usage:\n *\n * On Initialize\n * const navigation = new ConfiguratorNavigation({ tabindex: 0 });\n *\n * Turn on\n * navigation.start(rootDomElement);\n *\n * On After Update\n * navigation.update();\n *\n * On Destroy / Turn off\n * navigation.stop();\n */\n class ConfiguratorNavigation extends Navigation {\n constructor() {\n super(...arguments);\n this.selectors = selectors;\n this.mouseEvents = mouseEvents;\n this.keyboardEvents = keyboardEvents;\n }\n }\n\n var __meta__ = {\n id: \"pivotgrid\",\n name: \"PivotGrid\",\n category: \"web\",\n description: \"The PivotGrid widget is a data summarization tool.\",\n depends: [ \"dom\", \"data\", \"data.xml\", \"sortable\", \"pivot.common\", \"icons\" ],\n features: [{\n id: \"pivotgrid-configurator\",\n name: \"Configurator\",\n description: \"The PivotConfigurator widget allows the user to select data slices displayed in PivotGrid\",\n depends: [ \"pivot.configurator\" ]\n }, {\n id: \"pivotgrid-filtering\",\n name: \"Filtering\",\n description: \"Support for filtering\",\n depends: [ \"pivot.fieldmenu\" ]\n }, {\n id: \"pivotgrid-excel-export\",\n name: \"Excel export\",\n description: \"Export pivot grid data as Excel spreadsheet\",\n depends: [ \"ooxml\" ]\n }, {\n id: \"pivotgrid-pdf-export\",\n name: \"PDF export\",\n description: \"Export pivot grid data as PDF\",\n depends: [ \"pdf\", \"drawing\" ]\n }, {\n id: \"mobile-scroller\",\n name: \"Mobile scroller\",\n description: \"Support for kinetic scrolling in mobile device\",\n depends: [ \"mobile.scroller\" ]\n }]\n };\n\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n ui = kendo.ui,\n encode = kendo.htmlEncode,\n Class = kendo.Class,\n Comparer = kendo.data.Comparer,\n Widget = ui.Widget,\n DataSource = kendo.data.DataSource,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n common = window.kendo.pivotgrid.common,\n fetchDiscover = common.fetchDiscover,\n normalizeFilter = kendo.data.Query.normalizeFilter,\n normalizeSort = kendo.data.Query.normalizeSort,\n toString = {}.toString,\n identity = function(o) { return o; },\n map = $.map,\n extend = $.extend,\n keys = kendo.keys,\n isFunction = kendo.isFunction,\n fetchData = common.fetchData,\n createLocalDataState = common.createLocalDataState,\n createDataTree = common.createDataTree,\n sumAggregate = common.sumAggregate,\n averageAggregate = common.averageAggregate,\n minAggregate = common.minAggregate,\n maxAggregate = common.maxAggregate,\n createDataState = common.createDataState,\n toColumns = common.toColumns,\n toRows = common.toRows,\n toTree = common.toTree,\n toData = common.toData,\n headersReducer = common.headersReducer,\n RESIZE = \"resize\",\n READ = \"read\",\n CHANGE = \"change\",\n ERROR = \"error\",\n REQUESTSTART = \"requestStart\",\n PROGRESS = \"progress\",\n REQUESTEND = \"requestEnd\",\n MEASURES = \"Measures\",\n STATERESET = \"stateReset\",\n AUTO = \"auto\",\n DIV = \"
\",\n NS = \".kendoPivotGrid\",\n ROW_TOTAL_KEY = \"__row_total__\",\n DATABINDING = \"dataBinding\",\n DATABOUND = \"dataBound\",\n EXPANDMEMBER = \"expandMember\",\n HEADERTEMPLATE = ({ id, key, headerClass, colspan, rowspan, expandable, iconClass, role, expanded }) => `` +\n `${expandable ? kendo.ui.icon($(''), { icon: `chevron-${encode(iconClass)}` }) : ''}` +\n '',\n COLLAPSEMEMBER = \"collapseMember\",\n STATE_EXPANDED_ICONNAME = \"caret-alt-down\",\n STATE_EXPANDED_SELECTOR = `.k-i-${STATE_EXPANDED_ICONNAME},.k-svg-i-${STATE_EXPANDED_ICONNAME}`,\n STATE_COLLAPSED_ICONNAME = \"caret-alt-right\",\n HEADER_TEMPLATE = ({ member }) => `${encode(member.caption || member.name)}`,\n PIVOTGRID_TREND_ICONS_MAP = {\n \"kpi-trend-decrease\": \"caret-alt-down\",\n \"kpi-trend-increase\": \"caret-alt-up\",\n \"kpi-trend-equal\": \"minus\",\n },\n KPISTATUS_TEMPLATE = ({ dataItem }) => kendo.ui.icon($(``), { icon: `kpi-status-${dataItem.value > 0 ? \"open\" : dataItem.value < 0 ? \"deny\" : \"hold\"}` }),\n KPITREND_TEMPLATE = ({ dataItem }) => kendo.ui.icon($(``), { icon: PIVOTGRID_TREND_ICONS_MAP[`kpi-trend-${dataItem.value > 0 ? \"increase\" : dataItem.value < 0 ? \"decrease\" : \"equal\"}`] }),\n DATACELL_TEMPLATE = ({ dataItem }) => `${dataItem ? encode(dataItem.fmtValue || dataItem.value) || \" \" : \" \"}`,\n LAYOUT_TABLE = '' +\n '' +\n '' +\n '' +\n '' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n var AXIS_ROWS = \"rows\";\n var AXIS_COLUMNS = \"columns\";\n\n var tableStyles = {\n tableRow: \"k-table-row\",\n header: \"k-header k-table-th\",\n headerTable: \"k-grid-header-table k-table k-table-md\",\n table: \"k-table k-table-md\",\n contentTable: \"k-grid-table k-table k-table-md\",\n tbody: \"k-table-tbody\",\n tableCell: \"k-table-td\"\n };\n\n function normalizeMeasures(measure) {\n var descriptor = typeof measure === \"string\" ? [{ name: measure }] : measure;\n var descriptors = toString.call(descriptor) === \"[object Array]\" ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\n\n return map(descriptors, function(d) {\n if (typeof d === \"string\") {\n return { name: d };\n }\n return $.extend(true, d, { name: d.name, type: d.type });\n });\n }\n\n function normalizeMembers(member) {\n var descriptor = typeof member === \"string\" ? [{ name: [member], expand: false }] : member;\n var descriptors = toString.call(descriptor) === \"[object Array]\" ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\n\n return map(descriptors, function(d) {\n if (typeof d === \"string\") {\n return { name: [d], expand: false };\n }\n return { name: (toString.call(d.name) === \"[object Array]\" ? d.name.slice() : [d.name]), expand: d.expand };\n });\n }\n\n function normalizeName(name) {\n if (name.indexOf(\" \") !== -1) {\n name = '[\"' + name + '\"]';\n }\n\n return name;\n }\n\n function accumulateMembers(accumulator, rootTuple, tuple, level) {\n var idx, length;\n var children;\n var member;\n\n if (!tuple) {\n tuple = rootTuple;\n }\n\n if (!level) {\n level = 0;\n }\n\n member = tuple.members[level];\n\n if (!member || member.measure) { //return if no member or measure\n return;\n }\n\n children = member.children;\n length = children.length;\n\n if (tuple === rootTuple) {\n accumulator[kendo.stringify([member.name])] = !!length;\n } else if (length) {\n accumulator[kendo.stringify(buildPath(tuple, level))] = true;\n }\n\n if (length) {\n for (idx = 0; idx < length; idx++) {\n accumulateMembers(accumulator, rootTuple, children[idx], level);\n }\n }\n\n accumulateMembers(accumulator, rootTuple, tuple, level + 1);\n }\n\n function descriptorsForAxes(tuples) {\n var result = {};\n\n if (tuples.length) {\n accumulateMembers(result, tuples[0]);\n }\n\n var descriptors = [];\n for (var k in result) {\n descriptors.push({ name: JSON.parse(k), expand: result[k] });\n }\n\n return descriptors;\n }\n\n function addMissingPathMembers(members, axis) {\n var tuples = axis.tuples || [];\n var firstTuple = tuples[0];\n\n if (firstTuple && members.length < firstTuple.members.length) {\n var tupleMembers = firstTuple.members;\n\n for (var idx = 0; idx < tupleMembers.length; idx++) {\n if (tupleMembers[idx].measure) {\n continue;\n }\n\n var found = false;\n for (var j = 0; j < members.length; j++) {\n if (getName(members[j]).indexOf(tupleMembers[idx].hierarchy) === 0) {\n found = true;\n break;\n }\n }\n\n if (!found) {\n members.push({ name: [tupleMembers[idx].name], expand: false }); //calling normalize here to make name from string to array\n }\n }\n }\n }\n\n function tupleToDescriptors(tuple) {\n var result = [];\n var members = tuple.members;\n\n for (var idx = 0; idx < members.length; idx++) {\n if (members[idx].measure) {\n continue;\n }\n\n //make tuple name an array\n result.push({ name: [members[idx].name], expand: members[idx].children.length > 0 });\n }\n\n return result;\n }\n\n function descriptorsForMembers(axis, members, measures) {\n axis = axis || {};\n\n addMissingPathMembers(members, axis);\n\n if (measures.length > 1) {\n members.push({\n name: MEASURES,\n measure: true,\n children: normalizeMembers(measures)\n });\n }\n\n var tupletoSearch = {\n members: members\n };\n\n if (axis.tuples) {\n var result = findExistingTuple(axis.tuples, tupletoSearch);\n if (result.tuple) {\n members = tupleToDescriptors(result.tuple);\n }\n }\n\n return members;\n }\n\n function createAggregateGetter(m) {\n var measureGetter = kendo.getter(m.field, true);\n return function(aggregatorContext, state) {\n return m.aggregate(measureGetter(aggregatorContext.dataItem), state, aggregatorContext);\n };\n }\n\n function isNumber(val) {\n return typeof val === \"number\" && !isNaN(val);\n }\n\n function isDate(val) {\n return val && val.getTime;\n }\n\n function getScollWidth() {\n var scrollbar = 0;\n var div;\n if (document && document.createElement) {\n div = document.createElement('div');\n\n div.style.cssText = 'overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block';\n div.innerHTML = ' ';\n document.body.appendChild(div);\n\n scrollbar = div.offsetWidth - div.scrollWidth;\n\n document.body.removeChild(div);\n }\n\n return scrollbar;\n }\n\n function loadLocalData(data, params, deferred) {\n var that = this;\n var originalData = (that.reader.data(data) || []).slice(0);\n if (originalData && !that._pristineData) {\n that._pristineData = originalData;\n }\n var columnSettings = that._createSettings(params.columnAxes);\n var rowSettings = that._createSettings(params.rowAxes);\n var measures = that.measures();\n var dataTree = createDataTree(originalData, rowSettings, columnSettings, measures, { dataField: \"aggregate\", columnsData: \"columns\" }, that.filter() || []);\n\n var stateArgs = {\n dataTree: dataTree,\n columnSettings: columnSettings,\n rowSettings: rowSettings,\n columnAxes: params.columnAxes,\n rowAxes: params.rowAxes,\n measures: measures.map(function(item) { return item; }).reverse(),\n fields: { dataField: \"aggregate\", columnsData: \"columns\" },\n sort: flattenSortDescriptors(params.sort || [])\n };\n\n that._saveState(createLocalDataState(stateArgs));\n that.trigger(CHANGE);\n deferred.resolve();\n }\n\n function flattenSortDescriptors(descriptors) {\n var result = [];\n for (var i = 0; i < descriptors.length; i++) {\n result.push({\n dir: descriptors[i].dir,\n field: descriptors[i].field.split(\".\").pop()\n });\n }\n return result;\n }\n\n function createLocalMeasure(field, key, format, aggregate) {\n var formatFunc = function(value) { return kendo.format(this.format, value); };\n var measureMap = {\n \"sum\": sumAggregate,\n \"average\": averageAggregate,\n \"min\": minAggregate,\n \"max\": maxAggregate,\n };\n var valueFunc = function(item) { return item[this.field]; };\n var measure = {\n value: valueFunc.bind({ field: field }),\n aggregate: measureMap[aggregate],\n caption: key,\n uniqueName: key,\n type: 2,\n name: [key]\n };\n if (format) {\n measure.aggregate.format = formatFunc.bind({ format: format });\n }\n\n return measure;\n }\n\n function getIcons(sortIcon, options, pivotOptions) {\n var sortable = options.sortable,\n filterable = options.filterable,\n reorderable = pivotOptions.reorderable,\n result = \"\";\n\n if (sortable) {\n result += sortIcon ? `${kendo.ui.icon(sortIcon + \"-sm\")}` : '';\n }\n\n if (filterable || sortable) {\n result += `${kendo.ui.icon(\"more-vertical\")}`;\n }\n if (reorderable) {\n result += `${kendo.ui.icon(\"x\")}`;\n }\n\n return result;\n }\n\n var functions = {\n sum: function(value, state) {\n var accumulator = state.accumulator;\n\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n\n return accumulator;\n },\n count: function(value, state) {\n return (state.accumulator || 0) + 1;\n },\n average: {\n aggregate: function(value, state) {\n var accumulator = state.accumulator;\n\n if (state.count === undefined$1) {\n state.count = 0;\n }\n\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n\n if (isNumber(value)) {\n state.count++;\n }\n\n return accumulator;\n },\n result: function(state) {\n var accumulator = state.accumulator;\n\n if (isNumber(accumulator)) {\n accumulator = accumulator / state.count;\n }\n\n return accumulator;\n }\n },\n max: function(value, state) {\n var accumulator = state.accumulator;\n\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n\n if (accumulator < value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n },\n min: function(value, state) {\n var accumulator = state.accumulator;\n\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n\n if (accumulator > value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n }\n };\n\n var PivotCubeBuilder = Class.extend({\n init: function(options) {\n this.options = extend({}, this.options, options);\n this.dimensions = this._normalizeDescriptors(\"field\", this.options.dimensions);\n this.measures = this._normalizeDescriptors(\"name\", this.options.measures);\n },\n\n _normalizeDescriptors: function(keyField, descriptors) {\n descriptors = descriptors || {};\n var fields = {};\n var field;\n\n if (toString.call(descriptors) === \"[object Array]\") {\n for (var idx = 0, length = descriptors.length; idx < length; idx++) {\n field = descriptors[idx];\n if (typeof field === \"string\") {\n fields[field] = {};\n } else if (field[keyField]) {\n fields[field[keyField]] = field;\n }\n }\n descriptors = fields;\n }\n\n return descriptors;\n },\n\n _rootTuples: function(rootNames, measureAggregators) {\n var aggregatorsLength = measureAggregators.length || 1;\n var dimensionsSchema = this.dimensions || [];\n var root, name, parts;\n var measureIdx = 0;\n var idx;\n\n var rootNamesLength = rootNames.length;\n var result = [];\n var keys = [];\n\n if (rootNamesLength || measureAggregators.length) {\n for (measureIdx = 0; measureIdx < aggregatorsLength; measureIdx++) {\n\n root = { members: [] };\n\n for (idx = 0; idx < rootNamesLength; idx++) {\n name = rootNames[idx];\n parts = name.split(\"&\");\n\n root.members[root.members.length] = {\n children: [],\n caption: (dimensionsSchema[name] || {}).caption || \"All\",\n name: name,\n levelName: name,\n levelNum: \"0\",\n hasChildren: true,\n parentName: parts.length > 1 ? parts[0] : undefined$1,\n hierarchy: name\n };\n }\n\n if (aggregatorsLength > 1) {\n root.members[root.members.length] = {\n children: [],\n caption: (measureAggregators[measureIdx]).caption,\n name: measureAggregators[measureIdx].descriptor.name,\n levelName: \"MEASURES\",\n levelNum: \"0\",\n hasChildren: false,\n parentName: undefined$1,\n hierarchy: \"MEASURES\"\n };\n }\n\n result[result.length] = root;\n }\n\n keys.push(ROW_TOTAL_KEY);\n }\n\n return {\n keys: keys,\n tuples: result\n };\n },\n\n _sortMap: function(map, sortDescriptors) {\n var sortedMaps = [];\n var sortTree = [];\n var flattenTree = [];\n var mapItem;\n var key;\n\n for (key in map) {\n if (!map[key].directParentName) {\n sortTree.push($.extend({}, { name: key, parentName: map[key].parentName }));\n }\n }\n\n //if there are no root this means that something is expanding\n //and we should only sort that part of the tree\n if (!sortTree.length) {\n for (key in map) {\n sortTree.push($.extend({}, { name: key, parentName: map[key].parentName }));\n }\n }\n\n fillSortTree(sortTree, map);\n\n // fill tree recursive\n for (var i = 0; i < sortDescriptors.length; i++) {\n sortItemsTree(sortDescriptors[i].field.split(\".\").pop(), sortTree, Comparer.create({ field: \"name\", dir: sortDescriptors[i].dir }));\n }\n\n flattenTree = flatColumns(sortTree);\n\n //we need to flatten the structure so the tuples can build correctly\n for (var j = 0; j < flattenTree.length; j++) {\n mapItem = map[flattenTree[j].name];\n mapItem.index = j;\n sortedMaps[j] = mapItem;\n }\n\n return sortedMaps;\n },\n\n _expandedTuples: function(map, expanded, measureAggregators, sortDescriptors) {\n var aggregatorsLength = measureAggregators.length || 1;\n var dimensionsSchema = this.dimensions || [];\n var measureIdx;\n var tuple;\n\n var key;\n var mapItem;\n var current;\n var currentKeys;\n var accumulator = [];\n var accumulatorKeys = [];\n var memberInfo;\n\n var expandedNames;\n var parts;\n var name;\n var idx;\n\n if (sortDescriptors && sortDescriptors.length && !$.isEmptyObject(map)) {\n map = this._sortMap(map, sortDescriptors);\n }\n\n for (key in map) {\n mapItem = map[key];\n memberInfo = this._findExpandedMember(expanded, mapItem.uniquePath);\n\n current = accumulator[memberInfo.index] || [];\n currentKeys = accumulatorKeys[memberInfo.index] || [];\n\n expandedNames = memberInfo.member.names;\n\n for (measureIdx = 0; measureIdx < aggregatorsLength; measureIdx++) {\n tuple = { members: [] };\n for (idx = 0; idx < expandedNames.length; idx++) {\n if (idx === memberInfo.member.expandedIdx) {\n tuple.members[tuple.members.length] = {\n children: [],\n caption: mapItem.value,\n name: mapItem.name,\n hasChildren: false,\n levelNum: 1,\n levelName: mapItem.parentName + mapItem.name,\n parentName: mapItem.parentName,\n hierarchy: mapItem.parentName + mapItem.name\n };\n\n if (measureIdx === 0) {\n currentKeys.push(buildPath(tuple, idx).join(\"\"));\n }\n } else {\n name = expandedNames[idx];\n parts = name.split(\"&\");\n tuple.members[tuple.members.length] = {\n children: [],\n caption: (dimensionsSchema[name] || {}).caption || \"All\",\n name: name,\n levelName: name,\n levelNum: \"0\",\n hasChildren: true,\n parentName: parts.length > 1 ? parts[0] : undefined$1,\n hierarchy: name\n };\n }\n }\n\n if (aggregatorsLength > 1) {\n tuple.members[tuple.members.length] = {\n children: [],\n caption: measureAggregators[measureIdx].caption,\n name: measureAggregators[measureIdx].descriptor.name,\n levelName: \"MEASURES\",\n levelNum: \"0\",\n hasChildren: true,\n parentName: undefined$1,\n hierarchy: \"MEASURES\"\n };\n }\n\n current[current.length] = tuple;\n }\n\n accumulator[memberInfo.index] = current;\n accumulatorKeys[memberInfo.index] = currentKeys;\n }\n\n return {\n keys: accumulatorKeys,\n tuples: accumulator\n };\n },\n\n _findExpandedMember: function(members, parentName) {\n for (var idx = 0; idx < members.length; idx++) {\n if (members[idx].uniquePath === parentName) {\n return {\n member: members[idx],\n index: idx\n };\n }\n }\n },\n\n _asTuples: function(map, descriptor, measureAggregators, sortDescriptors) {\n measureAggregators = measureAggregators || [];\n\n var rootInfo = this._rootTuples(descriptor.root, measureAggregators);\n var expandedInfo = this._expandedTuples(map, descriptor.expanded, measureAggregators, sortDescriptors);\n\n return {\n keys: [].concat.apply(rootInfo.keys, expandedInfo.keys),\n tuples: [].concat.apply(rootInfo.tuples, expandedInfo.tuples)\n };\n },\n\n _measuresInfo: function(measures, rowAxis) {\n var idx = 0;\n var length = measures && measures.length;\n\n var aggregateNames = [];\n var resultFuncs = {};\n var formats = {};\n\n var descriptors = (this.measures || {});\n var measure;\n var name;\n\n for (; idx < length; idx++) {\n name = measures[idx].descriptor.name;\n measure = descriptors[name] || {};\n\n aggregateNames.push(name);\n\n if (measure.result) {\n resultFuncs[name] = measure.result;\n }\n\n if (measure.format) {\n formats[name] = measure.format;\n }\n }\n\n return {\n names: aggregateNames,\n formats: formats,\n resultFuncs: resultFuncs,\n rowAxis: rowAxis\n };\n },\n\n _toDataArray: function(map, measuresInfo, rowKeys, columnKeys) {\n var result = [];\n\n var aggregates;\n var name, i, j, k, n;\n var row, column, columnKey;\n\n var rowMeasureNamesLength = 1;\n var rowMeasureNames = [];\n var columnMeasureNames;\n\n var rowLength = rowKeys.length || 1;\n var columnLength = columnKeys.length || 1;\n\n if (measuresInfo.rowAxis) {\n rowMeasureNames = measuresInfo.names;\n rowMeasureNamesLength = rowMeasureNames.length;\n } else {\n columnMeasureNames = measuresInfo.names;\n }\n\n for (i = 0; i < rowLength; i++) {\n row = map[rowKeys[i] || ROW_TOTAL_KEY];\n\n for (n = 0; n < rowMeasureNamesLength; n++) {\n if (measuresInfo.rowAxis) {\n columnMeasureNames = [rowMeasureNames[n]];\n }\n\n for (j = 0; j < columnLength; j++) {\n columnKey = columnKeys[j] || ROW_TOTAL_KEY;\n column = row.items[columnKey];\n\n if (columnKey === ROW_TOTAL_KEY) {\n aggregates = row.aggregates;\n } else {\n aggregates = column ? column.aggregates : {};\n }\n\n for (k = 0; k < columnMeasureNames.length; k++) {\n name = columnMeasureNames[k];\n this._addData(result, aggregates[name], measuresInfo.formats[name], measuresInfo.resultFuncs[name]);\n }\n }\n }\n }\n\n return result;\n },\n\n _addData: function(result, value, format, resultFunc) {\n var fmtValue = \"\";\n var ordinal;\n\n if (value) {\n value = resultFunc ? resultFunc(value) : value.accumulator;\n fmtValue = format ? kendo.format(format, value) : value;\n }\n\n ordinal = result.length;\n\n result[ordinal] = {\n ordinal: ordinal,\n value: value || \"\",\n fmtValue: fmtValue\n };\n },\n\n _matchDescriptors: function(dataItem, descriptor, getters) {\n var parts;\n var parentField;\n var expectedValue;\n\n var names = descriptor.names;\n var idx = descriptor.expandedIdx;\n var value;\n\n while (idx > 0) {\n parts = names[--idx].split(\"&\");\n if (parts.length > 1) {\n parentField = parts[0];\n expectedValue = parts[1];\n\n value = getters[parentField](dataItem);\n value = (value !== undefined$1 && value !== null) ? value.toString() : value;\n\n if (value != expectedValue) {\n return false;\n }\n }\n }\n return true;\n },\n\n _calculateAggregate: function(measureAggregators, aggregatorContext, totalItem) {\n var result = {};\n var state;\n var name;\n\n for (var measureIdx = 0; measureIdx < measureAggregators.length; measureIdx++) {\n name = measureAggregators[measureIdx].descriptor.name;\n state = totalItem.aggregates[name] || { };\n state.accumulator = measureAggregators[measureIdx].aggregator(aggregatorContext, state);\n result[name] = state;\n }\n\n return result;\n },\n\n _processColumns: function(measureAggregators, descriptors, getters, columns, aggregatorContext, rowTotal, state, updateColumn) {\n var value;\n var descriptor;\n var column;\n var totalItem;\n var key, name, parentName, path;\n var dataItem = aggregatorContext.dataItem;\n var idx = 0;\n\n for (; idx < descriptors.length; idx++) {\n descriptor = descriptors[idx];\n\n //checks whether the dataItem is relevant to the descriptors\n if (!this._matchDescriptors(dataItem, descriptor, getters)) {\n continue;\n }\n\n path = descriptor.names.slice(0, descriptor.expandedIdx).join(\"\");\n name = descriptor.names[descriptor.expandedIdx];\n\n\n value = getters[name](dataItem);\n value = (value !== undefined$1 && value !== null) ? value.toString() : value;\n\n parentName = name;\n name = name + \"&\" + value;\n key = path + name;\n\n column = columns[key] || {\n index: state.columnIndex,\n parentName: parentName,\n name: name,\n directParentName: path.indexOf(\"&\") !== -1 ? path : \"\",\n uniquePath: path + parentName,\n childrenMap: {},\n value: value\n };\n\n if (path && columns[path] && !columns[path].childrenMap[path + parentName + \"&\" + value]) {\n columns[path].childrenMap[path + parentName + \"&\" + value] = true;\n }\n\n totalItem = rowTotal.items[key] || {\n aggregates: {}\n };\n\n rowTotal.items[key] = {\n index: column.index,\n aggregates: this._calculateAggregate(measureAggregators, aggregatorContext, totalItem)\n };\n\n if (updateColumn) {\n if (!columns[key]) {\n state.columnIndex++;\n }\n columns[key] = column;\n }\n }\n },\n\n _measureAggregators: function(options) {\n var measureDescriptors = options.measures || [];\n var measures = this.measures || {};\n var aggregators = [];\n var descriptor, measure, idx, length;\n var defaultAggregate, aggregate;\n\n if (measureDescriptors.length) {\n for (idx = 0, length = measureDescriptors.length; idx < length; idx++) {\n descriptor = measureDescriptors[idx];\n measure = measures[descriptor.name];\n defaultAggregate = null;\n\n if (measure) {\n aggregate = measure.aggregate;\n if (typeof aggregate === \"string\") {\n defaultAggregate = functions[aggregate.toLowerCase()];\n\n if (!defaultAggregate) {\n throw new Error(\"There is no such aggregate function\");\n }\n\n measure.aggregate = defaultAggregate.aggregate || defaultAggregate;\n measure.result = defaultAggregate.result;\n }\n\n\n aggregators.push({\n descriptor: descriptor,\n caption: measure.caption,\n result: measure.result,\n aggregator: createAggregateGetter(measure)\n });\n }\n }\n } else {\n aggregators.push({\n descriptor: { name: \"default\" },\n caption: \"default\",\n aggregator: function() { return 1; }\n });\n }\n\n return aggregators;\n },\n\n _buildGetters: function(names) {\n var result = {};\n var parts;\n var name;\n\n for (var idx = 0; idx < names.length; idx++) {\n name = names[idx];\n parts = name.split(\"&\");\n\n if (parts.length > 1) {\n result[parts[0]] = kendo.getter(parts[0], true);\n } else {\n result[name] = kendo.getter(normalizeName(name), true);\n }\n }\n\n return result;\n },\n\n _parseDescriptors: function(descriptors) {\n var parsedDescriptors = parseDescriptors(descriptors);\n var rootNames = getRootNames(parsedDescriptors.root);\n var expanded = parsedDescriptors.expanded;\n var result = [];\n\n for (var idx = 0; idx < expanded.length; idx++) {\n result.push(mapNames(expanded[idx].name, rootNames));\n }\n\n return {\n root: rootNames,\n expanded: result\n };\n },\n\n _filter: function(data, filter) {\n if (!filter) {\n return data;\n }\n\n var expr;\n var idx = 0;\n var filters = filter.filters;\n\n for (; idx < filters.length; idx++) {\n expr = filters[idx];\n\n if (expr.operator === \"in\") {\n filters[idx] = this._normalizeFilter(expr);\n }\n }\n\n return new kendo.data.Query(data).filter(filter).data;\n },\n\n _normalizeFilter: function(filter) {\n var value = filter.value.split(\",\");\n var result = [];\n\n if (!value.length) {\n return value;\n }\n\n for (var idx = 0; idx < value.length; idx++) {\n result.push({\n field: filter.field,\n operator: \"eq\",\n value: value[idx]\n });\n }\n\n return {\n logic: \"or\",\n filters: result\n };\n },\n\n process: function(data, options) {\n data = data || [];\n options = options || {};\n\n data = this._filter(data, options.filter);\n\n var measures = options.measures || [];\n\n var measuresRowAxis = options.measuresAxis === \"rows\";\n\n var columnDescriptors = options.columns || [];\n var rowDescriptors = options.rows || [];\n\n if (!columnDescriptors.length && rowDescriptors.length && (!measures.length || (measures.length && measuresRowAxis))) {\n columnDescriptors = rowDescriptors;\n rowDescriptors = [];\n measuresRowAxis = false;\n }\n\n if (!columnDescriptors.length && !rowDescriptors.length) {\n measuresRowAxis = false;\n }\n\n if (!columnDescriptors.length && measures.length) {\n columnDescriptors = normalizeMembers(options.measures);\n }\n\n columnDescriptors = this._parseDescriptors(columnDescriptors);\n rowDescriptors = this._parseDescriptors(rowDescriptors);\n\n var aggregatedData = {};\n var columns = {};\n var rows = {};\n\n var rowValue;\n var state = { columnIndex: 0 };\n\n var measureAggregators = this._measureAggregators(options);\n\n var columnGetters = this._buildGetters(columnDescriptors.root);\n var rowGetters = this._buildGetters(rowDescriptors.root);\n\n var processed = false;\n\n var expandedColumns = columnDescriptors.expanded;\n var expandedRows = rowDescriptors.expanded;\n\n var dataItem;\n var aggregatorContext;\n var hasExpandedRows = expandedRows.length !== 0;\n\n var rowIdx, rowDescriptor, rowName, rowTotal;\n var key, path, parentName, value;\n var columnsInfo, rowsInfo;\n var length = data.length;\n var idx = 0;\n\n if (columnDescriptors.root.length || rowDescriptors.root.length) {\n processed = true;\n\n for (idx = 0; idx < length; idx++) {\n dataItem = data[idx];\n\n aggregatorContext = {\n dataItem: dataItem,\n index: idx\n };\n\n rowTotal = aggregatedData[ROW_TOTAL_KEY] || {\n items: {},\n aggregates: {}\n };\n\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, rowTotal, state, !hasExpandedRows);\n\n rowTotal.aggregates = this._calculateAggregate(measureAggregators, aggregatorContext, rowTotal);\n aggregatedData[ROW_TOTAL_KEY] = rowTotal;\n\n for (rowIdx = 0; rowIdx < expandedRows.length; rowIdx++) {\n rowDescriptor = expandedRows[rowIdx];\n\n if (!this._matchDescriptors(dataItem, rowDescriptor, rowGetters)) {\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, { items: {}, aggregates: {} }, state, true);\n continue;\n }\n\n path = rowDescriptor.names.slice(0, rowDescriptor.expandedIdx).join(\"\");\n rowName = rowDescriptor.names[rowDescriptor.expandedIdx];\n\n parentName = rowName;\n\n rowValue = rowGetters[rowName](dataItem);\n rowValue = rowValue !== undefined$1 ? rowValue.toString() : rowValue;\n\n rowName = rowName + \"&\" + rowValue;\n key = path + rowName;\n\n rows[key] = {\n uniquePath: path + parentName,\n parentName: parentName,\n name: rowName,\n value: rowValue\n };\n\n value = aggregatedData[key] || {\n items: {},\n aggregates: {}\n };\n\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, value, state, true);\n\n value.aggregates = this._calculateAggregate(measureAggregators, aggregatorContext, value);\n aggregatedData[key] = value;\n }\n }\n }\n\n if (processed && length) {\n if (measureAggregators.length > 1 && (!options.columns || !options.columns.length)) {\n columnDescriptors = {\n root: [],\n expanded: []\n };\n }\n\n columnsInfo = this._asTuples(columns, columnDescriptors, measuresRowAxis ? [] : measureAggregators, options.sort ? options.sort : []);\n rowsInfo = this._asTuples(rows, rowDescriptors, measuresRowAxis ? measureAggregators : [], options.sort ? options.sort : []);\n\n columns = columnsInfo.tuples;\n rows = rowsInfo.tuples;\n\n aggregatedData = this._toDataArray(aggregatedData, this._measuresInfo(measureAggregators, measuresRowAxis), rowsInfo.keys, columnsInfo.keys);\n } else {\n aggregatedData = columns = rows = [];\n }\n\n return {\n axes: {\n columns: { tuples: columns },\n rows: { tuples: rows }\n },\n data: aggregatedData\n };\n }\n });\n\n var PivotTransport = Class.extend({\n init: function(options, transport) {\n this.transport = transport;\n this.options = transport.options || {};\n\n if (!this.transport.discover) {\n if (isFunction(options.discover)) {\n this.discover = options.discover;\n }\n }\n },\n read: function(options) {\n return this.transport.read(options);\n },\n update: function(options) {\n return this.transport.update(options);\n },\n create: function(options) {\n return this.transport.create(options);\n },\n destroy: function(options) {\n return this.transport.destroy(options);\n },\n discover: function(options) {\n if (this.transport.discover) {\n return this.transport.discover(options);\n }\n options.success({});\n },\n catalog: function(val) {\n var options = this.options || {};\n\n if (val === undefined$1) {\n return (options.connection || {}).catalog;\n\n }\n\n var connection = options.connection || {};\n connection.catalog = val;\n\n this.options.connection = connection;\n $.extend(this.transport.options, { connection: connection });\n },\n cube: function(val) {\n var options = this.options || {};\n\n if (val === undefined$1) {\n return (options.connection || {}).cube;\n }\n\n var connection = options.connection || {};\n connection.cube = val;\n\n this.options.connection = connection;\n extend(true, this.transport.options, { connection: connection });\n }\n });\n\n var PivotDataSourceV2 = DataSource.extend({\n init: function(options) {\n\n var cube = ((options || {}).schema || {}).cube;\n\n var schema = {\n axes: identity,\n cubes: identity,\n catalogs: identity,\n measures: identity,\n dimensions: identity,\n hierarchies: identity,\n levels: identity,\n members: identity\n };\n\n if (cube) {\n this.cubeSchema = $.extend(schema, this._cubeSchema(cube));\n }\n\n DataSource.fn.init.call(this, extend(true, {}, {\n //schema: schema\n }, options));\n\n var transportOptions = this.options.transport || {};\n if ((this.options.type || \"xmla\").toLowerCase() === \"xmla\") {\n this._online = true;\n this.transport = new XmlaTransportV2(transportOptions);\n } else {\n this.transport = new PivotTransport(this.options.transport || {}, this.transport);\n }\n\n this._columns = normalizeMembers(this.options.columns);\n this._rows = normalizeMembers(this.options.rows);\n\n var measures = this.cubeSchema ? this.cubeSchema.measures() : this.options.measures || [];\n\n if (toString.call(measures) === \"[object Object]\") {\n this._measuresAxis = measures.axis || \"columns\";\n measures = measures.values || [];\n }\n\n this._measures = normalizeMeasures(measures);\n },\n\n options: {\n serverSorting: true,\n serverPaging: true,\n serverFiltering: true,\n serverGrouping: true,\n serverAggregates: true\n },\n\n axes: function() {\n return {\n columns: normalizeAxis(this.columns()),\n rows: normalizeAxis(this.rows())\n };\n },\n\n catalog: function(val) {\n if (val === undefined$1) {\n return this.transport.catalog();\n }\n\n this.transport.catalog(val);\n this._mergeState({});// clears current state\n this.read();\n },\n\n cube: function(val) {\n if (val === undefined$1) {\n return this.transport.cube();\n }\n\n this.transport.cube(val);\n this._mergeState({});// clears current state\n this.read();\n },\n\n measuresAxis: function() {\n return this._measuresAxis || \"columns\";\n },\n\n fetch: function(callback) {\n var that = this;\n if (this._data === undefined$1 || this._data.length === 0) {\n var fn = function() {\n if (isFunction(callback)) {\n callback.call(that);\n }\n };\n\n return this._query().done(fn);\n }\n },\n\n _createSettings: function(axes) {\n var settings = [];\n var key;\n var dimensions = this.cubeSchema.dimensionsSettings();\n var displayValueFunc = function(item) { return item[this.key]; };\n var sortValueFunc = function(value) { return value; };\n for (var i = 0; i < axes.length; i++) {\n key = axes[i].name[0];\n settings.push({\n key: key,\n displayValue: displayValueFunc.bind({ key: key }),\n sortValue: sortValueFunc,\n caption: (dimensions[key] || {}).caption || key\n });\n }\n return settings;\n },\n\n _cubeSchema: function(cube) {\n return {\n dimensionsSettings: function() {\n return cube.dimensions;\n },\n dimensions: function() {\n var result = [];\n var dimensions = cube.dimensions;\n\n for (var key in dimensions) {\n result.push({\n name: key,\n caption: dimensions[key].caption || key,\n uniqueName: key,\n defaultHierarchy: key,\n type: 1\n });\n }\n\n if (cube.measures) {\n result.push({\n name: MEASURES,\n caption: MEASURES,\n uniqueName: MEASURES,\n type: 2\n });\n }\n\n return result;\n },\n restoreMeasure: function(measures, measure) {\n for (var i = 0; i < measures.length; i++) {\n if (!measures[i].aggregate) {\n measures[i].aggregate = measure.aggregate;\n measures[i].value = measure.value;\n measures[i].caption = measure.caption;\n measures[i].uniqueName = measure.uniqueName;\n measures[i].type = 2;\n }\n }\n },\n measures: function() {\n var result = [];\n var measures = cube.measures;\n\n for (var key in measures) {\n result.push(createLocalMeasure(measures[key].field, key, measures[key].format, measures[key].aggregate));\n }\n\n return result;\n },\n memberType: function(name) {\n var getter = kendo.getter(normalizeName(name), true);\n var data = this.options.data || this._pristineData || [];\n if (!data.length) {\n return null;\n }\n\n return typeof getter(data[0]);\n }.bind(this),\n members: function(name) {\n var data = this.options.data || this._pristineData || [];\n var result = [];\n var distinct = {};\n var getter;\n var value;\n var idx = 0;\n\n if (name.indexOf(\"[(ALL)]\") !== -1) {\n return [\n {\n caption: cube.dimensions[name.split(\".\")[0]].caption || name,\n levelUniqueName: name,\n name: name,\n childrenCardinality: 1,\n uniqueName: name\n }\n ];\n }\n\n getter = kendo.getter(normalizeName(name), true);\n\n for (; idx < data.length; idx++) {\n value = getter(data[idx]);\n if ((value || value === 0 || value === false) && !distinct[value]) {\n distinct[value] = true;\n\n result.push({\n caption: value + \"\",\n name: value + \"\",\n childrenCardinality: 0,\n uniqueName: value\n });\n }\n }\n\n return result;\n }.bind(this)\n };\n },\n\n read: function(data) {\n var that = this;\n var isPrevented = that.trigger(REQUESTSTART, { type: READ });\n var params = that._params(data);\n var deferred = $.Deferred();\n if (!isPrevented) {\n that.trigger(PROGRESS);\n\n if (that.options.data) {\n loadLocalData.call(that, that.options.data, params, deferred);\n } else if ((this.options.type || \"xmla\").toLowerCase() === \"xmla\") {\n that.transport.read({\n data: params,\n success: function(newDataState) {\n that._saveState(newDataState);\n that.trigger(REQUESTEND, { response: newDataState, type: READ });\n that.trigger(CHANGE);\n if (that._preventRefresh) {\n that._preventRefresh = false;\n }\n deferred.resolve();\n },\n error: function(err) {\n that.trigger(ERROR, { error: err });\n }\n });\n } else {\n that.transport.read({\n success: function(data) {\n loadLocalData.call(that, data, params, deferred);\n },\n error: function(err) {\n that.trigger(ERROR, { error: err });\n }\n });\n }\n }\n return deferred.promise();\n },\n\n _params: function(data) {\n var that = this;\n var options = DataSource.fn._params.call(that, data);\n\n options = extend({\n columnAxes: JSON.parse(JSON.stringify(that._columns)),\n rowAxes: JSON.parse(JSON.stringify(that._rows)),\n measuresAxis: that.measuresAxis(),\n measureAxes: that._measures\n }, options);\n\n if ((this.options.type || \"\").toLowerCase() === \"xmla\") {\n options.connection = that.options.transport.connection;\n }\n\n if (options.filter) {\n options.filter = normalizeFilter(options.filter);\n options.filter = (options.filter || {}).filters;\n }\n\n if (options.sort) {\n options.sort = normalizeSort(options.sort);\n }\n\n return options;\n },\n\n discover: function(options) {\n var that = this,\n transport = that.transport;\n\n if (transport.discover) {\n return transport.discover(options);\n }\n },\n\n schemaMeasures: function() {\n var that = this;\n return that.discover(\n {\n command: \"schemaMeasures\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaKPIs: function() {\n var that = this;\n\n return that.discover(\n {\n command: \"schemaKPIs\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaDimensions: function() {\n var that = this;\n\n return that.discover(\n {\n command: \"schemaDimensions\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaHierarchies: function(dimensionName) {\n var that = this;\n\n return that.discover({\n command: \"schemaHierarchies\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube(),\n dimensionUniqueName: dimensionName\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaLevels: function(hierarchyName) {\n var that = this;\n\n return that.discover({\n command: \"schemaLevels\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube(),\n hierarchyUniqueName: hierarchyName\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaCubes: function() {\n var that = this;\n\n return that.discover({\n command: \"schemaCubes\",\n restrictions: {\n catalogName: that.transport.catalog()\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaCatalogs: function() {\n var that = this;\n\n return that.discover({\n command: \"schemaCatalogs\"\n }, function(response) {\n return response;\n });\n },\n\n schemaMembers: function(restrictions) {\n var that = this;\n\n return that.discover({\n command: \"schemaMembers\",\n restrictions: extend({\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }, restrictions)\n }, function(response) {\n return response;\n });\n },\n\n _saveState: function(state) {\n var that = this;\n\n that._columnTuples = state.columns;\n that._rowTuples = state.rows;\n that._view = that._data = state.data;\n },\n\n columns: function(val) {\n if (val === undefined$1) {\n return this._columns;\n }\n\n this._columns = normalizeMembers(val);\n this.read();\n },\n\n rows: function(val) {\n if (val === undefined$1) {\n return this._rows;\n }\n\n this._rows = normalizeMembers(val);\n\n this.read();\n },\n\n measures: function(val) {\n if (val === undefined$1) {\n return this._measures;\n }\n\n this._measures = normalizeMeasures(val);\n\n this.read();\n },\n\n _mergeState: function(options) {\n options = DataSource.fn._mergeState.call(this, options);\n\n return options;\n },\n\n _query: function(options) {\n var that = this;\n var params = extend({}, {\n sort: that.sort(),\n measuresAxis: that.measuresAxis(),\n filter: that.filter()\n }, options);\n this._mergeState(params);\n\n return this.read();\n },\n });\n\n var PivotDataSource = DataSource.extend({\n init: function(options) {\n var cube = ((options || {}).schema || {}).cube;\n var measuresAxis = \"columns\";\n var measures;\n\n var schema = {\n axes: identity,\n cubes: identity,\n catalogs: identity,\n measures: identity,\n dimensions: identity,\n hierarchies: identity,\n levels: identity,\n members: identity\n };\n\n if (cube) {\n schema = $.extend(schema, this._cubeSchema(cube));\n this.cubeBuilder = new PivotCubeBuilder(cube);\n }\n\n DataSource.fn.init.call(this, extend(true, {}, {\n schema: schema\n }, options));\n\n this.transport = new PivotTransport(this.options.transport || {}, this.transport);\n\n this._columns = normalizeMembers(this.options.columns);\n this._rows = normalizeMembers(this.options.rows);\n\n measures = this.options.measures || [];\n\n if (toString.call(measures) === \"[object Object]\") {\n measuresAxis = measures.axis || \"columns\";\n measures = measures.values || [];\n }\n\n this._measures = normalizeMeasures(measures);\n this._measuresAxis = measuresAxis;\n\n this._skipNormalize = 0;\n this._axes = {};\n },\n\n _cubeSchema: function(cube) {\n return {\n dimensions: function() {\n var result = [];\n var dimensions = cube.dimensions;\n\n for (var key in dimensions) {\n result.push({\n name: key,\n caption: dimensions[key].caption || key,\n uniqueName: key,\n defaultHierarchy: key,\n type: 1\n });\n }\n\n if (cube.measures) {\n result.push({\n name: MEASURES,\n caption: MEASURES,\n uniqueName: MEASURES,\n type: 2\n });\n }\n\n return result;\n },\n hierarchies: function() {\n return [];\n },\n measures: function() {\n var result = [];\n var measures = cube.measures;\n\n for (var key in measures) {\n result.push({\n name: key,\n caption: key,\n uniqueName: key,\n aggregator: key\n });\n }\n\n return result;\n },\n members: function(response, restrictions) {\n var name = restrictions.levelUniqueName || restrictions.memberUniqueName;\n var schemaData = this.options.schema.data;\n var dataGetter = isFunction(schemaData) ? schemaData : kendo.getter(schemaData, true);\n var data = (this.options.data && dataGetter(this.options.data)) || this._rawData || [];\n var result = [];\n var getter;\n var value;\n var idx = 0;\n var distinct = {};\n\n if (name) {\n name = name.split(\".\")[0];\n }\n\n if (!restrictions.treeOp) {\n result.push({\n caption: cube.dimensions[name].caption || name,\n childrenCardinality: \"1\",\n dimensionUniqueName: name,\n hierarchyUniqueName: name,\n levelUniqueName: name,\n name: name,\n uniqueName: name\n });\n\n return result;\n }\n\n getter = kendo.getter(normalizeName(name), true);\n\n for (; idx < data.length; idx++) {\n value = getter(data[idx]);\n if ((value || value === 0) && !distinct[value]) {\n distinct[value] = true;\n\n result.push({\n caption: value,\n childrenCardinality: \"0\",\n dimensionUniqueName: name,\n hierarchyUniqueName: name,\n levelUniqueName: name,\n name: value,\n uniqueName: value\n });\n }\n }\n\n return result;\n }.bind(this)\n };\n },\n\n options: {\n serverSorting: true,\n serverPaging: true,\n serverFiltering: true,\n serverGrouping: true,\n serverAggregates: true\n },\n\n catalog: function(val) {\n if (val === undefined$1) {\n return this.transport.catalog();\n }\n\n this.transport.catalog(val);\n this._mergeState({});// clears current state\n this._axes = {};\n this.data([]);\n },\n\n cube: function(val) {\n if (val === undefined$1) {\n return this.transport.cube();\n }\n\n this.transport.cube(val);\n this._axes = {};\n this._mergeState({});// clears current state\n this.data([]);\n },\n\n axes: function() {\n return this._axes;\n },\n\n columns: function(val) {\n if (val === undefined$1) {\n return this._columns;\n }\n\n this._skipNormalize += 1;\n this._clearAxesData = true;\n\n this._columns = normalizeMembers(val);\n this.query({\n columns: val,\n rows: this.rowsAxisDescriptors(),\n measures: this.measures(),\n sort: this.sort(),\n filter: this.filter()\n });\n },\n\n rows: function(val) {\n if (val === undefined$1) {\n return this._rows;\n }\n\n this._skipNormalize += 1;\n this._clearAxesData = true;\n\n this._rows = normalizeMembers(val);\n\n this.query({\n columns: this.columnsAxisDescriptors(),\n rows: val,\n measures: this.measures(),\n sort: this.sort(),\n filter: this.filter()\n });\n },\n\n measures: function(val) {\n if (val === undefined$1) {\n return this._measures;\n }\n\n this._skipNormalize += 1;\n this._clearAxesData = true;\n\n this.query({\n columns: this.columnsAxisDescriptors(),\n rows: this.rowsAxisDescriptors(),\n measures: normalizeMeasures(val),\n sort: this.sort(),\n filter: this.filter()\n });\n },\n\n measuresAxis: function() {\n return this._measuresAxis || \"columns\";\n },\n\n _expandPath: function(path, axis) {\n var origin = axis === \"columns\" ? \"columns\" : \"rows\";\n var other = axis === \"columns\" ? \"rows\" : \"columns\";\n\n var members = normalizeMembers(path);\n var memberToExpand = getName(members[members.length - 1]);\n\n this._lastExpanded = origin;\n\n members = descriptorsForMembers(this.axes()[origin], members, this.measures());\n\n for (var idx = 0; idx < members.length; idx++) {\n var memberName = getName(members[idx]);\n\n if (memberName === memberToExpand) {\n if (members[idx].expand) {\n return;\n }\n members[idx].expand = true;\n } else {\n members[idx].expand = false;\n }\n }\n\n var descriptors = {};\n descriptors[origin] = members;\n descriptors[other] = this._descriptorsForAxis(other);\n\n this._query(descriptors);\n },\n\n _descriptorsForAxis: function(axis) {\n var axes = this.axes();\n var descriptors = this[axis]() || [];\n\n if (axes && axes[axis] && axes[axis].tuples && axes[axis].tuples[0]) {\n descriptors = descriptorsForAxes(axes[axis].tuples || []);\n }\n return descriptors;\n },\n\n columnsAxisDescriptors: function() {\n return this._descriptorsForAxis(\"columns\");\n },\n\n rowsAxisDescriptors: function() {\n return this._descriptorsForAxis(\"rows\");\n },\n\n _process: function(data, e) {\n this._view = data;\n\n e = e || {};\n e.items = e.items || this._view;\n\n this.trigger(CHANGE, e);\n },\n\n _query: function(options) {\n var that = this;\n\n if (!options) {\n this._skipNormalize += 1;\n this._clearAxesData = true;\n }\n\n return that.query(extend({}, {\n page: that.page(),\n pageSize: that.pageSize(),\n sort: that.sort(),\n filter: that.filter(),\n group: that.group(),\n aggregate: that.aggregate(),\n columns: this.columnsAxisDescriptors(),\n rows: this.rowsAxisDescriptors(),\n measures: this.measures()\n }, options));\n },\n\n query: function(options) {\n var state = this._mergeState(options);\n\n if (this._data.length && this.cubeBuilder) {\n this._params(state);\n this._updateLocalData(this._pristineData);\n\n return $.Deferred().resolve().promise();\n }\n\n return this.read(state);\n },\n\n _mergeState: function(options) {\n options = DataSource.fn._mergeState.call(this, options);\n\n if (options !== undefined$1) {\n this._measures = normalizeMeasures(options.measures);\n\n if (options.columns) {\n options.columns = normalizeMembers(options.columns);\n } else if (!options.columns) {\n this._columns = [];\n }\n\n if (options.rows) {\n options.rows = normalizeMembers(options.rows);\n } else if (!options.rows) {\n this._rows = [];\n }\n }\n return options;\n },\n\n filter: function(val) {\n if (val === undefined$1) {\n return this._filter;\n }\n\n this._skipNormalize += 1;\n this._clearAxesData = true;\n this._query({ filter: val, page: 1 });\n },\n\n expandColumn: function(path) {\n this._expandPath(path, \"columns\");\n },\n\n expandRow: function(path) {\n this._expandPath(path, \"rows\");\n },\n\n success: function(data) {\n var originalData;\n if (this.cubeBuilder) {\n originalData = (this.reader.data(data) || []).slice(0);\n }\n DataSource.fn.success.call(this, data);\n if (originalData) {\n this._pristineData = originalData;\n }\n },\n\n _processResult: function(data, axes) {\n if (this.cubeBuilder) {\n var processedData = this.cubeBuilder.process(data, this._requestData);\n\n data = processedData.data;\n axes = processedData.axes;\n }\n\n var columnIndexes, rowIndexes;\n var tuples, resultAxis, measures, axisToSkip;\n var columnDescriptors = this.columns();\n var rowDescriptors = this.rows();\n var hasColumnTuples = axes.columns && axes.columns.tuples;\n\n if (!columnDescriptors.length && rowDescriptors.length && hasColumnTuples && (this._rowMeasures().length || !this.measures().length)) {\n axes = {\n columns: {},\n rows: axes.columns\n };\n }\n\n if (!columnDescriptors.length && !rowDescriptors.length && this.measuresAxis() === \"rows\" && hasColumnTuples) {\n axes = {\n columns: {},\n rows: axes.columns\n };\n }\n\n this._axes = {\n columns: normalizeAxis(this._axes.columns),\n rows: normalizeAxis(this._axes.rows)\n };\n\n axes = {\n columns: normalizeAxis(axes.columns),\n rows: normalizeAxis(axes.rows)\n };\n\n columnIndexes = this._normalizeTuples(axes.columns.tuples, this._axes.columns.tuples, columnDescriptors, this._columnMeasures());\n rowIndexes = this._normalizeTuples(axes.rows.tuples, this._axes.rows.tuples, rowDescriptors, this._rowMeasures());\n\n if (this._skipNormalize > 0) {\n this._skipNormalize -= 1;\n }\n\n if (!this.cubeBuilder) {\n data = this._normalizeData({\n columnsLength: axes.columns.tuples.length,\n rowsLength: axes.rows.tuples.length,\n columnIndexes: columnIndexes,\n rowIndexes: rowIndexes,\n data: data\n });\n }\n\n if (this._lastExpanded == \"rows\") {\n tuples = axes.columns.tuples;\n measures = this._columnMeasures();\n resultAxis = validateAxis(axes.columns, this._axes.columns, measures);\n\n if (resultAxis) {\n axisToSkip = \"columns\";\n axes.columns = resultAxis;\n adjustDataByColumn(tuples, resultAxis.tuples, axes.rows.tuples.length, measures, data);\n if (!this.cubeBuilder) {\n data = this._normalizeData({\n columnsLength: membersCount(axes.columns.tuples, measures),\n rowsLength: axes.rows.tuples.length,\n data: data\n });\n }\n }\n } else if (this._lastExpanded == \"columns\") {\n tuples = axes.rows.tuples;\n measures = this._rowMeasures();\n resultAxis = validateAxis(axes.rows, this._axes.rows, measures);\n\n if (resultAxis) {\n axisToSkip = \"rows\";\n axes.rows = resultAxis;\n adjustDataByRow(tuples, resultAxis.tuples, axes.columns.tuples.length, measures, data);\n\n if (!this.cubeBuilder) {\n data = this._normalizeData({\n columnsLength: membersCount(axes.rows.tuples, measures),\n rowsLength: axes.columns.tuples.length,\n data: data\n });\n }\n }\n }\n\n this._lastExpanded = null;\n\n var result = this._mergeAxes(axes, data, axisToSkip);\n this._axes = result.axes;\n\n return result.data;\n },\n\n _readData: function(data) {\n var axes = this.reader.axes(data);\n var newData = this.reader.data(data);\n\n if (this.cubeBuilder) {\n this._rawData = newData;\n }\n\n return this._processResult(newData, axes);\n },\n\n _createTuple: function(tuple, measure, buildRoot) {\n var members = tuple.members;\n var length = members.length;\n var root = { members: [] };\n var levelName, levelNum;\n var name, parentName;\n var hasChildren;\n var hierarchy;\n var caption;\n var member;\n var idx = 0;\n\n if (measure) {\n length -= 1;\n }\n\n for (; idx < length; idx++) {\n member = members[idx];\n levelNum = Number(member.levelNum);\n\n name = member.name;\n parentName = member.parentName;\n caption = member.caption || name;\n hasChildren = member.hasChildren;\n hierarchy = member.hierarchy;\n levelName = member.levelName;\n\n if (buildRoot) {\n caption = \"All\";\n if (levelNum === 0) {\n parentName = member.name;\n } else {\n levelNum -= 1;\n }\n\n hasChildren = true;\n name = hierarchy = levelName = parentName;\n }\n\n root.members.push({\n name: name,\n children: [],\n caption: caption,\n levelName: levelName,\n levelNum: levelNum.toString(),\n hasChildren: hasChildren,\n hierarchy: hierarchy,\n parentName: !buildRoot ? parentName : \"\"\n });\n }\n\n if (measure) {\n root.members.push({\n name: measure.name,\n children: []\n });\n }\n\n return root;\n },\n\n _hasRoot: function(target, source, descriptors) {\n if (source.length) {\n return findExistingTuple(source, target).tuple;\n }\n\n var members = target.members;\n var member;\n var descriptor;\n\n var isRoot = true;\n var levelNum;\n\n for (var idx = 0, length = members.length; idx < length; idx++) {\n member = members[idx];\n levelNum = Number(member.levelNum) || 0;\n descriptor = descriptors[idx];\n\n if (!(levelNum === 0 || (descriptor && member.name === getName(descriptor)))) {\n isRoot = false;\n break;\n }\n }\n\n return isRoot;\n },\n\n _mergeAxes: function(sourceAxes, data, axisToSkip) {\n var columnMeasures = this._columnMeasures();\n var rowMeasures = this._rowMeasures();\n var axes = this.axes();\n var startIndex, tuples;\n\n var oldRowsLength = membersCount(axes.rows.tuples, rowMeasures);\n var newRowsLength = sourceAxes.rows.tuples.length;\n\n var oldColumnsLength = membersCount(axes.columns.tuples, columnMeasures);\n var newColumnsLength = sourceAxes.columns.tuples.length;\n\n if (axisToSkip == \"columns\") {\n newColumnsLength = oldColumnsLength;\n tuples = sourceAxes.columns.tuples;\n } else {\n tuples = parseSource(sourceAxes.columns.tuples, columnMeasures);\n data = prepareDataOnColumns(tuples, data);\n }\n\n var mergedColumns = mergeTuples(axes.columns.tuples, tuples, columnMeasures);\n\n if (axisToSkip == \"rows\") {\n newRowsLength = membersCount(sourceAxes.rows.tuples, rowMeasures);\n tuples = sourceAxes.rows.tuples;\n } else {\n tuples = parseSource(sourceAxes.rows.tuples, rowMeasures);\n data = prepareDataOnRows(tuples, data);\n }\n var mergedRows = mergeTuples(axes.rows.tuples, tuples, rowMeasures);\n\n axes.columns.tuples = mergedColumns.tuples;\n axes.rows.tuples = mergedRows.tuples;\n\n if (oldColumnsLength !== membersCount(axes.columns.tuples, columnMeasures)) {\n //columns are expanded\n startIndex = mergedColumns.index + findDataIndex(mergedColumns.parsedRoot, mergedColumns.memberIndex, columnMeasures);\n var offset = oldColumnsLength + newColumnsLength;\n data = this._mergeColumnData(data, startIndex, newRowsLength, newColumnsLength, offset);\n } else if (oldRowsLength !== membersCount(axes.rows.tuples, rowMeasures)) {\n //rows are expanded\n startIndex = mergedRows.index + findDataIndex(mergedRows.parsedRoot, mergedRows.memberIndex, rowMeasures);\n data = this._mergeRowData(data, startIndex, newRowsLength, newColumnsLength);\n }\n\n if (axes.columns.tuples.length === 0 && axes.rows.tuples.length === 0) {\n data = [];\n }\n\n return {\n axes: axes,\n data: data\n };\n },\n\n _mergeColumnData: function(newData, columnIndex, rowsLength, columnsLength, offset) {\n var data = this.data().toJSON();\n var rowIndex, index, drop = 0, toAdd;\n var columnMeasures = Math.max(this._columnMeasures().length, 1);\n\n rowsLength = Math.max(rowsLength, 1);\n\n if (data.length > 0) {\n //if there is already data, drop the first new data item\n drop = columnMeasures;\n offset -= columnMeasures;\n }\n\n for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n index = columnIndex + (rowIndex * offset);\n toAdd = newData.splice(0, columnsLength);\n toAdd.splice(0, drop);\n [].splice.apply(data, [index, 0].concat(toAdd));\n }\n\n return data;\n },\n\n _mergeRowData: function(newData, rowIndex, rowsLength, columnsLength) {\n var data = this.data().toJSON();\n var idx, dataIndex, toAdd;\n var rowMeasures = Math.max(this._rowMeasures().length, 1);\n\n columnsLength = Math.max(columnsLength, 1);\n if (data.length > 0) {\n //if there is already data, drop the first new data item\n rowsLength -= rowMeasures;\n newData.splice(0, columnsLength * rowMeasures);\n }\n\n for (idx = 0; idx < rowsLength; idx++) {\n toAdd = newData.splice(0, columnsLength);\n dataIndex = (rowIndex * columnsLength) + (idx * columnsLength);\n [].splice.apply(data, [dataIndex, 0].concat(toAdd));\n }\n\n return data;\n },\n\n _columnMeasures: function() {\n var measures = this.measures();\n var columnMeasures = [];\n\n if (this.measuresAxis() === \"columns\") {\n if (this.columns().length === 0) {\n columnMeasures = measures;\n } else if (measures.length > 1) {\n columnMeasures = measures;\n }\n }\n\n return columnMeasures;\n },\n\n _rowMeasures: function() {\n var measures = this.measures();\n var rowMeasures = [];\n\n if (this.measuresAxis() === \"rows\") {\n if (this.rows().length === 0) {\n rowMeasures = measures;\n } else if (measures.length > 1) {\n rowMeasures = measures;\n }\n }\n\n return rowMeasures;\n },\n\n _updateLocalData: function(data, state) {\n if (this.cubeBuilder) {\n if (state) {\n this._requestData = state;\n }\n data = this._processResult(data);\n }\n\n this._data = this._observe(data);\n\n this._ranges = [];\n this._addRange(this._data);\n\n this._total = this._data.length;\n this._pristineTotal = this._total;\n this._process(this._data);\n },\n\n data: function(value) {\n var that = this;\n if (value !== undefined$1) {\n this._pristineData = value.slice(0);\n this._updateLocalData(value, {\n columns: this.columns(),\n rows: this.rows(),\n measures: this.measures()\n });\n } else {\n return that._data;\n }\n },\n\n _normalizeTuples: function(tuples, source, descriptors, measures) {\n var length = measures.length || 1;\n var idx = 0;\n\n var roots = [];\n var indexes = {};\n var measureIdx = 0;\n var tuple, memberIdx, last;\n\n if (!tuples.length) {\n return;\n }\n\n if (this._skipNormalize <= 0 && !this._hasRoot(tuples[0], source, descriptors)) {\n this._skipNormalize = 0;\n for (; idx < length; idx++) {\n roots.push(this._createTuple(tuples[0], measures[idx], true));\n indexes[idx] = idx;\n }\n\n tuples.splice.apply(tuples, [0, tuples.length].concat(roots).concat(tuples));\n idx = length;\n }\n\n if (measures.length) {\n last = tuple = tuples[idx];\n memberIdx = tuple.members.length - 1;\n\n while (tuple) {\n if (measureIdx >= length) {\n measureIdx = 0;\n }\n\n if (tuple.members[memberIdx].name !== measures[measureIdx].name) {\n tuples.splice(idx, 0, this._createTuple(tuple, measures[measureIdx]));\n indexes[idx] = idx;\n }\n\n idx += 1;\n measureIdx += 1;\n tuple = tuples[idx];\n\n if (length > measureIdx && (!tuple || tupleName(last, memberIdx - 1) !== tupleName(tuple, memberIdx - 1))) {\n for (; measureIdx < length; measureIdx++) {\n tuples.splice(idx, 0, this._createTuple(last, measures[measureIdx]));\n indexes[idx] = idx;\n idx += 1;\n }\n tuple = tuples[idx];\n }\n last = tuple;\n }\n }\n\n return indexes;\n },\n\n _addMissingDataItems: function(result, metadata) {\n while (metadata.rowIndexes[parseInt(result.length / metadata.columnsLength, 10)] !== undefined$1) {\n for (var idx = 0; idx < metadata.columnsLength; idx++) {\n result = addEmptyDataItem(result);\n }\n }\n\n while (metadata.columnIndexes[result.length % metadata.columnsLength] !== undefined$1) {\n result = addEmptyDataItem(result);\n }\n\n return result;\n },\n\n _normalizeOrdinals: function(result, dataItem, metadata) {\n var lastOrdinal = metadata.lastOrdinal;\n\n if (!dataItem) {\n return addEmptyDataItem(result);\n }\n\n if ((dataItem.ordinal - lastOrdinal) > 1) {\n lastOrdinal += 1;\n\n while (lastOrdinal < dataItem.ordinal && result.length < metadata.length) {\n result = this._addMissingDataItems(addEmptyDataItem(result), metadata);\n lastOrdinal += 1;\n }\n }\n\n dataItem.ordinal = result.length;\n result[result.length] = dataItem;\n\n return result;\n },\n\n _normalizeData: function(options) {\n var data = options.data;\n var dataIdx = 0;\n var dataItem;\n var result = [];\n var lastOrdinal;\n var length;\n\n options.lastOrdinal = 0;\n options.columnIndexes = options.columnIndexes || {};\n options.rowIndexes = options.rowIndexes || {};\n options.columnsLength = options.columnsLength || 1;\n options.rowsLength = options.rowsLength || 1;\n options.length = options.columnsLength * options.rowsLength;\n length = options.length;\n\n if (data.length === length) {\n return data;\n }\n\n while (result.length < length) {\n dataItem = data[dataIdx++];\n if (dataItem) {\n lastOrdinal = dataItem.ordinal;\n }\n\n result = this._normalizeOrdinals(this._addMissingDataItems(result, options), dataItem, options);\n\n options.lastOrdinal = lastOrdinal;\n }\n\n return result;\n },\n\n discover: function(options, converter) {\n var that = this,\n transport = that.transport;\n\n return $.Deferred(function(deferred) {\n transport.discover(extend({\n success: function(response) {\n response = that.reader.parse(response);\n\n if (that._handleCustomErrors(response)) {\n return;\n }\n\n if (converter) {\n response = converter(response);\n }\n deferred.resolve(response);\n },\n error: function(response, status, error) {\n deferred.reject(response);\n that.error(response, status, error);\n }\n }, options));\n }).promise().done(function() {\n that.trigger(\"schemaChange\");\n });\n },\n\n schemaMeasures: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaMeasures\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }\n }, function(response) {\n return that.reader.measures(response);\n });\n },\n\n schemaKPIs: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaKPIs\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }\n }, function(response) {\n return that.reader.kpis(response);\n });\n },\n\n schemaDimensions: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaDimensions\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }\n }, function(response) {\n return that.reader.dimensions(response);\n });\n },\n\n schemaHierarchies: function(dimensionName) {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaHierarchies\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube(),\n dimensionUniqueName: dimensionName\n }\n }\n }, function(response) {\n return that.reader.hierarchies(response);\n });\n },\n\n schemaLevels: function(hierarchyName) {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaLevels\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube(),\n hierarchyUniqueName: hierarchyName\n }\n }\n }, function(response) {\n return that.reader.levels(response);\n });\n },\n\n schemaCubes: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaCubes\",\n restrictions: {\n catalogName: that.transport.catalog()\n }\n }\n }, function(response) {\n return that.reader.cubes(response);\n });\n },\n\n schemaCatalogs: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaCatalogs\"\n }\n }, function(response) {\n return that.reader.catalogs(response);\n });\n },\n\n schemaMembers: function(restrictions) {\n var that = this;\n var success = (function(restrictions) {\n return function(response) {\n return that.reader.members(response, restrictions);\n };\n }(restrictions));\n\n return that.discover({\n data: {\n command: \"schemaMembers\",\n restrictions: extend({\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }, restrictions)\n }\n }, success);\n },\n\n _params: function(data) {\n if (this._clearAxesData) {\n this._axes = {};\n this._data = this._observe([]);\n this._clearAxesData = false;\n this.trigger(STATERESET);\n }\n\n var options = DataSource.fn._params.call(this, data);\n\n options = extend({\n measures: this.measures(),\n measuresAxis: this.measuresAxis(),\n columns: this.columns(),\n rows: this.rows()\n }, options);\n\n if (this.cubeBuilder) {\n this._requestData = options;\n }\n\n return options;\n }\n });\n\n function flatColumns(columns) {\n var result = [];\n for (var idx = 0; idx < columns.length; idx++) {\n result.push(columns[idx]);\n if (columns[idx].children) {\n result = result.concat(flatColumns(columns[idx].children));\n }\n }\n\n return result;\n }\n\n function sortItemsTree(field, items, sortFunction) {\n for (var i = 0; i < items.length; i++) {\n if (items[i].children && items[i].children.length) {\n sortItemsTree(field, items[i].children, sortFunction);\n }\n }\n if (items[0].parentName != field) {\n return;\n }\n items = items.sort(sortFunction);\n }\n\n function fillSortTree(items, map) {\n for (var i = 0; i < items.length; i++) {\n var currentItem = map[items[i].name];\n\n if (!$.isEmptyObject(currentItem.childrenMap)) {\n items[i].children = [];\n for (var name in currentItem.childrenMap) {\n items[i].children.push($.extend({}, { name: name, parentName: map[name].parentName }));\n }\n\n fillSortTree(items[i].children, map);\n }\n }\n }\n\n function addEmptyDataItem(result) {\n result[result.length] = { value: \"\", fmtValue: \"\", ordinal: result.length };\n return result;\n }\n\n function validateAxis(newAxis, axis, measures) {\n if (newAxis.tuples.length < membersCount(axis.tuples, measures)) {\n\n return axis;\n }\n\n return;\n }\n\n function adjustDataByColumn(sourceTuples, targetTuples, rowsLength, measures, data) {\n var columnIdx, rowIdx, dataIdx;\n var columnsLength = sourceTuples.length;\n var targetColumnsLength = membersCount(targetTuples, measures);\n var measuresLength = measures.length || 1;\n\n for (rowIdx = 0; rowIdx < rowsLength; rowIdx++) {\n for (columnIdx = 0; columnIdx < columnsLength; columnIdx++) {\n dataIdx = tupleIndex(sourceTuples[columnIdx], targetTuples) * measuresLength;\n dataIdx += columnIdx % measuresLength;\n\n data[rowIdx * columnsLength + columnIdx].ordinal = rowIdx * targetColumnsLength + dataIdx;\n }\n }\n }\n\n function adjustDataByRow(sourceTuples, targetTuples, columnsLength, measures, data) {\n var columnIdx, rowIdx, dataIdx;\n var rowsLength = sourceTuples.length;\n var measuresLength = measures.length || 1;\n\n for (rowIdx = 0; rowIdx < rowsLength; rowIdx++) {\n dataIdx = tupleIndex(sourceTuples[rowIdx], targetTuples);\n dataIdx *= measuresLength;\n dataIdx += rowIdx % measuresLength;\n\n for (columnIdx = 0; columnIdx < columnsLength; columnIdx++) {\n data[rowIdx * columnsLength + columnIdx].ordinal = dataIdx * columnsLength + columnIdx;\n }\n }\n }\n\n function tupleIndex(tuple, collection) {\n return findExistingTuple(collection, tuple).index;\n }\n\n function membersCount(tuples, measures) {\n if (!tuples.length) {\n return 0;\n }\n\n var queue = tuples.slice();\n var current = queue.shift();\n var result = 1;\n\n while (current) {\n if (current.members) {\n [].push.apply(queue, current.members);\n } else if (current.children) {\n if (!current.measure) {\n result += current.children.length;\n }\n [].push.apply(queue, current.children);\n }\n\n current = queue.shift();\n }\n\n if (measures.length) {\n result = result * measures.length;\n }\n\n return result;\n }\n\n function normalizeAxis(axis) {\n if (!axis) {\n axis = {\n tuples: []\n };\n }\n\n if (!axis.tuples) {\n axis.tuples = [];\n }\n\n return axis;\n }\n\n function findDataIndex(tuple, memberIndex, measures) {\n if (!tuple) {\n return 0;\n }\n\n var measuresLength = Math.max(measures.length, 1);\n var tuples = tuple.members.slice(0, memberIndex);\n var current = tuples.shift();\n\n //the initial value is equal to the total number of measures\n //as the measures member is not extracted from the members of the starting tuple\n //but should be calculated in the final result\n var counter = measuresLength;\n\n while (current) {\n if (current.name === MEASURES) {\n //subtract 1 as the measures member has been already counted as a single standard member\n //but we are interested in the total number of measures instead\n counter += (measuresLength - 1);\n } else if (current.children) {\n //is member\n [].push.apply(tuples, current.children);\n } else {\n //is tuple\n counter ++;\n [].push.apply(tuples, current.members);\n }\n\n current = tuples.shift();\n }\n\n return counter;\n }\n\n function mergeTuples(target, source, measures) {\n if (!source[0]) {\n return {\n parsedRoot: null,\n tuples: target,\n memberIndex: 0,\n index: 0\n };\n }\n\n var result = findExistingTuple(target, source[0]);\n\n if (!result.tuple) {\n return {\n parsedRoot: null,\n tuples: source,\n memberIndex: 0,\n index: 0\n };\n }\n\n var targetMembers = result.tuple.members;\n var sourceMembers = source[0].members;\n var memberIndex = -1;\n\n if (targetMembers.length !== sourceMembers.length) {\n return {\n parsedRoot: null,\n tuples: source,\n memberIndex: 0,\n index: 0\n };\n }\n\n for (var idx = 0, length = targetMembers.length; idx < length; idx++) {\n if (!targetMembers[idx].measure && sourceMembers[idx].children[0]) {\n if (memberIndex == -1 && sourceMembers[idx].children.length) {\n memberIndex = idx;\n }\n\n targetMembers[idx].children = sourceMembers[idx].children;\n }\n }\n\n measures = Math.max(measures.length, 1);\n\n return {\n parsedRoot: result.tuple,\n index: result.index * measures,\n memberIndex: memberIndex,\n tuples: target\n };\n }\n\n function equalTuples(first, second) {\n var equal = true;\n var idx, length;\n\n first = first.members;\n second = second.members;\n\n for (idx = 0, length = first.length; idx < length; idx++) {\n if (first[idx].measure || second[idx].measure) {\n continue;\n }\n\n equal = equal && (getName(first[idx]) === getName(second[idx]));\n }\n\n return equal;\n }\n\n function findExistingTuple(tuples, toFind) {\n var idx, length, tuple, found, counter = 0;\n var memberIndex, membersLength, member;\n\n for (idx = 0, length = tuples.length; idx < length; idx++) {\n tuple = tuples[idx];\n if (equalTuples(tuple, toFind)) {\n return {\n tuple: tuple,\n index: counter\n };\n }\n\n counter ++;\n\n for (memberIndex = 0, membersLength = tuple.members.length; memberIndex < membersLength; memberIndex++) {\n member = tuple.members[memberIndex];\n if (member.measure) {\n //counter += member.children.length;\n continue;\n }\n found = findExistingTuple(member.children, toFind);\n counter += found.index;\n if (found.tuple) {\n return {\n tuple: found.tuple,\n index: counter\n };\n }\n }\n }\n\n return {\n index: counter\n };\n }\n\n function addMembers(members, map) {\n var member, i, len, path = \"\";\n for (i = 0, len = members.length; i < len; i++) {\n member = members[i];\n path += member.name;\n if (!map[path]) {\n map[path] = member;\n }\n }\n }\n\n\n function findParentMember(tuple, map) {\n var members = tuple.members;\n var i, len, member, path = \"\";\n var parentPath = \"\";\n var parentMember;\n\n for (i = 0, len = members.length; i < len; i++) {\n member = members[i];\n if (parentMember) {\n if (map[path + member.name]) {\n path += member.name;\n parentMember = map[path];\n continue;\n } else if (map[path + member.parentName]) {\n return map[path + member.parentName];\n } else if (map[parentPath + member.parentName]) {\n return map[parentPath + member.parentName];\n } else {\n return map[parentPath];\n }\n }\n\n path += member.name;\n parentMember = map[member.parentName];\n\n if (!parentMember) {\n parentMember = map[path];\n if (!parentMember) {\n return null;\n }\n }\n\n if (parentMember) {\n parentPath += parentMember.name;\n }\n }\n\n return parentMember;\n }\n\n function measurePosition(tuple, measures) {\n if (measures.length === 0) {\n return -1;\n }\n\n var measure = measures[0];\n var members = tuple.members;\n for (var idx = 0, len = members.length; idx < len; idx ++) {\n if (members[idx].name == measure.name) {\n return idx;\n }\n }\n }\n\n function normalizeTupleMeasures(tuple, index) {\n if (index < 0) {\n return;\n }\n var member = {\n name: MEASURES,\n measure: true,\n children: [\n $.extend({ members: [], dataIndex: tuple.dataIndex }, tuple.members[index])\n ]\n };\n tuple.members.splice(index, 1, member);\n tuple.dataIndex = undefined$1;\n }\n\n function parseSource(tuples, measures) {\n if (tuples.length < 1) {\n return [];\n }\n var result = [];\n var map = { };\n var measureIndex = measurePosition(tuples[0], measures);\n\n for (var i = 0; i < tuples.length; i++) {\n var tuple = tuples[i];\n\n //keep the old data index of the tuple\n tuple.dataIndex = i;\n\n normalizeTupleMeasures(tuple, measureIndex);\n var parentMember = findParentMember(tuple, map);\n\n if (parentMember) {\n if (measureIndex < 0 || !parentMember.measure) {\n parentMember.children.push(tuple);\n } else {\n parentMember.children.push(tuple.members[measureIndex].children[0]);\n }\n } else {\n result.push(tuple);\n }\n\n addMembers(tuple.members, map);\n }\n\n return result;\n }\n\n function prepareDataOnRows(tuples, data) {\n if (!tuples || !tuples.length) {\n return data;\n }\n\n var result = [];\n var indices = buildDataIndices(tuples);\n var rowsLength = indices.length;\n var columnsLength = Math.max(data.length / rowsLength, 1);\n var rowIndex, columnIndex, targetIndex, sourceIndex;\n var calcIndex;\n\n for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n targetIndex = columnsLength * rowIndex;\n sourceIndex = columnsLength * indices[rowIndex];\n for (columnIndex = 0; columnIndex < columnsLength; columnIndex++) {\n calcIndex = parseInt(sourceIndex + columnIndex, 10);\n result[parseInt(targetIndex + columnIndex, 10)] = data[calcIndex] || { value: \"\", fmtValue: \"\", ordinal: calcIndex };\n }\n }\n\n return result;\n }\n\n function prepareDataOnColumns(tuples, data) {\n if (!tuples || !tuples.length) {\n return data;\n }\n\n var result = [];\n var indices = buildDataIndices(tuples);\n var columnsLength = indices.length;\n var rowsLength = Math.max(data.length / columnsLength, 1);\n var columnIndex, rowIndex, dataIndex, calcIndex;\n\n for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n dataIndex = columnsLength * rowIndex;\n for (columnIndex = 0; columnIndex < columnsLength; columnIndex++) {\n calcIndex = indices[columnIndex] + dataIndex;\n result[dataIndex + columnIndex] = data[calcIndex] || { value: \"\", fmtValue: \"\", ordinal: calcIndex };\n }\n }\n\n return result;\n }\n\n function buildDataIndices(tuples) {\n tuples = tuples.slice();\n var result = [];\n var tuple = tuples.shift();\n var idx, length, spliceIndex, children, member;\n\n while (tuple) {\n //required for multiple measures\n if (tuple.dataIndex !== undefined$1) {\n result.push(tuple.dataIndex);\n }\n\n spliceIndex = 0;\n for (idx = 0, length = tuple.members.length; idx < length; idx++) {\n member = tuple.members[idx];\n children = member.children;\n if (member.measure) {\n [].splice.apply(tuples, [0, 0].concat(children));\n } else {\n [].splice.apply(tuples, [spliceIndex, 0].concat(children));\n }\n spliceIndex += children.length;\n }\n\n tuple = tuples.shift();\n }\n\n return result;\n }\n\n PivotDataSourceV2.create = function(options) {\n options = options && options.push ? { data: options } : options;\n\n var dataSource = options || {},\n data = dataSource.data;\n\n dataSource.data = data;\n\n if (!(dataSource instanceof PivotDataSourceV2) && dataSource instanceof kendo.data.DataSource) {\n throw new Error(\"Incorrect DataSource type. Only PivotDataSource instances are supported\");\n }\n\n return dataSource instanceof PivotDataSourceV2 ? dataSource : new PivotDataSourceV2(dataSource);\n };\n\n PivotDataSource.create = function(options) {\n options = options && options.push ? { data: options } : options;\n\n var dataSource = options || {},\n data = dataSource.data;\n\n dataSource.data = data;\n\n if (!(dataSource instanceof PivotDataSource) && dataSource instanceof kendo.data.DataSource) {\n throw new Error(\"Incorrect DataSource type. Only PivotDataSource instances are supported\");\n }\n\n return dataSource instanceof PivotDataSource ? dataSource : new PivotDataSource(dataSource);\n };\n\n function baseHierarchyPath(memberName) {\n var parts = memberName.split(\".\");\n if (parts.length > 2) {\n return parts[0] + \".\" + parts[1];\n }\n return memberName;\n }\n\n function expandMemberDescriptor(names, sort) {\n var idx = names.length - 1;\n var name = names[idx];\n var sortDescriptor;\n\n sortDescriptor = sortDescriptorForMember(sort, name);\n\n if (sortDescriptor && sortDescriptor.dir) {\n name = \"ORDER(\" + name + \".Children,\" + sortDescriptor.field + \".CurrentMember.MEMBER_CAPTION,\" + sortDescriptor.dir + \")\";\n } else {\n name += \".Children\";\n }\n\n names[idx] = name;\n\n return names;\n }\n\n function sortDescriptorForMember(sort, member) {\n for (var idx = 0, length = sort.length; idx < length; idx++) {\n if (member.indexOf(sort[idx].field) === 0) {\n return sort[idx];\n }\n }\n return null;\n }\n\n function crossJoin(names) {\n var result = \"CROSSJOIN({\";\n var r;\n\n if (names.length > 2) {\n r = names.pop();\n result += crossJoin(names);\n } else {\n result += names.shift();\n r = names.pop();\n }\n\n result += \"},{\";\n result += r;\n result += \"})\";\n return result;\n }\n\n function crossJoinCommand(members, measures) {\n var tmp = members.slice(0);\n\n if (measures.length > 1) {\n tmp.push(\"{\" + measureNames(measures).join(\",\") + \"}\");\n }\n\n return crossJoin(tmp);\n }\n\n function measureNames(measures) {\n var idx = 0;\n var length = measures.length;\n var result = [];\n var measure;\n\n for (; idx < length; idx++) {\n measure = measures[idx];\n result.push(measure.name !== undefined$1 ? measure.name : measure);\n }\n\n return result;\n }\n\n function indexOf(name, items) {\n var idx, length, index = -1;\n\n for (idx = 0, length = items.length; idx < length; idx++) {\n if (getName(items[idx]) === name) {\n index = idx;\n break;\n }\n }\n return index;\n }\n\n function getName(name) {\n name = name.name || name;\n\n if (toString.call(name) === \"[object Array]\") {\n name = name[name.length - 1];\n }\n\n return name;\n }\n\n function getRootNames(members) {\n var length = members.length;\n var names = [];\n var idx = 0;\n\n for (; idx < length; idx++) {\n names.push(members[idx].name[0]);\n }\n\n return names;\n }\n\n function mapNames(names, rootNames) {\n var name;\n var rootName;\n\n var j;\n var idx = 0;\n var length = names.length;\n var rootLength = rootNames.length;\n\n rootNames = rootNames.slice(0);\n\n for (; idx < length; idx++) {\n name = names[idx];\n\n for (j = 0; j < rootLength; j++) {\n rootName = baseHierarchyPath(rootNames[j]);\n\n if (name.indexOf(rootName) !== -1) {\n rootNames[j] = name;\n break;\n }\n }\n }\n\n return {\n names: rootNames,\n expandedIdx: j,\n uniquePath: rootNames.slice(0, j + 1).join(\"\")\n };\n }\n\n function parseDescriptors(members) {\n var expanded = [];\n var child = [];\n var root = [];\n var member;\n\n var j, l;\n var idx = 0;\n var length = members.length;\n\n var name;\n var hierarchyName;\n\n var found;\n\n for (; idx < length; idx++) {\n member = members[idx];\n name = member.name;\n found = false;\n\n if (toString.call(name) !== \"[object Array]\") {\n member.name = name = [name];\n }\n\n if (name.length > 1) {\n child.push(member);\n } else {\n hierarchyName = baseHierarchyPath(name[0]);\n\n for (j = 0, l = root.length; j < l; j++) {\n if (root[j].name[0].indexOf(hierarchyName) === 0) {\n found = true;\n break;\n }\n }\n\n if (!found) {\n root.push(member);\n }\n\n if (member.expand) {\n expanded.push(member);\n }\n }\n }\n\n expanded = expanded.concat(child);\n\n return {\n root: root,\n expanded: expanded\n };\n }\n\n function serializeMembers(members, measures, sort) {\n var command = \"\";\n\n members = members || [];\n\n var expanded = parseDescriptors(members);\n var root = expanded.root;\n\n var rootNames = getRootNames(root);\n var crossJoinCommands = [];\n\n expanded = expanded.expanded;\n\n var length = expanded.length;\n var idx = 0;\n\n var memberName;\n var names = [];\n\n if (rootNames.length > 1 || measures.length > 1) {\n crossJoinCommands.push(crossJoinCommand(rootNames, measures));\n\n for (; idx < length; idx++) {\n memberName = expandMemberDescriptor(expanded[idx].name, sort);\n names = mapNames(memberName, rootNames).names;\n\n crossJoinCommands.push(crossJoinCommand(names, measures));\n }\n\n command += crossJoinCommands.join(\",\");\n } else {\n for (; idx < length; idx++) {\n memberName = expandMemberDescriptor(expanded[idx].name, sort);\n names.push(memberName[0]); //check if this is ok\n }\n\n command += rootNames.concat(names).join(\",\");\n }\n\n return command;\n }\n\n var filterFunctionFormats = {\n contains: \", InStr({0}.CurrentMember.MEMBER_CAPTION,\\\"{1}\\\") > 0\",\n doesnotcontain: \", InStr({0}.CurrentMember.MEMBER_CAPTION,\\\"{1}\\\")\",\n startswith: \", Left({0}.CurrentMember.MEMBER_CAPTION,Len(\\\"{1}\\\"))=\\\"{1}\\\"\",\n endswith: \", Right({0}.CurrentMember.MEMBER_CAPTION,Len(\\\"{1}\\\"))=\\\"{1}\\\"\",\n eq: \", {0}.CurrentMember.MEMBER_CAPTION = \\\"{1}\\\"\",\n neq: \", {0}.CurrentMember.MEMBER_CAPTION = \\\"{1}\\\"\"\n };\n\n function serializeExpression(expression) {\n var command = \"\";\n var value = expression.value;\n var field = expression.field;\n var operator = expression.operator;\n\n if (operator == \"in\") {\n command += \"{\";\n command += value;\n command += \"}\";\n } else {\n command += operator == \"neq\" || operator == \"doesnotcontain\" ? \"-\" : \"\";\n command += \"Filter(\";\n command += field + \".MEMBERS\";\n command += kendo.format(filterFunctionFormats[operator], field, value);\n command += \")\";\n }\n\n return command;\n }\n\n function serializeFilters(filter, cube) {\n var command = \"\", current;\n var filters = filter.filters;\n var length = filters.length;\n var idx;\n\n for (idx = length - 1; idx >= 0; idx--) {\n\n current = \"SELECT (\";\n current += serializeExpression(filters[idx]);\n current += \") ON 0\";\n\n if (idx == length - 1) {\n current += \" FROM [\" + cube + \"]\";\n command = current;\n } else {\n command = current + \" FROM ( \" + command + \" )\";\n }\n }\n\n return command;\n }\n\n function serializeOptions(parentTagName, options, capitalize) {\n var result = \"\";\n\n if (options) {\n result += \"<\" + parentTagName + \">\";\n var value;\n for (var key in options) {\n value = options[key];\n if (capitalize) {\n key = key.replace(/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g, \"$1_\").toUpperCase().replace(/_$/, \"\");\n }\n result += \"<\" + key + \">\" + value + \"\";\n }\n result += \"\";\n } else {\n result += \"<\" + parentTagName + \"/>\";\n }\n return result;\n }\n\n var xmlaDiscoverCommands = {\n schemaCubes: \"MDSCHEMA_CUBES\",\n schemaCatalogs: \"DBSCHEMA_CATALOGS\",\n schemaMeasures: \"MDSCHEMA_MEASURES\",\n schemaDimensions: \"MDSCHEMA_DIMENSIONS\",\n schemaHierarchies: \"MDSCHEMA_HIERARCHIES\",\n schemaLevels: \"MDSCHEMA_LEVELS\",\n schemaMembers: \"MDSCHEMA_MEMBERS\",\n schemaKPIs: \"MDSCHEMA_KPIS\"\n };\n\n var convertersMap = {\n read: function(options) {\n var command = '
';\n\n command += \"SELECT NON EMPTY {\";\n\n var columns = options.columns || [];\n var rows = options.rows || [];\n\n var measures = options.measures || [];\n var measuresRowAxis = options.measuresAxis === \"rows\";\n var sort = options.sort || [];\n\n if (!columns.length && rows.length && (!measures.length || (measures.length && measuresRowAxis))) {\n columns = rows;\n rows = [];\n measuresRowAxis = false;\n }\n\n if (!columns.length && !rows.length) {\n measuresRowAxis = false;\n }\n\n if (columns.length) {\n command += serializeMembers(columns, !measuresRowAxis ? measures : [], sort);\n } else if (measures.length && !measuresRowAxis) {\n command += measureNames(measures).join(\",\");\n }\n\n command += \"} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON COLUMNS\";\n\n if (rows.length || (measuresRowAxis && measures.length > 1)) {\n command += \", NON EMPTY {\";\n\n if (rows.length) {\n command += serializeMembers(rows, measuresRowAxis ? measures : [], sort);\n } else {\n command += measureNames(measures).join(\",\");\n }\n\n command += \"} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON ROWS\";\n }\n\n if (options.filter) {\n command += \" FROM \";\n command += \"(\";\n command += serializeFilters(options.filter, options.connection.cube);\n command += \")\";\n } else {\n command += \" FROM [\" + options.connection.cube + \"]\";\n }\n\n if (measures.length == 1 && columns.length) {\n command += \" WHERE (\" + measureNames(measures).join(\",\") + \")\";\n }\n\n command += '' + options.connection.catalog + 'Multidimensional';\n return command.replace(/\\&/g, \"&\");\n },\n discover: function(options) {\n options = options || {};\n\n var command = '
';\n command += \"\" + (xmlaDiscoverCommands[options.command] || options.command) + \"\";\n\n command += \"\" + serializeOptions(\"RestrictionList\", options.restrictions, true) + \"\";\n\n if (options.connection && options.connection.catalog) {\n options.properties = $.extend({}, {\n Catalog: options.connection.catalog\n }, options.properties);\n }\n\n command += \"\" + serializeOptions(\"PropertyList\", options.properties) + \"\";\n\n command += '';\n return command;\n }\n };\n\n var XmlaTransport = kendo.data.RemoteTransport.extend({\n init: function(options) {\n var originalOptions = options;\n\n options = this.options = extend(true, {}, this.options, options);\n\n kendo.data.RemoteTransport.call(this, options);\n\n if (isFunction(originalOptions.discover)) {\n this.discover = originalOptions.discover;\n } else if (typeof originalOptions.discover === \"string\") {\n this.options.discover = {\n url: originalOptions.discover\n };\n } else if (!originalOptions.discover) {\n this.options.discover = this.options.read;\n }\n },\n setup: function(options, type) {\n options.data = options.data || {};\n $.extend(true, options.data, { connection: this.options.connection });\n\n return kendo.data.RemoteTransport.fn.setup.call(this, options, type);\n },\n options: {\n read: {\n dataType: \"text\",\n contentType: \"text/xml\",\n type: \"POST\"\n },\n discover: {\n dataType: \"text\",\n contentType: \"text/xml\",\n type: \"POST\"\n },\n parameterMap: function(options, type) {\n return convertersMap[type](options,type);\n }\n },\n\n discover: function(options) {\n return $.ajax(this.setup(options, \"discover\"));\n }\n });\n\n var XmlaTransportV2 = Class.extend({\n init: function(options) {\n options = this.options = extend(true, {}, this.options, options);\n },\n setup: function(options) {\n return $.extend(true, options || {}, { connection: this.options.connection });\n },\n read: function(options) {\n var that = this,\n success,\n error;\n\n var fetchOptions = that.setup(options.data, READ);\n\n success = options.success || $.noop;\n error = options.error || $.noop;\n\n if (options.parameterMap) {\n fetchOptions = that.parameterMap(fetchOptions, READ);\n }\n\n fetchData({ url: that.options.read }, fetchOptions)\n .then(createDataState)\n .then(function(newDataState) {\n success(newDataState);\n })\n .catch(function(err) { error(err); });\n },\n\n catalog: function(val) {\n var options = this.options || {};\n\n if (val === undefined$1) {\n return (options.connection || {}).catalog;\n\n }\n\n var connection = options.connection || {};\n connection.catalog = val;\n\n this.options.connection = connection;\n $.extend(this.transport.options, { connection: connection });\n },\n cube: function(val) {\n var options = this.options || {};\n\n if (val === undefined$1) {\n return (options.connection || {}).cube;\n }\n\n var connection = options.connection || {};\n connection.cube = val;\n\n this.options.connection = connection;\n extend(true, this.transport.options, { connection: connection });\n },\n\n discover: function(options) {\n return fetchDiscover({ url: this.options.read }, options);\n }\n });\n\n function asArray(object) {\n if (object == null) {\n return [];\n }\n\n var type = toString.call(object);\n if (type !== \"[object Array]\") {\n return [object];\n }\n\n return object;\n }\n\n function translateAxis(axis) {\n var result = { tuples: [] };\n var tuples = asArray(kendo.getter(\"Tuples.Tuple\", true)(axis));\n var captionGetter = kendo.getter(\"Caption['#text']\");\n var unameGetter = kendo.getter(\"UName['#text']\");\n var levelNameGetter = kendo.getter(\"LName['#text']\");\n var levelNumGetter = kendo.getter(\"LNum['#text']\");\n var childrenGetter = kendo.getter(\"CHILDREN_CARDINALITY['#text']\", true);\n var hierarchyGetter = kendo.getter(\"['@Hierarchy']\");\n var parentNameGetter = kendo.getter(\"PARENT_UNIQUE_NAME['#text']\", true);\n\n for (var idx = 0; idx < tuples.length; idx++) {\n var members = [];\n var member = asArray(tuples[idx].Member);\n for (var memberIdx = 0; memberIdx < member.length; memberIdx++) {\n members.push({\n children: [],\n caption: captionGetter(member[memberIdx]),\n name: unameGetter(member[memberIdx]),\n levelName: levelNameGetter(member[memberIdx]),\n levelNum: levelNumGetter(member[memberIdx]),\n hasChildren: parseInt(childrenGetter(member[memberIdx]), 10) > 0,\n parentName: parentNameGetter(member[memberIdx]),\n hierarchy: hierarchyGetter(member[memberIdx])\n });\n }\n\n result.tuples.push({ members: members });\n }\n return result;\n }\n\n var schemaDataReaderMap = {\n cubes: {\n name: kendo.getter(\"CUBE_NAME['#text']\", true),\n caption: kendo.getter(\"CUBE_CAPTION['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n type: kendo.getter(\"CUBE_TYPE['#text']\", true)\n },\n catalogs: {\n name: kendo.getter(\"CATALOG_NAME['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true)\n },\n measures: {\n name: kendo.getter(\"MEASURE_NAME['#text']\", true),\n caption: kendo.getter(\"MEASURE_CAPTION['#text']\", true),\n uniqueName: kendo.getter(\"MEASURE_UNIQUE_NAME['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n aggregator: kendo.getter(\"MEASURE_AGGREGATOR['#text']\", true),\n groupName: kendo.getter(\"MEASUREGROUP_NAME['#text']\", true),\n displayFolder: kendo.getter(\"MEASURE_DISPLAY_FOLDER['#text']\", true),\n defaultFormat: kendo.getter(\"DEFAULT_FORMAT_STRING['#text']\", true)\n },\n kpis: {\n name: kendo.getter(\"KPI_NAME['#text']\", true),\n caption: kendo.getter(\"KPI_CAPTION['#text']\", true),\n value: kendo.getter(\"KPI_VALUE['#text']\", true),\n goal: kendo.getter(\"KPI_GOAL['#text']\", true),\n status: kendo.getter(\"KPI_STATUS['#text']\", true),\n trend: kendo.getter(\"KPI_TREND['#text']\", true),\n statusGraphic: kendo.getter(\"KPI_STATUS_GRAPHIC['#text']\", true),\n trendGraphic: kendo.getter(\"KPI_TREND_GRAPHIC['#text']\", true),\n description: kendo.getter(\"KPI_DESCRIPTION['#text']\", true),\n groupName: kendo.getter(\"MEASUREGROUP_NAME['#text']\", true)\n },\n dimensions: {\n name: kendo.getter(\"DIMENSION_NAME['#text']\", true),\n caption: kendo.getter(\"DIMENSION_CAPTION['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n uniqueName: kendo.getter(\"DIMENSION_UNIQUE_NAME['#text']\", true),\n defaultHierarchy: kendo.getter(\"DEFAULT_HIERARCHY['#text']\", true),\n type: kendo.getter(\"DIMENSION_TYPE['#text']\", true)\n //unknown = 0; time = 1; measure = 2; other = 3; quantitative = 5; accounts = 6; customers = 7; products = 8; scenario = 9; utility = 10; currency = 11; rates = 12; channel = 13; promotion = 14; organization = 15; billOfMaterials = 16; geography = 17;\n\n },\n hierarchies: {\n name: kendo.getter(\"HIERARCHY_NAME['#text']\", true),\n caption: kendo.getter(\"HIERARCHY_CAPTION['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n uniqueName: kendo.getter(\"HIERARCHY_UNIQUE_NAME['#text']\", true),\n dimensionUniqueName: kendo.getter(\"DIMENSION_UNIQUE_NAME['#text']\", true),\n displayFolder: kendo.getter(\"HIERARCHY_DISPLAY_FOLDER['#text']\", true),\n origin: kendo.getter(\"HIERARCHY_ORIGIN['#text']\", true),\n defaultMember: kendo.getter(\"DEFAULT_MEMBER['#text']\", true)\n },\n levels: {\n name: kendo.getter(\"LEVEL_NAME['#text']\", true),\n caption: kendo.getter(\"LEVEL_CAPTION['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n uniqueName: kendo.getter(\"LEVEL_UNIQUE_NAME['#text']\", true),\n dimensionUniqueName: kendo.getter(\"DIMENSION_UNIQUE_NAME['#text']\", true),\n displayFolder: kendo.getter(\"LEVEL_DISPLAY_FOLDER['#text']\", true),\n orderingProperty: kendo.getter(\"LEVEL_ORDERING_PROPERTY['#text']\", true),\n origin: kendo.getter(\"LEVEL_ORIGIN['#text']\", true),\n hierarchyUniqueName: kendo.getter(\"HIERARCHY_UNIQUE_NAME['#text']\", true)\n },\n members: {\n name: kendo.getter(\"MEMBER_NAME['#text']\", true),\n caption: kendo.getter(\"MEMBER_CAPTION['#text']\", true),\n uniqueName: kendo.getter(\"MEMBER_UNIQUE_NAME['#text']\", true),\n dimensionUniqueName: kendo.getter(\"DIMENSION_UNIQUE_NAME['#text']\", true),\n hierarchyUniqueName: kendo.getter(\"HIERARCHY_UNIQUE_NAME['#text']\", true),\n levelUniqueName: kendo.getter(\"LEVEL_UNIQUE_NAME['#text']\", true),\n childrenCardinality: kendo.getter(\"CHILDREN_CARDINALITY['#text']\", true)\n }\n };\n\n var xmlaReaderMethods = [\"axes\", \"catalogs\", \"cubes\", \"dimensions\", \"hierarchies\", \"levels\", \"measures\"];\n\n var XmlaDataReader = kendo.data.XmlDataReader.extend({\n init: function(options) {\n kendo.data.XmlDataReader.call(this, options);\n\n this._extend(options);\n },\n _extend: function(options) {\n var idx = 0;\n var length = xmlaReaderMethods.length;\n var methodName;\n var option;\n\n for (; idx < length; idx++) {\n methodName = xmlaReaderMethods[idx];\n option = options[methodName];\n\n if (option && option !== identity) {\n this[methodName] = option;\n }\n }\n },\n parse: function(xml) {\n var result = kendo.data.XmlDataReader.fn.parse(xml.replace(/<(\\/?)(\\w|-)+:/g, \"<$1\"));\n return kendo.getter(\"['Envelope']['Body']\", true)(result);\n },\n errors: function(root) {\n var fault = kendo.getter(\"['Fault']\", true)(root);\n if (fault) {\n return [{\n faultstring: kendo.getter(\"faultstring['#text']\", true)(fault),\n faultcode: kendo.getter(\"faultcode['#text']\", true)(fault)\n }];\n }\n return null;\n },\n axes: function(root) {\n root = kendo.getter(\"ExecuteResponse[\\\"return\\\"].root\", true)(root);\n\n var axes = asArray(kendo.getter(\"Axes.Axis\", true)(root));\n var axis;\n\n var result = {\n columns: {},\n rows: {}\n };\n\n for (var idx = 0; idx < axes.length; idx++) {\n axis = axes[idx];\n\n if (axis[\"@name\"].toLowerCase() !== \"sliceraxis\") {\n if (!result.columns.tuples) {\n result.columns = translateAxis(axis);\n } else {\n result.rows = translateAxis(axis);\n }\n }\n }\n\n return result;\n },\n data: function(root) {\n root = kendo.getter(\"ExecuteResponse[\\\"return\\\"].root\", true)(root);\n\n var cells = asArray(kendo.getter(\"CellData.Cell\", true)(root));\n\n var result = [];\n var ordinalGetter = kendo.getter(\"['@CellOrdinal']\");\n var valueGetter = kendo.getter(\"Value['#text']\");\n var fmtValueGetter = kendo.getter(\"FmtValue['#text']\");\n\n for (var idx = 0; idx < cells.length; idx++) {\n result.push({\n value: valueGetter(cells[idx]),\n fmtValue: fmtValueGetter(cells[idx]),\n ordinal: parseInt(ordinalGetter(cells[idx]), 10)\n });\n }\n\n return result;\n },\n _mapSchema: function(root, getters) {\n root = kendo.getter(\"DiscoverResponse[\\\"return\\\"].root\", true)(root);\n var rows = asArray(kendo.getter(\"row\", true)(root));\n\n var result = [];\n\n for (var idx = 0; idx < rows.length; idx++) {\n var obj = {};\n for (var key in getters) {\n obj[key] = getters[key](rows[idx]);\n }\n result.push(obj);\n }\n\n return result;\n },\n measures: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.measures);\n },\n kpis: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.kpis);\n },\n hierarchies: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.hierarchies);\n },\n levels: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.levels);\n },\n dimensions: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.dimensions);\n },\n cubes: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.cubes);\n },\n catalogs: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.catalogs);\n },\n members: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.members);\n }\n });\n\n extend(true, kendo.data, {\n PivotDataSource: PivotDataSource,\n PivotDataSourceV2: PivotDataSourceV2,\n XmlaTransport: XmlaTransport,\n XmlaDataReader: XmlaDataReader,\n PivotCubeBuilder: PivotCubeBuilder,\n transports: {\n xmla: XmlaTransport\n },\n readers: {\n xmla: XmlaDataReader\n }\n });\n\n var sortExpr = function(expressions, name) {\n if (!expressions) {\n return null;\n }\n\n for (var idx = 0, length = expressions.length; idx < length; idx++) {\n if (expressions[idx].field === name) {\n return expressions[idx];\n }\n }\n\n return null;\n };\n\n var removeExpr = function(expressions, name) {\n var result = [];\n\n for (var idx = 0, length = expressions.length; idx < length; idx++) {\n if (expressions[idx].field !== name) {\n result.push(expressions[idx]);\n }\n }\n\n return result;\n };\n\n kendo.ui.PivotSettingTarget = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that.element.addClass(\"k-pivot-setting\");\n\n that.dataSource = kendo.data.PivotDataSource.create(options.dataSource);\n\n that._refreshHandler = that.refresh.bind(that);\n that.dataSource.first(CHANGE, that._refreshHandler);\n\n if (!options.template) {\n var actions = '';\n\n if (that.options.enabled) {\n actions = `${kendo.ui.icon(\"x\")}`;\n }\n\n that.options.template = (data) => ''\n + ``\n + ''\n + `${data.name || data}`\n + ''\n + '' + actions + ''\n + '';\n }\n\n that.template = kendo.template(that.options.template);\n that.emptyTemplate = kendo.template(that.options.emptyTemplate);\n\n that._sortable();\n\n that.element.on(\"click\" + NS, '.k-chip, .k-button' , function(e) {\n var target = $(e.target).closest(\":not(path,svg)\");\n var action = target.closest('.k-chip-action');\n var name = target.closest(\"[\" + kendo.attr(\"name\") + \"]\")\n .attr(kendo.attr(\"name\"));\n\n if (!name) {\n return;\n }\n\n if (action.hasClass(\"k-setting-delete\")) {\n that.remove(name);\n return;\n }\n\n if (target.closest('.k-chip-actions').length > 0) {\n return;\n }\n\n if (that.options.sortable) {\n var sortDirection = $(e.currentTarget).closest(\":not(path,svg)\").find('.k-i-sort-asc-small,.k-svg-i-sort-asc-small').length ? 'desc' : 'asc';\n\n that.sort({\n field: name,\n dir: sortDirection\n });\n }\n });\n\n if (options.filterable || options.sortable) {\n that.fieldMenu = new ui.PivotFieldMenu(that.element, {\n messages: that.options.messages.fieldMenu,\n filter: \".k-setting-fieldmenu\",\n filterable: options.filterable,\n sortable: options.sortable,\n dataSource: that.dataSource\n });\n }\n\n that.refresh();\n },\n\n options: {\n name: \"PivotSettingTarget\",\n template: null,\n filterable: false,\n sortable: false,\n emptyTemplate: (data) => `
${data}
`,\n setting: \"columns\",\n enabled: true,\n messages: {\n empty: \"Drop Fields Here\"\n }\n },\n setDataSource: function(dataSource) {\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.dataSource = this.options.dataSource = dataSource;\n\n if (this.fieldMenu) {\n this.fieldMenu.setDataSource(dataSource);\n }\n dataSource.first(CHANGE, this._refreshHandler);\n\n this.refresh();\n },\n\n _sortable: function() {\n var that = this;\n\n if (that.options.enabled) {\n this.sortable = this.element.kendoSortable({\n connectWith: this.options.connectWith,\n hint: that.options.hint,\n filter: \">*:not(.k-empty)\",\n cursor: \"move\",\n start: function(e) {\n e.item.trigger(\"focus\").trigger(\"blur\");\n },\n change: function(e) {\n var name = e.item.attr(kendo.attr(\"name\"));\n\n if (e.action == \"receive\") {\n that.add(name);\n } else if (e.action == \"remove\") {\n that.remove(name);\n } else if (e.action == \"sort\") {\n that.move(name, e.newIndex);\n }\n }\n }).data(\"kendoSortable\");\n }\n },\n\n _isKPI: function(data) {\n return data.type === \"kpi\" || data.measure;\n },\n\n validate: function(data) {\n var isMeasure = (data.type == 2 || \"aggregator\" in data || this._isKPI(data));\n\n if (isMeasure) {\n return this.options.setting === \"measures\";\n }\n\n if (this.options.setting === \"measures\") {\n return isMeasure;\n }\n\n var items = this.dataSource[this.options.setting]();\n var name = data.defaultHierarchy || data.uniqueName;\n if (indexOf(name, items) > -1) {\n return false;\n }\n\n items = this.dataSource[this.options.setting === \"columns\" ? \"rows\" : \"columns\"]();\n if (indexOf(name, items) > -1) {\n return false;\n }\n\n return true;\n },\n\n add: function(name) {\n var items = this.dataSource[this.options.setting]();\n var i, l;\n\n name = Array.isArray(name) ? name.slice(0) : [name];\n\n for (i = 0, l = name.length; i < l; i++) {\n if (indexOf(name[i], items) !== -1) {\n name.splice(i, 1);\n i -= 1;\n l -= 1;\n }\n }\n\n if (name.length) {\n items = items.concat(name);\n this.dataSource[this.options.setting](items);\n }\n },\n\n move: function(name, index) {\n var items = this.dataSource[this.options.setting]();\n var idx = indexOf(name, items);\n\n if (idx > -1) {\n name = items.splice(idx, 1)[0];\n\n items.splice(index, 0, name);\n\n this.dataSource[this.options.setting](items);\n }\n },\n\n remove: function(name) {\n var items = this.dataSource[this.options.setting]();\n var idx = indexOf(name, items);\n var sortExpressions = this.dataSource.sort();\n var filter = this.dataSource.filter();\n\n if (idx > -1) {\n if (filter) {\n filter.filters = removeExpr(filter.filters, name);\n this.dataSource._filter.filters = filter.filters;\n if (!filter.filters.length) {\n this.dataSource._filter = null;\n }\n }\n if (sortExpressions) {\n sortExpressions = removeExpr(sortExpressions, name);\n this.dataSource._sort = sortExpressions;\n }\n items.splice(idx, 1);\n this.dataSource[this.options.setting](items);\n }\n },\n\n sort: function(expr) {\n var sortable = this.options.sortable;\n var allowUnsort = sortable === true || sortable.allowUnsort;\n var skipExpr = allowUnsort && expr.dir === \"asc\";\n\n var expressions = (this.dataSource.sort() || []);\n var result = removeExpr(expressions, expr.field);\n\n if (skipExpr && expressions.length !== result.length) {\n expr = null;\n }\n\n if (expr) {\n result.push(expr);\n }\n\n this.dataSource.sort(result);\n },\n\n refresh: function() {\n var html = \"\";\n var items = this.dataSource[this.options.setting]();\n var length = items.length;\n var idx = 0;\n var item;\n\n if (length) {\n for (; idx < length; idx++) {\n item = items[idx];\n item = item.name === undefined$1 ? { name: item } : item;\n\n html += this.template(extend({ sortIcon: this._sortIcon(item.name) }, item));\n }\n } else {\n html = this.emptyTemplate(this.options.messages.empty);\n }\n\n this.element.html(html);\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.element.off(NS);\n\n if (this.sortable) {\n this.sortable.destroy();\n }\n\n if (this.fieldMenu) {\n this.fieldMenu.destroy();\n }\n\n this.element = null;\n this._refreshHandler = null;\n },\n\n _sortIcon: function(name) {\n var expressions = this.dataSource.sort();\n var expr = sortExpr(expressions, getName(name));\n var icon = \"\";\n\n if (expr) {\n icon = \"sort-\" + expr.dir;\n }\n\n return icon;\n }\n });\n\n kendo.ui.PivotSettingTargetV2 = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that.dataSource = kendo.data.PivotDataSourceV2.create(options.dataSource);\n\n that._refreshHandler = that.refresh.bind(that);\n that.dataSource.first(CHANGE, that._refreshHandler);\n\n that.template = kendo.template(that.options.template);\n\n that._sortable();\n\n that.element.on(\"click\" + NS, \".k-i-x-circle,.k-svg-i-x-circle\", function(e) {\n var target = $(e.target).closest(\":not(path,svg)\");\n var parent = target.closest(\".k-chip\");\n var name = parent.find(\".k-chip-label\").text();\n\n if (!name) {\n return;\n }\n\n that.remove(name);\n parent.remove();\n that.trigger(\"remove\", { name: name });\n });\n\n if (that.options.navigatable) {\n that.element.on(\"keydown\" + NS, \".k-chip\", function(ev) {\n var chip = $(ev.target),\n key = ev.keyCode,\n name = chip.find(\".k-chip-label\").text();\n\n if (key === keys.DELETE || key === keys.BACKSPACE) {\n const targetIndex = that.options.configuratorNavigation ? that.options.configuratorNavigation.elements.indexOf(chip[0]) : -1;\n chip.find(\".k-i-x-circle,.k-svg-i-x-circle\").trigger(\"click\");\n if (!that.options.configuratorNavigation) {\n return;\n }\n\n that.options.configuratorNavigation.focusElement(\n that.options.configuratorNavigation.elements[targetIndex - 1],\n );\n } else if (key === keys.DOWN && ev.altKey) {\n chip.find(\".k-i-more-vertical,.k-svg-i-more-vertical\").trigger(\"click\");\n } else if (ev.ctrlKey && ev.shiftKey) {\n if (key == keys.LEFT) {\n that.move(name, Math.max(0, chip.index() - 1));\n\n if (!that.options.configuratorNavigation) {\n return;\n }\n\n that.options.configuratorNavigation.focusElement(\n that.element.find(\".k-chip .k-chip-label\")\n .filter((ind, el) => $(el).text() == name)\n .closest(\".k-chip\")[0]\n );\n } else if (key == keys.RIGHT) {\n that.move(name, Math.min(chip.index() + 1, chip.parent().find(\"> .k-chip\").length - 1));\n\n if (!that.options.configuratorNavigation) {\n return;\n }\n\n that.options.configuratorNavigation.focusElement(\n that.element.find(\".k-chip .k-chip-label\")\n .filter((ind, el) => $(el).text() == name)\n .closest(\".k-chip\")[0]\n );\n } else if ((key == keys.UP && that.options.setting == \"rows\") ||\n (key == keys.DOWN && that.options.setting == \"columns\")) {\n\n let otherTarget = that.sortable.options.connectWith.data(\"kendoPivotSettingTargetV2\");\n if (!otherTarget) {\n return;\n }\n\n that.remove(name);\n otherTarget.add(name);\n if (!that.options.configuratorNavigation) {\n return;\n }\n\n that.options.configuratorNavigation.focusElement(\n otherTarget.element.find(\".k-chip\").last()[0]\n );\n }\n }\n });\n }\n\n that.fieldMenu = new ui.PivotFieldMenuV2(that.element, {\n messages: that.options.messages.fieldMenu,\n filterable: options.filterable,\n filter: \".k-i-more-vertical,.k-svg-i-more-vertical\",\n sortable: options.sortable,\n dataSource: that.dataSource,\n setting: options.setting\n });\n\n that.refresh();\n },\n\n events: [\"remove\"],\n\n options: {\n name: \"PivotSettingTargetV2\",\n template: null,\n filterable: false,\n sortable: false,\n setting: \"columns\",\n enabled: true,\n messages: {\n empty: \"Drop Fields Here\"\n }\n },\n setDataSource: function(dataSource) {\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.dataSource = this.options.dataSource = dataSource;\n\n if (this.fieldMenu) {\n this.fieldMenu.setDataSource(dataSource);\n }\n dataSource.first(CHANGE, this._refreshHandler);\n\n this.refresh();\n },\n\n _applyState: function() {\n if (this._sortState !== undefined$1) {\n this.dataSource._sort = this._sortState;\n this._sortState = undefined$1;\n }\n\n if (this._stateFilter !== undefined$1) {\n this.dataSource._filter = this._stateFilter;\n this._stateFilter = undefined$1;\n }\n\n this.dataSource[\"_\" + this.options.setting] = this.options.setting === \"measures\" ? normalizeMeasures(this._savedState) : normalizeMembers(this._savedState);\n },\n\n _cancelChanges: function() {\n this._sortState = undefined$1;\n this._stateFilter = undefined$1;\n this._savedState = kendo.deepExtend([], this._initialState);\n this._redraw();\n },\n\n _state: function(newState, modifyInit) {\n var that = this;\n\n if (!newState) {\n return that._savedState || [];\n } else {\n if (!that._savedState || modifyInit) {\n that._initialState = kendo.deepExtend([], newState);\n }\n that._savedState = kendo.deepExtend([], newState);\n }\n },\n\n _sortable: function() {\n var that = this;\n\n this.sortable = this.element.kendoSortable({\n connectWith: this.options.connectWith,\n hint: that.options.hint,\n filter: \">*:not(.k-empty)\",\n cursor: \"move\",\n start: function(e) {\n e.item.focus().blur();\n },\n change: function(e) {\n var name = e.item.find(\".k-chip-label\").text();\n\n if (e.action == \"receive\") {\n that.add(name);\n } else if (e.action == \"remove\") {\n that.remove(name);\n } else if (e.action == \"sort\") {\n that.move(name, e.newIndex);\n }\n }\n }).data(\"kendoSortable\");\n },\n\n add: function(name) {\n var items = this._state();\n var i, l;\n\n name = Array.isArray(name) ? name.slice(0) : [name];\n\n for (i = 0, l = name.length; i < l; i++) {\n if (indexOf(name[i], items) !== -1) {\n name.splice(i, 1);\n i -= 1;\n l -= 1;\n }\n }\n\n if (name.length) {\n items = items.concat(name);\n this._state(items);\n this._redraw();\n }\n },\n\n move: function(name, index) {\n var items = this._state();\n var idx = indexOf(name, items);\n\n if (idx > -1) {\n name = items.splice(idx, 1)[0];\n\n items.splice(index, 0, name);\n\n this._state(items);\n this._redraw();\n }\n },\n\n remove: function(name) {\n var items = this._state();\n var idx = indexOf(name, items);\n var sortExpressions = this.dataSource.sort();\n var filter = this.dataSource.filter();\n\n if (idx > -1) {\n if (filter) {\n filter.filters = removeExpr(filter.filters, name);\n this._savedFilter = this.dataSource._filter;\n this._savedFilter.filters = filter.filters;\n if (!filter.filters.length) {\n this._savedFilter = null;\n }\n }\n if (sortExpressions) {\n sortExpressions = removeExpr(sortExpressions, name);\n this._sortState = sortExpressions;\n }\n items.splice(idx, 1);\n this._state(items);\n this._redraw();\n }\n },\n\n _emptyState: function(enable) {\n var that = this;\n if (enable) {\n that.element.html(this.options.messages.empty)\n .addClass(\"k-settings-description\")\n .removeClass(\"k-chip-list\");\n } else {\n that.element\n .removeClass(\"k-settings-description\")\n .addClass(\"k-chip-list\");\n }\n },\n\n _redraw: function() {\n var items = this._state() || [];\n this._emptyState(!items.length);\n if (items.length) {\n this.element.html(this._targetsHTML(items));\n }\n },\n\n _targetsHTML: function(items) {\n var item;\n var html = \"\";\n var idx = 0;\n var enabled = true;\n\n if (items.length) {\n for (; idx < items.length; idx++) {\n item = items[idx];\n item = item.name === undefined$1 ? { name: item } : item;\n\n html += this.template({ name: item.name, menuenabled: enabled });\n }\n }\n return html;\n },\n\n refresh: function() {\n if (this.dataSource._preventRefresh) {\n return;\n }\n var items = this.dataSource[this.options.setting]();\n this._state(items, true);\n this._emptyState(!this._state().length);\n if (items.length) {\n this.element.html(this._targetsHTML(items));\n }\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.element.off(NS);\n\n if (this.sortable) {\n this.sortable.destroy();\n }\n\n if (this.fieldMenu) {\n this.fieldMenu.destroy();\n }\n\n this.element = null;\n this._refreshHandler = null;\n }\n });\n\n var PivotConfiguratorButton = Widget.extend({\n init: function(element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n that.element = $(element);\n\n that._element();\n that._attachEvents();\n },\n\n options: {\n name: \"PivotConfiguratorButton\",\n text: \"Change settings\",\n configurator: \"\"\n },\n\n destroy: function() {\n this.element.off(NS);\n },\n\n setOptions: function(options) {\n var that = this;\n kendo.deepExtend(that.options, options);\n this.init(this.element, this.options);\n },\n\n toggle: function() {\n var attr = kendo.attr(\"role\");\n var pivotEl = this.element\n .closest(\"[\" + attr + \"=pivotcontainer]\")\n .find(\"[\" + attr + \"=pivotgridv2]\");\n var pivot;\n\n $(\"#\" + this.options.configurator).toggleClass(\"k-hidden\");\n\n if (pivotEl.length) {\n pivot = pivotEl.getKendoPivotGridV2();\n pivot._setContentWidth();\n pivot._updateDimensions();\n }\n },\n\n _attachEvents: function() {\n this.element.on(\"click\" + NS, this.toggle.bind(this));\n },\n\n _element: function() {\n var options = this.options;\n this.element.addClass(\"k-pivotgrid-configurator-button\");\n this.element.html(kendo.format(\"{0}{1}\",options.text, kendo.ui.icon('gear')));\n }\n });\n\n var PivotContainer = Widget.extend({\n init: function(element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n that.element = $(element);\n that.options = options;\n\n\n that._addClasses();\n },\n\n options: {\n name: \"PivotContainer\",\n configuratorPosition: \"left\"\n },\n\n setOptions: function(options) {\n var that = this;\n kendo.deepExtend(that.options, options);\n this.init(this.element, this.options);\n },\n\n _addClasses: function() {\n var options = this.options;\n var className;\n this.element.removeClass(\"k-flex-row k-flex-row-reverse k-flex-column k-flex-column-reverse\");\n\n switch (options.configuratorPosition) {\n case \"right\":\n className = \"k-flex-row\";\n break;\n case \"left\":\n className = \"k-flex-row-reverse\";\n break;\n case \"bottom\":\n className = \"k-flex-column\";\n break;\n case \"top\":\n className = \"k-flex-column-reverse\";\n break;\n default:\n className = \"k-flex-row\";\n }\n\n this.element\n .addClass(\"k-d-flex k-pos-relative\")\n .addClass(className);\n }\n });\n\n var PivotGridV2 = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that._dataSource();\n\n that._bindConfigurator();\n\n that._ariaId = that.element.attr(\"id\") || kendo.guid();\n that._wrapper();\n\n that._columnHeadersWrapper = $('
');\n that._rowHeadersWrapper = $('
');\n that._contentWrapper = $('
');\n\n that.wrapper.append(that._columnHeadersWrapper);\n that.wrapper.append(that._rowHeadersWrapper);\n that.wrapper.append(that._contentWrapper);\n\n that._columnBuilder = new ColumnRowBuilder( { template: this.options.columnHeaderTemplate, axes: \"columns\", ariaId: that._ariaId });\n that._rowBuilder = new ColumnRowBuilder( { template: this.options.rowHeaderTemplate, axes: \"rows\", ariaId: that._ariaId });\n that._contentBuilder = new ContentBuilderV2( { template: this.options.dataCellTemplate || DATACELL_TEMPLATE, ariaId: that._ariaId });\n\n that._scrollable();\n that._rowHeadersWrapper\n .add(that._columnHeadersWrapper)\n .on(\"click\", \"span.k-icon,span.k-svg-icon\", function() {\n var button = $(this);\n var path = button.parent().attr(kendo.attr(\"key\"));\n var expanded = button.is(\".k-i-chevron-up,.k-svg-i-chevron-up\");\n var isRow = button.closest(\".k-pivotgrid-row-headers\").length !== 0;\n var paths = path.split(\",\");\n var eventName = expanded ? COLLAPSEMEMBER : EXPANDMEMBER;\n\n if (that.trigger(eventName, { path: paths, axis: isRow ? \"rows\" : \"columns\" })) {\n return;\n }\n\n var reducerPayLoad = {\n type: \"HEADERS_ACTION_TOGGLE\",\n payload: paths,\n tree: isRow ? that._rowBuilder.getTree() : that._columnBuilder.getTree()\n };\n var currentAxes = isRow ? that.dataSource._rows : that.dataSource._columns;\n var newHeaders = headersReducer(currentAxes, reducerPayLoad);\n\n that.dataSource._preventRefresh = true;\n\n if (isRow) {\n that.dataSource.rows(newHeaders);\n } else {\n that.dataSource.columns(newHeaders);\n }\n });\n\n if (that.options.autoBind) {\n that.dataSource.fetch();\n }\n\n that._aria();\n\n if (that.options.navigatable) {\n that._initPivotGridNavigation();\n }\n\n kendo.notify(that);\n },\n\n events: [\n DATABINDING,\n DATABOUND,\n EXPANDMEMBER,\n COLLAPSEMEMBER\n ],\n\n options: {\n name: \"PivotGridV2\",\n autoBind: true,\n height: null,\n columnWidth: null,\n configurator: \"\",\n columnHeaderTemplate: null,\n rowHeaderTemplate: null,\n dataCellTemplate: null,\n messages: {\n emptyCellLabel: \"PivotGrid Empty Cell\"\n }\n },\n\n destroy: function() {\n var that = this;\n Widget.fn.destroy.call(that);\n\n if (that._windowResizeHandler) {\n $(window).off(RESIZE + NS, that._windowResizeHandler);\n that._windowResizeHandler = null;\n }\n },\n\n _aria: function() {\n var that = this;\n that.element.attr(\"role\", \"grid\");\n },\n\n setDataSource: function(dataSource) {\n this.options.dataSource = dataSource;\n\n this._dataSource();\n\n this._bindConfigurator();\n\n if (this.options.autoBind) {\n dataSource.fetch();\n }\n },\n\n _initPivotGridNavigation: function() {\n var that = this;\n\n that.navigation = new PivotGridNavigation({ tabIndex: 0 });\n that.navigation.start(that.element[0]);\n\n const firstCell = that.navigation.first;\n\n if (firstCell) {\n firstCell.setAttribute('tabindex', '0');\n }\n },\n\n _matchAriaAttributes: function(wrapper) {\n var that = this;\n const rowHeaderRows = wrapper.querySelectorAll(\n \".k-pivotgrid-row-headers .k-pivotgrid-row\"\n );\n const rowHeaderCols = !rowHeaderRows[0] ? [] : Array.from(rowHeaderRows[0].children).reduce(\n (acc, curr) => (acc += curr.getAttribute(\"colspan\") !== null ? +curr.getAttribute(\"colspan\") : 1),\n 0\n );\n const colHeaderRows = wrapper.querySelectorAll(\n \".k-pivotgrid-column-headers tr\"\n );\n const colHeaderCells = wrapper.querySelectorAll(\n \".k-pivotgrid-column-headers th\"\n );\n const valueTableCells = wrapper.querySelectorAll(\".k-pivotgrid-values td\");\n const emptyCell = wrapper.querySelector(\".k-pivotgrid-empty-cell\");\n\n emptyCell.setAttribute(\"aria-rowspan\", colHeaderRows.length.toString());\n emptyCell.setAttribute(\"aria-colspan\", rowHeaderCols.toString());\n\n const firstColHeadersRow = colHeaderRows[0];\n const firstColHeaderRowCellsIds = !firstColHeadersRow ? [] : Array.from(firstColHeadersRow.children)\n .map(el => el.getAttribute(\"id\"))\n .join(\" \");\n firstColHeadersRow.setAttribute(\n \"aria-owns\",\n `${emptyCell.getAttribute(\"id\")} ${firstColHeaderRowCellsIds}`\n );\n\n rowHeaderRows.forEach((row, index) => {\n const valueCellsIds = that.filterAndMap(\n Array.from(valueTableCells),\n c => {\n const idParts = c.getAttribute(\"id\").split(\"-\");\n return idParts[idParts.length - 2] === (index + 1).toString();\n },\n c => c.getAttribute(\"id\")\n );\n\n row.setAttribute(\"aria-owns\", valueCellsIds.join(\" \"));\n });\n\n valueTableCells.forEach(cell => {\n const idParts = cell.getAttribute(\"id\").split(\"-\");\n const cellColIndex = +idParts[idParts.length - 1];\n const colHeaderCellsIds = that.filterAndMap(\n Array.from(colHeaderCells),\n c => {\n const idParts = c.getAttribute(\"id\").split(\"-\");\n const headerCellColIndex = +idParts[idParts.length - 1];\n const headerCellColspan = +c.getAttribute(\"colspan\");\n const colIndexIsEqual = cellColIndex === headerCellColIndex;\n const cellColIndexIsWithinHeaderCellRange =\n headerCellColspan > 1 &&\n headerCellColIndex < cellColIndex &&\n headerCellColIndex + headerCellColspan - 1 >= cellColIndex;\n\n return colIndexIsEqual || cellColIndexIsWithinHeaderCellRange;\n },\n c => c.getAttribute(\"id\")\n );\n\n cell.setAttribute(\"aria-describedby\", colHeaderCellsIds.join(\" \"));\n });\n },\n\n filterAndMap: function(arr, predicate, mapper) {\n return arr.reduce(\n (acc, curr) => (predicate(curr) ? [...acc, mapper(curr)] : acc),\n []\n );\n },\n\n _dataSource: function() {\n var that = this;\n var dataSource = that.options.dataSource;\n\n dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\n\n if (that.dataSource && this._refreshHandler) {\n that.dataSource.unbind(CHANGE, that._refreshHandler)\n .unbind(PROGRESS, that._progressHandler)\n .unbind(ERROR, that._errorHandler);\n } else {\n that._refreshHandler = that.refresh.bind(that);\n that._progressHandler = that._requestStart.bind(that);\n that._errorHandler = that._error.bind(that);\n }\n\n that.dataSource = kendo.data.PivotDataSourceV2.create(dataSource)\n .bind(CHANGE, that._refreshHandler)\n .bind(PROGRESS, that._progressHandler)\n .bind(ERROR, that._errorHandler);\n },\n\n _resize: function() {\n var that = this;\n that.wrapper[0].style.setProperty('--kendo-scrollbar-width', kendo.format(\"{0}px\", getScollWidth()));\n },\n\n _scrollable: function() {\n var that = this;\n var columnsHeader = that._columnHeadersWrapper;\n var rowsHeader = that._rowHeadersWrapper;\n\n that._resize();\n that._windowResizeHandler = that._resize.bind(that);\n\n that._contentWrapper.scroll(function() {\n kendo.scrollLeft(columnsHeader, this.scrollLeft);\n rowsHeader.scrollTop(this.scrollTop);\n });\n\n rowsHeader.bind(\"DOMMouseScroll\" + NS + \" mousewheel\" + NS, that._wheelScroll.bind(that));\n $(window).on(RESIZE + NS, that._windowResizeHandler);\n },\n\n _wheelScroll: function(e) {\n if (e.ctrlKey) {\n return;\n }\n\n var delta = kendo.wheelDeltaY(e);\n var scrollTop = this._contentWrapper.scrollTop();\n\n if (delta) {\n e.preventDefault();\n $(e.currentTarget).one(\"wheel\" + NS, false);\n\n this._rowHeadersWrapper.scrollTop(scrollTop + (-delta));\n this._contentWrapper.scrollTop(scrollTop + (-delta));\n }\n },\n\n _wrapper: function() {\n var height = this.options.height;\n\n this.wrapper = this.element.addClass(\"k-pivotgrid\");\n var emptyCell = $(`${this.options.messages.emptyCellLabel}`);\n this.wrapper.append(emptyCell);\n\n if (height) {\n this.wrapper.css(\"height\", height);\n }\n },\n\n _progress: function(toggle) {\n kendo.ui.progress(this.wrapper, toggle);\n },\n\n _error: function() {\n this._progress(false);\n },\n\n _requestStart: function() {\n this._progress(true);\n },\n\n _updateDimensions: function() {\n var that = this;\n that.wrapper.css({\n \"grid-template-columns\": kendo.format(\"{0}px 1fr\", that._rowHeadersWrapper.find(\".k-pivotgrid-table\")[0].offsetWidth),\n \"grid-template-rows\": kendo.format(\"{0}px 1fr\", that._columnHeadersWrapper.find(\".k-pivotgrid-table\")[0].offsetHeight),\n });\n },\n\n _setContentWidth: function() {\n if (!this.options.columnWidth) {\n return;\n }\n var contentTable = this._contentWrapper.find(\"table\");\n var columnTable = this._columnHeadersWrapper.children(\"table\");\n var rowTable = this._rowHeadersWrapper.children(\"table\");\n\n contentTable.add(columnTable).add(rowTable).find(\"col\").width(this.options.columnWidth);\n },\n\n _bindConfigurator: function() {\n var configurator = this.options.configurator;\n if (configurator) {\n $(configurator).kendoPivotConfiguratorV2(\"setDataSource\", this.dataSource);\n }\n },\n\n cellInfoByElement: function(element) {\n element = $(element);\n\n return this.cellInfo(element.index(), element.parent(\"tr\").index());\n },\n\n cellInfo: function(columnIndex, rowIndex) {\n var contentBuilder = this._contentBuilder;\n var dataIndex;\n var dataItem;\n\n if (columnIndex >= contentBuilder.columnsCount || columnIndex < 0 ||\n rowIndex >= contentBuilder.rowsCount || rowIndex < 0) {\n return null;\n }\n\n dataIndex = rowIndex * contentBuilder.columnsCount + columnIndex;\n dataItem = contentBuilder.hash[dataIndex < 0 ? 0 : dataIndex];\n\n return {\n columnTuple: dataItem.columnTuple,\n rowTuple: dataItem.rowTuple,\n dataItem: dataItem.data\n };\n },\n\n refresh: function() {\n var that = this;\n\n var dataSource = that.dataSource;\n if (that.trigger(DATABINDING, { action: \"rebind\" } )) {\n return;\n }\n\n var lastFocusedCellID = kendo._activeElement() ? kendo._activeElement().id : null;\n var lastCellIdWithTabIndex = that.wrapper.find(\"[tabindex=0]\").attr(\"id\");\n that._columnBuilder.setTuples(dataSource._columnTuples);\n that._columnHeadersWrapper.html(that._columnBuilder.build());\n\n that._rowBuilder.setTuples(dataSource._rowTuples);\n that._rowHeadersWrapper.html(that._rowBuilder.build());\n\n that._contentBuilder.setRowColumnInfo({\n columnHeaderLeafs: that._columnBuilder.getHeaderLeafs(),\n rowHeaderLeafs: that._rowBuilder.getHeaderLeafs(),\n columnHeaderBreadth: that._columnBuilder.getBreadth(),\n rowHeaderDepth: that._rowBuilder.getBreadth(),\n data: dataSource._view\n });\n\n that._contentWrapper.html(that._contentBuilder.build());\n\n\n that._setContentWidth();\n that._updateDimensions();\n\n that._progress(false);\n\n that.trigger(DATABOUND);\n that._matchAriaAttributes(that.wrapper[0]);\n\n if (!that.navigation) {\n return;\n }\n\n if (lastCellIdWithTabIndex && that.element.find(`#${lastCellIdWithTabIndex}`).length > 0) {\n that.element.find(`#${lastCellIdWithTabIndex}`).attr('tabindex', '0');\n } else {\n const firstCell = that.navigation.first;\n\n if (firstCell) {\n firstCell.setAttribute('tabindex', '0');\n }\n }\n\n if (lastFocusedCellID && lastFocusedCellID.indexOf(that._ariaId) == 0) {\n that.navigation.focusElement(that.element.find(`#${lastFocusedCellID}`)[0]);\n }\n }\n });\n\n ui.plugin(PivotConfiguratorButton);\n ui.plugin(PivotContainer);\n ui.plugin(PivotGridV2);\n\n var PivotGrid = Widget.extend({\n init: function(element, options) {\n var that = this;\n var columnBuilder;\n var rowBuilder;\n\n Widget.fn.init.call(that, element, options);\n\n STATE_COLLAPSED_ICONNAME = kendo.support.isRtl(that.element) ? \"caret-alt-left\" : \"caret-alt-right\";\n\n that._dataSource();\n\n that._bindConfigurator();\n\n that._wrapper();\n that._createLayout();\n\n that._columnBuilder = columnBuilder = new ColumnBuilder();\n that._rowBuilder = rowBuilder = new RowBuilder();\n that._contentBuilder = new ContentBuilder();\n\n that._templates();\n\n that.columnsHeader\n .add(that.rowsHeader)\n .on(\"click\", \"span.k-icon,span.k-svg-icon\", function() {\n var button = $(this);\n var builder = columnBuilder;\n var action = \"expandColumn\";\n var eventName;\n var path = button.attr(kendo.attr(\"path\"));\n var eventArgs = {\n axis: \"columns\",\n path: $.parseJSON(path)\n };\n\n if (button.parent().is(\"td\")) {\n builder = rowBuilder;\n action = \"expandRow\";\n eventArgs.axis = \"rows\";\n }\n\n var expanded = button.is(STATE_EXPANDED_SELECTOR);\n var metadata = builder.metadata[path];\n var request = metadata.expanded === undefined$1;\n\n eventName = expanded ? COLLAPSEMEMBER : EXPANDMEMBER;\n eventArgs.childrenLoaded = metadata.maxChildren > metadata.children;\n\n if (that.trigger(eventName, eventArgs)) {\n return;\n }\n\n builder.metadata[path].expanded = !expanded;\n kendo.ui.icon(button,{ icon: !expanded ? STATE_EXPANDED_ICONNAME : STATE_COLLAPSED_ICONNAME });\n\n if (!expanded && request) {\n that.dataSource[action](eventArgs.path);\n } else {\n that.refresh();\n }\n });\n\n that._scrollable();\n\n if (that.options.autoBind) {\n that.dataSource.fetch();\n }\n\n kendo.notify(that);\n },\n\n events: [\n DATABINDING,\n DATABOUND,\n EXPANDMEMBER,\n COLLAPSEMEMBER\n ],\n\n options: {\n name: \"PivotGrid\",\n autoBind: true,\n reorderable: true,\n filterable: false,\n sortable: false,\n navigatable: false,\n height: null,\n columnWidth: 100,\n configurator: \"\",\n columnHeaderTemplate: null,\n rowHeaderTemplate: null,\n dataCellTemplate: null,\n kpiStatusTemplate: null,\n kpiTrendTemplate: null,\n messages: {\n measureFields: \"Drop Data Fields Here\",\n columnFields: \"Drop Column Fields Here\",\n rowFields: \"Drop Rows Fields Here\"\n }\n },\n\n _templates: function() {\n var columnTemplate = this.options.columnHeaderTemplate;\n var rowTemplate = this.options.rowHeaderTemplate;\n var dataTemplate = this.options.dataCellTemplate;\n var kpiStatusTemplate = this.options.kpiStatusTemplate;\n var kpiTrendTemplate = this.options.kpiTrendTemplate;\n\n this._columnBuilder.template = kendo.template(columnTemplate || HEADER_TEMPLATE, { useWithBlock: !!columnTemplate });\n this._contentBuilder.dataTemplate = kendo.template(dataTemplate || DATACELL_TEMPLATE, { useWithBlock: !!dataTemplate });\n this._contentBuilder.kpiStatusTemplate = kendo.template(kpiStatusTemplate || KPISTATUS_TEMPLATE, { useWithBlock: !!kpiStatusTemplate });\n this._contentBuilder.kpiTrendTemplate = kendo.template(kpiTrendTemplate || KPITREND_TEMPLATE, { useWithBlock: !!kpiTrendTemplate });\n this._rowBuilder.template = kendo.template(rowTemplate || HEADER_TEMPLATE, { useWithBlock: !!rowTemplate });\n },\n\n _bindConfigurator: function() {\n var configurator = this.options.configurator;\n if (configurator) {\n $(configurator).kendoPivotConfigurator(\"setDataSource\", this.dataSource);\n }\n },\n\n cellInfoByElement: function(element) {\n element = $(element);\n\n return this.cellInfo(element.index(), element.parent(\"tr\").index());\n },\n\n cellInfo: function(columnIndex, rowIndex) {\n var contentBuilder = this._contentBuilder;\n var columnInfo = contentBuilder.columnIndexes[columnIndex || 0];\n var rowInfo = contentBuilder.rowIndexes[rowIndex || 0];\n var dataIndex;\n\n if (!columnInfo || !rowInfo) {\n return null;\n }\n\n dataIndex = (rowInfo.index * contentBuilder.rowLength) + columnInfo.index;\n\n return {\n columnTuple: columnInfo.tuple,\n rowTuple: rowInfo.tuple,\n measure: columnInfo.measure || rowInfo.measure,\n dataItem: this.dataSource.view()[dataIndex]\n };\n },\n\n setDataSource: function(dataSource) {\n this.options.dataSource = dataSource;\n\n this._dataSource();\n\n if (this.measuresTarget) {\n this.measuresTarget.setDataSource(dataSource);\n }\n\n if (this.rowsTarget) {\n this.rowsTarget.setDataSource(dataSource);\n }\n\n if (this.columnsTarget) {\n this.columnsTarget.setDataSource(dataSource);\n }\n\n this._bindConfigurator();\n\n if (this.options.autoBind) {\n dataSource.fetch();\n }\n },\n\n setOptions: function(options) {\n Widget.fn.setOptions.call(this, options);\n\n this._templates();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n clearTimeout(this._headerReflowTimeout);\n },\n\n _dataSource: function() {\n var that = this;\n var dataSource = that.options.dataSource;\n\n dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\n\n if (that.dataSource && this._refreshHandler) {\n that.dataSource.unbind(CHANGE, that._refreshHandler)\n .unbind(STATERESET, that._stateResetHandler)\n .unbind(PROGRESS, that._progressHandler)\n .unbind(ERROR, that._errorHandler);\n } else {\n that._refreshHandler = that.refresh.bind(that);\n that._progressHandler = that._requestStart.bind(that);\n that._stateResetHandler = that._stateReset.bind(that);\n that._errorHandler = that._error.bind(that);\n }\n\n that.dataSource = kendo.data.PivotDataSource.create(dataSource)\n .bind(CHANGE, that._refreshHandler)\n .bind(PROGRESS, that._progressHandler)\n .bind(STATERESET, that._stateResetHandler)\n .bind(ERROR, that._errorHandler);\n },\n\n _error: function() {\n this._progress(false);\n },\n\n _requestStart: function() {\n this._progress(true);\n },\n\n _stateReset: function() {\n this._columnBuilder.reset();\n this._rowBuilder.reset();\n },\n\n _wrapper: function() {\n var height = this.options.height;\n\n this.wrapper = this.element.addClass(\"k-pivot\");\n\n if (height) {\n this.wrapper.css(\"height\", height);\n }\n },\n\n _measureFields: function() {\n this.measureFields = $(DIV).addClass(\"k-pivot-toolbar k-toolbar k-toolbar-md k-settings-measures\");\n\n this.measuresTarget = this._createSettingTarget(this.measureFields, {\n setting: \"measures\",\n messages: {\n empty: this.options.messages.measureFields\n }\n });\n },\n\n _createSettingTarget: function(element, options) {\n var template,\n pivotOptions = this.options;\n\n template = ({ sortIcon, name }) => ''\n + ``\n + ''\n + `${name}`\n + ''\n + ''\n + getIcons(sortIcon, options, pivotOptions)\n + ''\n + '';\n\n return new kendo.ui.PivotSettingTarget(element, $.extend({\n dataSource: this.dataSource,\n template: template,\n emptyTemplate: (data) => `${data}`,\n enabled: this.options.reorderable\n }, options));\n },\n\n _initSettingTargets: function() {\n this.columnsTarget = this._createSettingTarget(this.columnFields, {\n connectWith: this.rowFields,\n setting: \"columns\",\n filterable: this.options.filterable,\n sortable: this.options.sortable,\n messages: {\n empty: this.options.messages.columnFields,\n fieldMenu: this.options.messages.fieldMenu\n }\n });\n\n this.rowsTarget = this._createSettingTarget(this.rowFields, {\n connectWith: this.columnFields,\n setting: \"rows\",\n filterable: this.options.filterable,\n sortable: this.options.sortable,\n messages: {\n empty: this.options.messages.rowFields,\n fieldMenu: this.options.messages.fieldMenu\n }\n });\n },\n\n _createLayout: function() {\n var that = this;\n var layoutTable = $(LAYOUT_TABLE);\n var leftContainer = layoutTable.find(\".k-pivot-rowheaders\");\n var rightContainer = layoutTable.find(\".k-pivot-table\");\n var gridWrapper = $(DIV).addClass(\"k-grid\");\n\n that._measureFields();\n that.columnFields = $(DIV).addClass(\"k-pivot-toolbar k-toolbar k-toolbar-md k-settings-columns\");\n\n that.rowFields = $(DIV).addClass(\"k-pivot-toolbar k-toolbar k-toolbar-md k-settings-rows\");\n that.columnsHeader = $('
')\n .wrap('
');\n\n that.columnsHeader.parent().css(\"padding-right\", kendo.support.scrollbar());\n\n that.rowsHeader = $('
');\n that.content = $('
');\n\n leftContainer.append(that.measureFields);\n leftContainer.append(that.rowFields);\n leftContainer.append(that.rowsHeader);\n\n gridWrapper.append(that.columnsHeader.parent());\n gridWrapper.append(that.content);\n\n rightContainer.append(that.columnFields);\n rightContainer.append(gridWrapper);\n\n that.wrapper.append(layoutTable);\n\n that.columnsHeaderTree = new kendo.dom.Tree(that.columnsHeader[0]);\n that.rowsHeaderTree = new kendo.dom.Tree(that.rowsHeader[0]);\n that.contentTree = new kendo.dom.Tree(that.content[0]);\n\n that._initSettingTargets();\n },\n\n _progress: function(toggle) {\n kendo.ui.progress(this.wrapper, toggle);\n },\n\n _resize: function() {\n if (this.content[0].firstChild) {\n this._setSectionsWidth();\n this._setSectionsHeight();\n this._setContentWidth();\n this._setContentHeight();\n this._columnHeaderReflow();\n }\n },\n\n _columnHeaderReflow: function() {\n var columnTable = this.columnsHeader.children(\"table\");\n\n if (!kendo.support.browser.mozilla) {\n return;\n }\n\n clearTimeout(this._headerReflowTimeout);\n\n columnTable.css(\"table-layout\", \"auto\");\n\n this._headerReflowTimeout = setTimeout(function() {\n columnTable.css(\"table-layout\", \"\");\n });\n },\n\n _setSectionsWidth: function() {\n var rowsHeader = this.rowsHeader;\n var leftColumn = rowsHeader.parent(\".k-pivot-rowheaders\").width(AUTO);\n var width;\n\n width = Math.max(outerWidth(this.measureFields), outerWidth(this.rowFields));\n width = Math.max(rowsHeader.children(\"table\").width(), width);\n\n leftColumn.width(width);\n },\n\n _setSectionsHeight: function() {\n var measureFieldsHeight = this.measureFields.height(AUTO).height();\n var columnFieldsHeight = this.columnFields.height(AUTO).height();\n var rowFieldsHeight = this.rowFields.height(AUTO).innerHeight();\n var columnsHeight = this.columnsHeader.height(AUTO).innerHeight();\n\n var padding = rowFieldsHeight - this.rowFields.height();\n\n var firstRowHeight = columnFieldsHeight > measureFieldsHeight ? columnFieldsHeight : measureFieldsHeight;\n var secondRowHeight = columnsHeight > rowFieldsHeight ? columnsHeight : rowFieldsHeight;\n\n this.measureFields.height(firstRowHeight);\n this.columnFields.height(firstRowHeight);\n this.rowFields.height(secondRowHeight - padding);\n this.columnsHeader.height(secondRowHeight);\n },\n\n _setContentWidth: function() {\n var contentTable = this.content.find(\"table\");\n var columnTable = this.columnsHeader.children(\"table\");\n\n var rowLength = contentTable.children(\"colgroup\").children().length;\n\n var calculatedWidth = rowLength * this.options.columnWidth;\n var minWidth = Math.ceil((calculatedWidth / this.content.width()) * 100);\n\n if (minWidth < 100) {\n minWidth = 100;\n }\n\n contentTable.add(columnTable).css(\"width\", minWidth + \"%\");\n\n this._resetColspan(columnTable);\n },\n\n _setContentHeight: function() {\n var that = this;\n var content = that.content;\n var rowsHeader = that.rowsHeader;\n var innerHeight = that.wrapper.innerHeight();\n var scrollbar = kendo.support.scrollbar();\n var skipScrollbar = content[0].offsetHeight === content[0].clientHeight;\n var height = that.options.height;\n\n if (that.wrapper.is(\":visible\")) {\n if (!innerHeight || !height) {\n if (skipScrollbar) {\n scrollbar = 0;\n }\n\n content.height(\"auto\");\n rowsHeader.height(content.height() - scrollbar);\n return;\n }\n\n innerHeight -= outerHeight(that.columnFields);\n innerHeight -= outerHeight(that.columnsHeader.parent());\n\n if (innerHeight <= scrollbar * 2) { // do not set height if proper scrollbar cannot be displayed\n innerHeight = scrollbar * 2 + 1;\n if (!skipScrollbar) {\n innerHeight += scrollbar;\n }\n }\n\n content.height(innerHeight);\n\n if (skipScrollbar) {\n scrollbar = 0;\n }\n\n rowsHeader.height(innerHeight - scrollbar);\n }\n },\n\n _resetColspan: function(columnTable) {\n var that = this;\n var cell = columnTable.children(\"tbody\").children().first().children().first();\n\n if (that._colspan === undefined$1) {\n that._colspan = cell.attr(\"colspan\");\n }\n\n cell.attr(\"colspan\", 1);\n\n clearTimeout(that._layoutTimeout);\n\n that._layoutTimeout = setTimeout(function() {\n cell.attr(\"colspan\", that._colspan);\n that._colspan = undefined$1;\n });\n },\n\n _axisMeasures: function(axis) {\n var result = [];\n var dataSource = this.dataSource;\n var measures = dataSource.measures();\n var hasMeasure = measures.length > 1 || (measures[0] && measures[0].type);\n\n if (dataSource.measuresAxis() === axis) {\n if (dataSource[axis]().length === 0 || hasMeasure) {\n result = measures;\n }\n }\n\n return result;\n },\n\n items: function() {\n return [];\n },\n\n refresh: function() {\n var that = this;\n var dataSource = that.dataSource;\n\n var axes = dataSource.axes();\n var columns = (axes.columns || {}).tuples || [];\n var rows = (axes.rows || {}).tuples || [];\n\n var columnBuilder = that._columnBuilder;\n var rowBuilder = that._rowBuilder;\n\n var columnAxis = {};\n var rowAxis = {};\n\n if (that.trigger(DATABINDING, { action: \"rebind\" } )) {\n return;\n }\n\n columnBuilder.measures = that._axisMeasures(AXIS_COLUMNS);\n rowBuilder.measures = that._axisMeasures(AXIS_ROWS);\n\n that.columnsHeaderTree.render(columnBuilder.build(columns));\n that.rowsHeaderTree.render(rowBuilder.build(rows));\n\n columnAxis = {\n indexes: columnBuilder._indexes,\n measures: columnBuilder.measures,\n metadata: columnBuilder.metadata\n };\n\n rowAxis = {\n indexes: rowBuilder._indexes,\n measures: rowBuilder.measures,\n metadata: rowBuilder.metadata\n };\n\n that.contentTree.render(that._contentBuilder.build(dataSource.view(), columnAxis, rowAxis));\n\n that._resize();\n\n if (that.touchScroller) {\n that.touchScroller.contentResized();\n } else {\n var touchScroller = kendo.touchScroller(that.content);\n\n if (touchScroller && touchScroller.movable) {\n that.touchScroller = touchScroller;\n\n touchScroller.movable.bind(\"change\", function(e) {\n kendo.scrollLeft(that.columnsHeader, -e.sender.x);\n that.rowsHeader.scrollTop(-e.sender.y);\n });\n }\n }\n\n that._progress(false);\n\n that.trigger(DATABOUND);\n },\n\n _scrollable: function() {\n var that = this;\n var columnsHeader = that.columnsHeader;\n var rowsHeader = that.rowsHeader;\n\n that.content.on(\"scroll\", function() {\n kendo.scrollLeft(columnsHeader, this.scrollLeft);\n rowsHeader.scrollTop(this.scrollTop);\n });\n\n rowsHeader.on(\"DOMMouseScroll\" + NS + \" mousewheel\" + NS, that._wheelScroll.bind(that));\n },\n\n _wheelScroll: function(e) {\n if (e.ctrlKey) {\n return;\n }\n\n var delta = kendo.wheelDeltaY(e);\n var scrollTop = this.content.scrollTop();\n\n if (delta) {\n e.preventDefault();\n //In Firefox DOMMouseScroll event cannot be canceled\n $(e.currentTarget).closest(\":not(path,svg)\").one(\"wheel\" + NS, false);\n\n this.rowsHeader.scrollTop(scrollTop + (-delta));\n this.content.scrollTop(scrollTop + (-delta));\n }\n }\n });\n\n var element = kendo.dom.element;\n var htmlNode = kendo.dom.html;\n\n var createMetadata = function(levelNum, memberIdx) {\n return {\n maxChildren: 0,\n children: 0,\n maxMembers: 0,\n members: 0,\n measures: 1,\n levelNum: levelNum,\n parentMember: memberIdx !== 0\n };\n };\n\n var buildPath = function(tuple, index) {\n var path = [];\n var idx = 0;\n\n for (; idx <= index; idx++) {\n path.push(tuple.members[idx].name);\n }\n\n return path;\n };\n\n var tupleName = function(tuple, index) {\n var name = \"\";\n var idx = 0;\n\n for (; idx <= index; idx++) {\n name += tuple.members[idx].name;\n }\n\n return name;\n };\n\n var ContentBuilderV2 = Class.extend({\n init: function(options) {\n this.template = kendo.template(options.template);\n this.ariaId = options.ariaId;\n this.hash = [];\n },\n\n setRowColumnInfo: function(options) {\n this.data = options.data;\n this.columnHeaderLeafs = options.columnHeaderLeafs;\n this.rowHeaderLeafs = options.rowHeaderLeafs;\n this.columnHeaderBreadth = options.columnHeaderBreadth;\n this.rowHeaderDepth = options.rowHeaderDepth;\n this.hash.length = 0;\n },\n\n addColElements: function(count) {\n var html = \"\";\n\n for (var index = 0; index < count; index++) {\n html += \"\";\n }\n\n this.table.find(\"colgroup\").append(html);\n },\n\n addRowElements: function(data) {\n var that = this;\n var body = that.table.find(\"tbody\");\n var row;\n\n for (var index = 0; index < data.length; index++) {\n row = $(``);\n body.append(row);\n that.addColumCell(row, data[index], index);\n }\n\n this.rowsCount = data.length;\n },\n\n addColumCell: function(rowEl, rowItem, rowIndex) {\n var that = this;\n for (var index = 0; index < rowItem.cells.length; index++) {\n var cell = rowItem.cells[index];\n if (cell) {\n var cellEl = $(``);\n if (this.rowHeaderLeafs[rowIndex].total || this.columnHeaderLeafs[index].total) {\n cellEl.addClass(\"k-pivotgrid-header-total\");\n }\n cellEl.append(that.template({\n dataItem: cell.data,\n rowTuple: cell.rowTuple,\n columnTuple: cell.columnTuple\n }));\n this.hash.push(cell);\n rowEl.append(cellEl);\n }\n }\n },\n\n build: function() {\n var data = toData((this.data || []).slice(), this.columnHeaderLeafs, this.rowHeaderLeafs, this.columnHeaderBreadth, this.rowHeaderDepth);\n var that = this;\n\n var table = $(``);\n\n that.table = table;\n that.addColElements(this.columnHeaderLeafs.length);\n that.addRowElements(data);\n this.rowsCount = data.length;\n this.columnsCount = this.columnHeaderLeafs.length;\n\n return that.table;\n }\n });\n\n var ColumnRowBuilder = Class.extend({\n init: function(options) {\n this.tuples = options.tuples;\n this.axes = options.axes;\n this.ariaId = options.ariaId;\n this.headerTemplate = kendo.template(HEADERTEMPLATE);\n if (options.template) {\n this.template = kendo.template(options.template);\n }\n },\n\n setTuples: function(tuples) {\n this.tuples = tuples;\n },\n\n addColElements: function(count) {\n var html = \"\";\n\n for (var index = 0; index < count; index++) {\n html += \"\";\n }\n\n this.table.find(\"colgroup\").append(html);\n },\n\n addRowElements: function(columnHeaderRows) {\n var that = this;\n var body = that.table.find(\"tbody\");\n var row;\n\n for (var index = 0; index < columnHeaderRows.length; index++) {\n row = $('');\n body.append(row);\n that.addColumCell(row, columnHeaderRows[index], index);\n }\n },\n\n addColumCell: function(rowEl, rowItem, rowIndex) {\n var that = this;\n var cellEl;\n var cell;\n\n for (var index = 0; index < rowItem.cells.length; index++) {\n cell = rowItem.cells[index];\n if (cell) {\n cellEl = $(that.headerTemplate({\n id: `${that.ariaId}-${that.axes == \"columns\" ? \"ch\" : \"rh\"}-${rowIndex + 1}-${index + 1}`,\n rowspan: cell.rowSpan,\n colspan: cell.colSpan,\n key: cell.path.join(\",\") + (cell.total ? '|[TOTAL]' : ''),\n iconClass: (cell.children && cell.children.length) ? \"up\" : \"down\",\n expandable: cell.hasChildren && !cell.total,\n expanded: (cell.children && cell.children.length) ? \"true\" : \"false\",\n headerClass: kendo.format(\"k-pivotgrid-cell{0}{1}\", cell.total ? \" k-pivotgrid-header-total\" : \"\", cell.levelNum === 0 ? \" k-pivotgrid-header-root\" : \"\"),\n role: that.axes == \"columns\" ? \"columnheader\" : \"rowheader\"\n }));\n cellEl.append(that.template ? that.template({ member: cell }) : cell.caption);\n rowEl.append(cellEl);\n }\n }\n },\n\n build: function() {\n var tree = toTree((this.tuples || []).slice());\n var treeData = this.axes == \"columns\" ? toColumns(tree) : toRows(tree);\n var headerRows = treeData[0];\n var headerLeafs = treeData[1];\n var breadth = treeData[2];\n var rowHeaderBreadth = treeData[3];\n var that = this;\n that._tree = tree;\n that._breadth = breadth;\n that._headerLeafs = headerLeafs;\n\n var table = $(``);\n\n that.table = table;\n that.addColElements(this.axes == \"columns\" ? headerLeafs.length : rowHeaderBreadth);\n that.addRowElements(headerRows);\n\n return that.table;\n },\n\n getTree: function() {\n return this._tree;\n },\n\n getBreadth: function() {\n return this._breadth;\n },\n\n getHeaderLeafs: function() {\n return this._headerLeafs;\n }\n });\n\n var ColumnBuilder = Class.extend({\n init: function() {\n this.measures = 1;\n this.metadata = {};\n },\n\n build: function(tuples) {\n var tbody = this._tbody(tuples);\n var colgroup = this._colGroup();\n\n return [\n element(\"table\", { className: tableStyles.headerTable }, [colgroup, tbody])\n ];\n },\n\n reset: function() {\n this.metadata = {};\n },\n\n _colGroup: function() {\n var length = this._rowLength();\n var children = [];\n var idx = 0;\n\n for (; idx < length; idx++) {\n children.push(element(\"col\", null));\n }\n\n return element(\"colgroup\", null, children);\n },\n\n _tbody: function(tuples) {\n var root = tuples[0];\n\n this.map = {};\n this.rows = [];\n this.rootTuple = root;\n\n this._indexes = [];\n\n if (root) {\n this._buildRows(root, 0);\n this._normalize();\n } else {\n this.rows.push(element(\"tr\", { className: tableStyles.tableRow }, [ element(\"th\", { className: tableStyles.header } , [ htmlNode(\" \") ]) ]));\n }\n\n return element(\"tbody\", { className: tableStyles.tbody }, this.rows);\n },\n\n _normalize: function() {\n var rows = this.rows;\n var rowsLength = rows.length;\n var rowIdx = 0;\n var row;\n\n var cellsLength;\n var cellIdx;\n var cells;\n var cell;\n\n for (; rowIdx < rowsLength; rowIdx++) {\n row = rows[rowIdx];\n\n if (row.rowSpan === 1) {\n continue;\n }\n\n cells = row.children;\n\n cellIdx = 0;\n cellsLength = cells.length;\n\n for (; cellIdx < cellsLength; cellIdx++) {\n cell = cells[cellIdx];\n\n if (cell.tupleAll) {\n cell.attr.rowSpan = row.rowSpan;\n }\n }\n }\n },\n\n _rowIndex: function(row) {\n var rows = this.rows;\n var length = rows.length;\n var idx = 0;\n\n for (; idx < length; idx++) {\n if (rows[idx] === row) {\n break;\n }\n }\n\n return idx;\n },\n\n _rowLength: function() {\n var cells = this.rows[0] ? this.rows[0].children : [];\n var length = cells.length;\n var rowLength = 0;\n var idx = 0;\n\n if (length) {\n for (; idx < length; idx++) {\n rowLength += cells[idx].attr.colSpan || 1;\n }\n }\n\n if (!rowLength) {\n rowLength = this.measures;\n }\n\n return rowLength;\n },\n\n _row: function(tuple, memberIdx, parentMember) {\n var rootName = this.rootTuple.members[memberIdx].name;\n var levelNum = tuple.members[memberIdx].levelNum;\n var rowKey = rootName + levelNum;\n var map = this.map;\n var parentRow;\n var children;\n\n var row = map[rowKey];\n\n if (!row) {\n row = element(\"tr\", { className: tableStyles.tableRow }, []);\n\n row.parentMember = parentMember;\n row.collapsed = 0;\n row.colSpan = 0;\n row.rowSpan = 1;\n\n map[rowKey] = row;\n parentRow = map[rootName + (Number(levelNum) - 1)];\n\n if (parentRow) {\n children = parentRow.children;\n\n if (children[1] && children[1].attr.className.indexOf(\"k-alt\") === -1) {\n row.notFirst = true;\n } else {\n row.notFirst = parentRow.notFirst;\n }\n }\n\n this.rows.splice(this._rowIndex(parentRow) + 1, 0, row);\n } else {\n row.notFirst = false;\n\n if (!row.parentMember || row.parentMember !== parentMember) {\n row.parentMember = parentMember;\n row.collapsed = 0;\n row.colSpan = 0;\n }\n }\n\n return row;\n },\n\n _measures: function(measures, tuple, className) {\n var map = this.map;\n var row = map.measureRow;\n var measure;\n\n if (!row) {\n row = element(\"tr\", { className: tableStyles.tableRow }, []);\n map.measureRow = row;\n this.rows.push(row);\n }\n\n for (var idx = 0, length = measures.length; idx < length; idx++) {\n measure = measures[idx];\n row.children.push(this._cell((className || \"\"), [this._content(measure, tuple)], measure));\n }\n\n return length;\n },\n\n _content: function(member, tuple) {\n return htmlNode(this.template({\n member: member,\n tuple: tuple\n }), true);\n },\n\n _cell: function(className, children, member) {\n var cell = element(\"th\", { className: tableStyles.header + \" \" + className }, children);\n cell.value = member.caption || member.name;\n return cell;\n },\n\n _buildRows: function(tuple, memberIdx, parentMember) {\n var members = tuple.members;\n var member = members[memberIdx];\n var nextMember = members[memberIdx + 1];\n\n var row, childRow, children, childrenLength;\n var cell, allCell, cellAttr;\n var cellChildren = [];\n var path;\n\n var idx = 0;\n var metadata;\n\n var colSpan;\n var collapsed = 0;\n var memberCollapsed = 0;\n\n if (member.measure) {\n this._measures(member.children, tuple);\n return;\n }\n\n path = kendo.stringify(buildPath(tuple, memberIdx));\n row = this._row(tuple, memberIdx, parentMember);\n\n children = member.children;\n childrenLength = children.length;\n\n metadata = this.metadata[path];\n if (!metadata) {\n this.metadata[path] = metadata = createMetadata(Number(member.levelNum), memberIdx);\n metadata.rootLevelNum = Number(this.rootTuple.members[memberIdx].levelNum);\n }\n\n this._indexes.push({\n path: path,\n tuple: tuple\n });\n\n if (member.hasChildren) {\n if (metadata.expanded === false) {\n collapsed = metadata.maxChildren;\n row.collapsed += collapsed;\n\n metadata.children = 0;\n childrenLength = 0;\n }\n\n let cellIconEl = $(\"\");\n cellIconEl.attr(kendo.attr(\"path\"), path);\n\n cellChildren.push(kendo.dom.html(kendo.ui.icon(cellIconEl, { icon: childrenLength ? STATE_EXPANDED_ICONNAME : STATE_COLLAPSED_ICONNAME }), true));\n }\n\n cellChildren.push(this._content(member, tuple));\n cell = this._cell((row.notFirst ? \" k-first\" : \"\"), cellChildren, member);\n\n row.children.push(cell);\n row.colSpan += 1;\n\n if (childrenLength) {\n allCell = this._cell(\" k-alt\", [this._content(member, tuple)], member);\n row.children.push(allCell);\n\n for (; idx < childrenLength; idx++) {\n childRow = this._buildRows(children[idx], memberIdx, member);\n }\n\n colSpan = childRow.colSpan;\n collapsed = childRow.collapsed;\n\n cell.attr.colSpan = colSpan;\n\n metadata.children = colSpan;\n metadata.members = 1;\n\n row.colSpan += colSpan;\n row.collapsed += collapsed;\n row.rowSpan = childRow.rowSpan + 1;\n\n if (nextMember) {\n if (nextMember.measure) {\n colSpan = this._measures(nextMember.children, tuple, \" k-alt\");\n } else {\n childRow = this._buildRows(tuple, memberIdx + 1);\n colSpan = childRow.colSpan;\n\n row.collapsed += childRow.collapsed;\n memberCollapsed = childRow.collapsed;\n }\n\n allCell.attr.colSpan = colSpan;\n colSpan -= 1;\n\n metadata.members += colSpan;\n row.colSpan += colSpan;\n }\n } else if (nextMember) {\n if (nextMember.measure) {\n colSpan = this._measures(nextMember.children, tuple);\n } else {\n childRow = this._buildRows(tuple, memberIdx + 1);\n colSpan = childRow.colSpan;\n\n row.collapsed += childRow.collapsed;\n memberCollapsed = childRow.collapsed;\n }\n\n metadata.members = colSpan;\n\n if (colSpan > 1) {\n cell.attr.colSpan = colSpan;\n row.colSpan += colSpan - 1;\n }\n }\n\n if (metadata.maxMembers < (metadata.members + memberCollapsed)) {\n metadata.maxMembers = metadata.members + memberCollapsed;\n }\n\n children = metadata.children + collapsed;\n\n if (metadata.maxChildren < children) {\n metadata.maxChildren = children;\n }\n\n (allCell || cell).tupleAll = true;\n\n return row;\n }\n });\n\n var RowBuilder = Class.extend({\n init: function() {\n this.metadata = {};\n },\n\n build: function(tuples) {\n var tbody = this._tbody(tuples);\n var colgroup = this._colGroup();\n\n return [\n element(\"table\", { className: tableStyles.table }, [colgroup, tbody])\n ];\n },\n\n reset: function() {\n this.metadata = {};\n },\n\n _rowLength: function() {\n var children = this.rows[0].children;\n var length = 0;\n var idx = 0;\n\n var cell = children[idx];\n\n while (cell) {\n length += (cell.attr.colSpan || 1);\n cell = children[++idx];\n }\n\n return length;\n },\n\n _colGroup: function() {\n var length = this._rowLength();\n var children = [];\n var idx = 0;\n\n for (; idx < length; idx++) {\n children.push(element(\"col\", null));\n }\n\n return element(\"colgroup\", null, children);\n },\n\n _tbody: function(tuples) {\n var root = tuples[0];\n\n this.rootTuple = root;\n this.rows = [];\n this.map = {};\n\n this._indexes = [];\n\n if (root) {\n this._buildRows(root, 0);\n this._normalize();\n } else {\n this.rows.push(element(\"tr\", { className: tableStyles.tableRow }, [ element(\"td\", { className: tableStyles.tableCell }, [ htmlNode(\" \") ]) ]));\n }\n\n return element(\"tbody\", { className: tableStyles.tbody }, this.rows);\n },\n\n _normalize: function() {\n var rows = this.rows;\n var rowsLength = rows.length;\n var rowIdx = 0;\n\n var members = this.rootTuple.members;\n var firstMemberName = members[0].name;\n var membersLength = members.length;\n var memberIdx = 0;\n\n var row;\n var cell;\n var maxcolSpan;\n var map = this.map;\n var allRow;\n\n for (; rowIdx < rowsLength; rowIdx++) {\n row = rows[rowIdx];\n\n for (memberIdx = 0; memberIdx < membersLength; memberIdx++) {\n maxcolSpan = this[members[memberIdx].name];\n cell = row.colSpan[\"dim\" + memberIdx];\n\n if (cell && cell.colSpan < maxcolSpan) {\n cell.attr.colSpan = (maxcolSpan - cell.colSpan) + 1;\n }\n }\n }\n\n row = map[firstMemberName];\n allRow = map[firstMemberName + \"all\"];\n\n if (row) {\n row.children[0].attr.className = tableStyles.tableCell + \" k-first\";\n }\n\n if (allRow) {\n allRow.children[0].attr.className += \" k-first \" + tableStyles.tableCell;\n }\n },\n\n _row: function(children) {\n var row = element(\"tr\", { className: tableStyles.tableRow }, children);\n row.rowSpan = 1;\n row.colSpan = {};\n\n this.rows.push(row);\n\n return row;\n },\n\n _content: function(member, tuple) {\n return htmlNode(this.template({\n member: member,\n tuple: tuple\n }), true);\n },\n\n _cell: function(className, children, member) {\n var cell = element(\"td\", { className: tableStyles.tableCell + \" \" + className }, children);\n cell.value = member.caption || member.name;\n return cell;\n },\n\n _buildRows: function(tuple, memberIdx) {\n var map = this.map;\n var path;\n\n var members = tuple.members;\n var member = members[memberIdx];\n var nextMember = members[memberIdx + 1];\n\n var children = member.children;\n var childrenLength = children.length;\n\n var levelNum = Number(member.levelNum);\n var rootName = this.rootTuple.members[memberIdx].name;\n var tuplePath = buildPath(tuple, memberIdx - 1).join(\"\");\n var rootLevelNum = Number(this.rootTuple.members[memberIdx].levelNum);\n var parentName = tuplePath + (rootLevelNum === levelNum ? \"\" : (member.parentName || \"\"));\n var row = map[parentName + \"all\"] || map[parentName];\n var colSpan = levelNum + 1;\n\n var cell, allCell;\n var childRow, allRow;\n var metadata;\n var className;\n var cellChildren = [];\n var expandIconAttr;\n var idx;\n\n if (!row || row.hasChild) {\n row = this._row();\n } else {\n row.hasChild = true;\n }\n\n if (member.measure) {\n className = row.allCell ? \"k-grid-footer\" : \"\";\n row.children.push(this._cell(className, [ this._content(children[0], tuple) ], children[0]));\n\n row.rowSpan = childrenLength;\n\n for (idx = 1; idx < childrenLength; idx++) {\n this._row([ this._cell(className, [ this._content(children[idx], tuple) ], children[idx]) ]);\n }\n\n return row;\n }\n\n map[tuplePath + member.name] = row;\n\n path = kendo.stringify(buildPath(tuple, memberIdx));\n\n metadata = this.metadata[path];\n if (!metadata) {\n this.metadata[path] = metadata = createMetadata(levelNum, memberIdx);\n metadata.rootLevelNum = rootLevelNum;\n }\n\n this._indexes.push({\n path: path,\n tuple: tuple\n });\n\n if (member.hasChildren) {\n if (metadata.expanded === false) {\n childrenLength = 0;\n metadata.children = 0;\n }\n\n let cellIconEl = $(\"\");\n cellIconEl.attr(kendo.attr(\"path\"), path);\n\n cellChildren.push(kendo.dom.html(kendo.ui.icon(cellIconEl, { icon: childrenLength ? STATE_EXPANDED_ICONNAME : STATE_COLLAPSED_ICONNAME }), true));\n }\n\n cellChildren.push(this._content(member, tuple));\n\n className = row.allCell && !childrenLength ? \"k-grid-footer\" : \"\";\n cell = this._cell(className, cellChildren, member);\n cell.colSpan = colSpan;\n\n row.children.push(cell);\n row.colSpan[\"dim\" + memberIdx] = cell;\n\n if (!this[rootName] || this[rootName] < colSpan) {\n this[rootName] = colSpan;\n }\n\n if (childrenLength) {\n row.allCell = false;\n row.hasChild = false;\n\n for (idx = 0; idx < childrenLength; idx++) {\n childRow = this._buildRows(children[idx], memberIdx);\n\n if (row !== childRow) {\n row.rowSpan += childRow.rowSpan;\n }\n }\n\n if (row.rowSpan > 1) {\n cell.attr.rowSpan = row.rowSpan;\n }\n\n metadata.children = row.rowSpan;\n\n allCell = this._cell(\"k-grid-footer\", [this._content(member, tuple)], member);\n allCell.colSpan = colSpan;\n\n allRow = this._row([ allCell ]);\n allRow.colSpan[\"dim\" + memberIdx] = allCell;\n allRow.allCell = true;\n\n map[tuplePath + member.name + \"all\"] = allRow;\n\n if (nextMember) {\n childRow = this._buildRows(tuple, memberIdx + 1);\n allCell.attr.rowSpan = childRow.rowSpan;\n }\n\n row.rowSpan += allRow.rowSpan;\n\n metadata.members = allRow.rowSpan;\n\n } else if (nextMember) {\n row.hasChild = false;\n this._buildRows(tuple, memberIdx + 1);\n\n (allCell || cell).attr.rowSpan = row.rowSpan;\n\n metadata.members = row.rowSpan;\n }\n\n if (metadata.maxChildren < metadata.children) {\n metadata.maxChildren = metadata.children;\n }\n\n if (metadata.maxMembers < metadata.members) {\n metadata.maxMembers = metadata.members;\n }\n\n return row;\n }\n });\n\n var ContentBuilder = Class.extend({\n init: function() {\n this.columnAxis = {};\n this.rowAxis = {};\n },\n\n build: function(data, columnAxis, rowAxis) {\n var index = columnAxis.indexes[0];\n var metadata = columnAxis.metadata[index ? index.path : undefined$1];\n\n this.columnAxis = columnAxis;\n this.rowAxis = rowAxis;\n\n this.data = data;\n\n this.rowLength = metadata ? metadata.maxChildren + metadata.maxMembers : columnAxis.measures.length || 1;\n\n if (!this.rowLength) {\n this.rowLength = 1;\n }\n\n var tbody = this._tbody();\n var colgroup = this._colGroup();\n\n return [\n element(\"table\", { className: tableStyles.contentTable }, [colgroup, tbody])\n ];\n },\n\n _colGroup: function() {\n var length = this.columnAxis.measures.length || 1;\n var children = [];\n var idx = 0;\n\n if (this.rows[0]) {\n length = this.rows[0].children.length;\n }\n\n for (; idx < length; idx++) {\n children.push(element(\"col\", null));\n }\n\n return element(\"colgroup\", null, children);\n },\n\n _tbody: function() {\n this.rows = [];\n\n if (this.data[0]) {\n this.columnIndexes = this._indexes(this.columnAxis, this.rowLength);\n this.rowIndexes = this._indexes(this.rowAxis, Math.ceil(this.data.length / this.rowLength));\n\n this._buildRows();\n } else {\n this.rows.push(element(\"tr\", { className: tableStyles.tableRow }, [ element(\"td\", { className: tableStyles.tableCell }, [ htmlNode(\" \") ]) ]));\n }\n\n return element(\"tbody\", { className: tableStyles.tbody }, this.rows);\n },\n\n _indexes: function(axisInfo, total) {\n var result = [];\n var axisInfoMember;\n var indexes = axisInfo.indexes;\n var metadata = axisInfo.metadata;\n var measures = axisInfo.measures;\n var measuresLength = measures.length || 1;\n\n var current;\n var dataIdx = 0;\n var firstEmpty = 0;\n\n var idx = 0;\n var length = indexes.length;\n var measureIdx;\n var index;\n\n var children;\n var skipChildren;\n\n if (!length) {\n for (measureIdx = 0; measureIdx < measuresLength; measureIdx++) {\n result[measureIdx] = {\n index: measureIdx,\n measure: measures[measureIdx],\n tuple: null\n };\n }\n\n return result;\n }\n\n for (; idx < length; idx++) {\n axisInfoMember = indexes[idx];\n current = metadata[axisInfoMember.path];\n children = current.children + current.members;\n skipChildren = 0;\n\n if (children) {\n children -= measuresLength;\n }\n\n if (current.expanded === false && current.children !== current.maxChildren) {\n skipChildren = current.maxChildren;\n }\n\n if (current.parentMember && current.levelNum === current.rootLevelNum) {\n children = -1;\n }\n\n if (children > -1) {\n for (measureIdx = 0; measureIdx < measuresLength; measureIdx++) {\n index = children + measureIdx;\n if (!current.children) {\n index += firstEmpty;\n }\n\n result[children + firstEmpty + measureIdx] = {\n children: children,\n index: dataIdx,\n measure: measures[measureIdx],\n tuple: axisInfoMember.tuple\n };\n dataIdx += 1;\n }\n\n while (result[firstEmpty] !== undefined$1) {\n firstEmpty += 1;\n }\n }\n\n if (firstEmpty === total) {\n break;\n }\n\n dataIdx += skipChildren;\n }\n\n return result;\n },\n\n _buildRows: function() {\n var rowIndexes = this.rowIndexes;\n var length = rowIndexes.length;\n var idx = 0;\n\n for (; idx < length; idx++) {\n var rowIndex = rowIndexes[idx];\n if (rowIndex) {\n this.rows.push(this._buildRow(rowIndex));\n }\n }\n },\n\n _buildRow: function(rowInfo) {\n var startIdx = rowInfo.index * this.rowLength;\n var columnIndexes = this.columnIndexes;\n var length = columnIndexes.length;\n var columnInfo;\n var cells = [];\n var idx = 0;\n\n var templateInfo;\n var cell, cellContent;\n var attr, dataItem, measure;\n\n for (; idx < length; idx++) {\n columnInfo = columnIndexes[idx];\n\n if (columnInfo === undefined$1) {\n continue;\n }\n\n attr = { className: tableStyles.tableCell };\n if (columnInfo.children) {\n attr.className += \" k-alt\";\n }\n\n cellContent = \"\";\n dataItem = this.data[startIdx + columnInfo.index];\n measure = columnInfo.measure || rowInfo.measure;\n\n templateInfo = {\n columnTuple: columnInfo.tuple,\n rowTuple: rowInfo.tuple,\n measure: measure,\n dataItem: dataItem\n };\n\n if (dataItem.value !== \"\" && measure && measure.type) {\n if (measure.type === \"status\") {\n cellContent = this.kpiStatusTemplate(templateInfo);\n } else if (measure.type === \"trend\") {\n cellContent = this.kpiTrendTemplate(templateInfo);\n }\n }\n\n if (!cellContent) {\n cellContent = this.dataTemplate(templateInfo);\n }\n\n cell = element(\"td\", attr, [ htmlNode(cellContent) ]);\n cell.value = dataItem.value;\n cells.push(cell);\n }\n\n attr = { className: tableStyles.tableRow };\n if (rowInfo.children) {\n attr.className += \" k-grid-footer\";\n }\n\n return element(\"tr\", attr, cells);\n }\n });\n\n ui.plugin(PivotGrid);\n\n kendo.PivotExcelExporter = kendo.Class.extend({\n init: function(options) {\n this.options = options;\n\n this.widget = options.widget;\n this.dataSource = this.widget.dataSource;\n },\n\n _columns: function() {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n\n var columnHeaderLength = columnHeaderTable.children[0].children.length;\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\n\n var width = this.widget.options.columnWidth;\n var result = [];\n var idx;\n\n if (rowHeaderLength && this.dataSource.data()[0]) {\n for (idx = 0; idx < rowHeaderLength; idx++) {\n result.push({\n autoWidth: true\n });\n }\n }\n\n for (idx = 0; idx < columnHeaderLength; idx++) {\n result.push({\n autoWidth: false,\n width: width\n });\n }\n\n return result;\n },\n\n _cells: function(rows, type, callback) {\n var result = [];\n\n var i = 0;\n var length = rows.length;\n\n var cellsLength;\n var row, cells;\n var j, cell;\n\n for (; i < length; i++) {\n row = [];\n cells = rows[i].children;\n cellsLength = cells.length;\n\n for (j = 0; j < cellsLength; j++) {\n cell = cells[j];\n\n row.push({\n background: \"#7a7a7a\",\n color: \"#fff\",\n value: cell.value,\n colSpan: cell.attr.colSpan || 1,\n rowSpan: cell.attr.rowSpan || 1\n });\n }\n\n if (callback) {\n callback(row, i);\n }\n\n result.push({\n cells: row,\n type: type\n });\n }\n\n return result;\n },\n\n _rows: function() {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n\n var columnHeaderLength = columnHeaderTable.children[0].children.length;\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\n\n var columnHeaderRows = columnHeaderTable.children[1].children;\n var rowHeaderRows = rowHeaderTable.children[1].children;\n var contentRows = this.widget.contentTree.children[0].children[1].children;\n\n var columnRows = this._cells(columnHeaderRows, \"header\");\n\n if (rowHeaderLength) {\n columnRows[0].cells.splice(0, 0, {\n background: \"#7a7a7a\",\n color: \"#fff\",\n value: \"\",\n colSpan: rowHeaderLength,\n rowSpan: columnHeaderRows.length\n });\n }\n\n var dataCallback = function(row, index) {\n var j = 0;\n var cell, value;\n var cells = contentRows[index].children;\n\n for (; j < columnHeaderLength; j++) {\n cell = cells[j];\n value = Number(cell.value);\n\n if (isNaN(value)) {\n value = cell.value;\n }\n\n row.push({\n background: \"#dfdfdf\",\n color: \"#333\",\n value: value,\n colSpan: 1,\n rowSpan: 1\n });\n }\n };\n\n var rowRows = this._cells(rowHeaderRows, \"data\", dataCallback);\n\n return columnRows.concat(rowRows);\n },\n\n _freezePane: function() {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\n var columnHeaderRows = columnHeaderTable.children[1].children;\n\n return {\n colSplit: rowHeaderLength,\n rowSplit: columnHeaderRows.length\n };\n },\n\n workbook: function() {\n var promise,\n resolveFn = function() {\n return {\n sheets: [ {\n columns: this._columns(),\n rows: this._rows(),\n freezePane: this._freezePane(),\n filter: null\n } ]\n };\n };\n\n if (this.dataSource.view()[0]) {\n promise = $.Deferred();\n promise.resolve();\n } else {\n promise = this.dataSource.fetch();\n }\n\n return promise.then(resolveFn.bind(this));\n }\n });\n\n var PivotExcelMixin = {\n extend: function(proto) {\n proto.events.push(\"excelExport\");\n proto.options.excel = $.extend(proto.options.excel, this.options);\n proto.saveAsExcel = this.saveAsExcel;\n },\n options: {\n proxyURL: \"\",\n filterable: false,\n fileName: \"Export.xlsx\"\n },\n saveAsExcel: function() {\n var excel = this.options.excel || {};\n\n var exporter = new kendo.PivotExcelExporter({\n widget: this\n });\n\n var resolveFn = function(book) {\n if (!this.trigger(\"excelExport\", { workbook: book })) {\n var workbook = new kendo.ooxml.Workbook(book);\n\n workbook.toDataURLAsync().then(function(dataURI) {\n kendo.saveAs({\n dataURI: dataURI,\n fileName: book.fileName || excel.fileName,\n proxyURL: excel.proxyURL,\n forceProxy: excel.forceProxy\n });\n });\n }\n };\n\n exporter.workbook().then(resolveFn.bind(this));\n }\n };\n\n kendo.PivotExcelMixin = PivotExcelMixin;\n\n if (kendo.ooxml && kendo.ooxml.Workbook) {\n PivotExcelMixin.extend(PivotGrid.prototype);\n }\n\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(PivotGrid.prototype);\n\n PivotGrid.fn._drawPDF = function() {\n return this._drawPDFShadow({\n width: this.wrapper.width()\n }, {\n avoidLinks: this.options.pdf.avoidLinks\n });\n };\n }\n\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(PivotGridV2.prototype);\n\n PivotGridV2.fn._drawPDF = function() {\n return this._drawPDFShadow({\n width: this.wrapper.width()\n }, {\n avoidLinks: this.options.pdf.avoidLinks\n });\n };\n }\n\n })(window.kendo.jQuery);\n var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}