{"version":3,"sources":["kendo.pivotgrid.js"],"names":["f","define","$","undefined","normalizeMeasures","measure","descriptor","name","descriptors","toString","call","map","d","type","normalizeMembers","member","expand","slice","normalizeName","indexOf","accumulateMembers","accumulator","rootTuple","tuple","level","idx","length","children","members","kendo","stringify","buildPath","descriptorsForAxes","tuples","k","result","push","parseJSON","addMissingPathMembers","axis","tupleMembers","found","j","firstTuple","getName","hierarchy","tupleToDescriptors","descriptorsForMembers","measures","tupletoSearch","MEASURES","findExistingTuple","createAggregateGetter","m","measureGetter","getter","field","aggregatorContext","state","aggregate","dataItem","isNumber","val","isNaN","isDate","getTime","addEmptyDataItem","value","fmtValue","ordinal","validateAxis","newAxis","membersCount","adjustDataByColumn","sourceTuples","targetTuples","rowsLength","data","columnIdx","rowIdx","dataIdx","columnsLength","targetColumnsLength","measuresLength","tupleIndex","adjustDataByRow","collection","index","queue","current","shift","apply","normalizeAxis","findDataIndex","memberIndex","counter","Math","max","mergeTuples","target","source","targetMembers","sourceMembers","parsedRoot","equalTuples","first","second","equal","toFind","membersLength","addMembers","i","len","path","findParentMember","parentMember","parentPath","parentName","measurePosition","normalizeTupleMeasures","extend","dataIndex","splice","parseSource","measureIndex","prepareDataOnRows","indices","rowIndex","columnIndex","targetIndex","sourceIndex","calcIndex","buildDataIndices","parseInt","prepareDataOnColumns","spliceIndex","concat","baseHierarchyPath","memberName","parts","split","expandMemberDescriptor","names","sort","sortDescriptor","sortDescriptorForMember","dir","crossJoin","r","pop","crossJoinCommand","tmp","measureNames","join","getRootNames","mapNames","rootNames","rootName","rootLength","expandedIdx","uniquePath","parseDescriptors","l","hierarchyName","expanded","child","root","serializeMembers","crossJoinCommands","command","serializeExpression","expression","operator","format","filterFunctionFormats","serializeFilters","filter","cube","filters","serializeOptions","parentTagName","options","capitalize","key","replace","toUpperCase","asArray","object","translateAxis","memberIdx","captionGetter","unameGetter","levelNameGetter","levelNumGetter","childrenGetter","hierarchyGetter","parentNameGetter","Member","caption","levelName","levelNum","hasChildren","xmlaDiscoverCommands","convertersMap","XmlaTransport","schemaDataReaderMap","xmlaReaderMethods","XmlaDataReader","sortExpr","removeExpr","PivotGrid","element","htmlNode","createMetadata","tupleName","ColumnBuilder","RowBuilder","ContentBuilder","PivotExcelMixin","window","ui","Class","Widget","DataSource","identity","o","isFunction","CHANGE","ERROR","PROGRESS","STATERESET","AUTO","DIV","NS","ROW_TOTAL_KEY","DATABINDING","DATABOUND","EXPANDMEMBER","COLLAPSEMEMBER","STATE_EXPANDED","STATE_COLLAPSED","HEADER_TEMPLATE","KPISTATUS_TEMPLATE","KPITREND_TEMPLATE","DATACELL_TEMPLATE","LAYOUT_TABLE","functions","sum","count","average","min","PivotCubeBuilder","init","this","dimensions","_normalizeDescriptors","keyField","fields","_rootTuples","measureAggregators","aggregatorsLength","dimensionsSchema","measureIdx","rootNamesLength","keys","_expandedTuples","mapItem","currentKeys","memberInfo","expandedNames","accumulatorKeys","_findExpandedMember","_asTuples","rootInfo","expandedInfo","_measuresInfo","rowAxis","aggregateNames","resultFuncs","formats","_toDataArray","measuresInfo","rowKeys","columnKeys","aggregates","n","row","column","columnKey","columnMeasureNames","rowMeasureNamesLength","rowMeasureNames","rowLength","columnLength","items","_addData","resultFunc","_matchDescriptors","getters","parentField","expectedValue","_calculateAggregate","totalItem","aggregator","_processColumns","columns","rowTotal","updateColumn","_measureAggregators","defaultAggregate","measureDescriptors","aggregators","toLowerCase","Error","_buildGetters","_parseDescriptors","parsedDescriptors","_filter","expr","_normalizeFilter","Query","logic","process","measuresRowAxis","columnDescriptors","rowDescriptors","aggregatedData","rows","rowValue","columnGetters","rowGetters","processed","expandedColumns","expandedRows","hasExpandedRows","rowDescriptor","rowName","columnsInfo","rowsInfo","measuresAxis","axes","PivotTransport","transport","discover","read","update","create","destroy","success","catalog","connection","PivotDataSource","schema","cubes","catalogs","hierarchies","levels","_cubeSchema","cubeBuilder","fn","_columns","_rows","values","_measures","_measuresAxis","_skipNormalize","_axes","uniqueName","defaultHierarchy","proxy","response","restrictions","levelUniqueName","memberUniqueName","dataGetter","_rawData","distinct","treeOp","childrenCardinality","dimensionUniqueName","hierarchyUniqueName","serverSorting","serverPaging","serverFiltering","serverGrouping","serverAggregates","_mergeState","_clearAxesData","query","rowsAxisDescriptors","columnsAxisDescriptors","_expandPath","origin","other","memberToExpand","_lastExpanded","_descriptorsForAxis","_query","_process","e","_view","trigger","that","page","pageSize","group","_data","_params","_updateLocalData","_pristineData","Deferred","resolve","promise","expandColumn","expandRow","originalData","reader","_processResult","processedData","columnIndexes","rowIndexes","resultAxis","axisToSkip","hasColumnTuples","_requestData","_rowMeasures","_normalizeTuples","_columnMeasures","_normalizeData","_mergeAxes","_readData","newData","_createTuple","buildRoot","_hasRoot","isRoot","sourceAxes","startIndex","mergedColumns","mergedRows","offset","columnMeasures","rowMeasures","oldRowsLength","newRowsLength","oldColumnsLength","newColumnsLength","_mergeColumnData","_mergeRowData","toAdd","toJSON","drop","_observe","_ranges","_addRange","_total","_pristineTotal","last","roots","indexes","_addMissingDataItems","metadata","_normalizeOrdinals","lastOrdinal","converter","deferred","parse","_handleCustomErrors","error","status","reject","done","schemaMeasures","catalogName","cubeName","schemaKPIs","kpis","schemaDimensions","schemaHierarchies","dimensionName","schemaLevels","schemaCubes","schemaCatalogs","schemaMembers","dataSource","contains","doesnotcontain","startswith","endswith","eq","neq","properties","Catalog","RemoteTransport","originalOptions","url","setup","dataType","contentType","parameterMap","ajax","description","groupName","displayFolder","defaultFormat","goal","trend","statusGraphic","trendGraphic","defaultMember","orderingProperty","XmlDataReader","_extend","methodName","option","xml","errors","fault","faultstring","faultcode","cells","ordinalGetter","valueGetter","fmtValueGetter","_mapSchema","obj","transports","xmla","readers","expressions","PivotSettingTarget","addClass","_refreshHandler","refresh","template","ns","enabled","emptyTemplate","_sortable","on","closest","attr","hasClass","remove","sortable","currentTarget","find","filterable","fieldMenu","PivotFieldMenu","messages","setting","empty","setDataSource","unbind","kendoSortable","connectWith","hint","cursor","start","item","focus","blur","change","action","add","move","newIndex","_indexOf","_isKPI","validate","isMeasure","isArray","allowUnsort","skipExpr","html","sortIcon","_sortIcon","off","icon","columnBuilder","rowBuilder","_dataSource","_bindConfigurator","_wrapper","_createLayout","_columnBuilder","_rowBuilder","_contentBuilder","_templates","columnsHeader","rowsHeader","eventName","request","button","builder","eventArgs","parent","is","childrenLoaded","maxChildren","toggleClass","_scrollable","autoBind","fetch","notify","events","reorderable","height","columnWidth","configurator","columnHeaderTemplate","rowHeaderTemplate","dataCellTemplate","kpiStatusTemplate","kpiTrendTemplate","measureFields","columnFields","rowFields","columnTemplate","rowTemplate","dataTemplate","useWithBlock","kendoPivotConfigurator","cellInfoByElement","cellInfo","contentBuilder","columnInfo","rowInfo","columnTuple","rowTuple","view","measuresTarget","rowsTarget","columnsTarget","setOptions","clearTimeout","_headerReflowTimeout","_stateResetHandler","_progressHandler","_errorHandler","_requestStart","_stateReset","_error","bind","_progress","reset","wrapper","css","_measureFields","_createSettingTarget","icons","_initSettingTargets","layoutTable","leftContainer","rightContainer","gridWrapper","wrap","support","scrollbar","content","append","columnsHeaderTree","dom","Tree","rowsHeaderTree","contentTree","toggle","progress","_resize","firstChild","_setSectionsWidth","_setSectionsHeight","_setContentWidth","_setContentHeight","_columnHeaderReflow","columnTable","browser","mozilla","setTimeout","leftColumn","width","outerWidth","measureFieldsHeight","columnFieldsHeight","rowFieldsHeight","innerHeight","columnsHeight","padding","firstRowHeight","secondRowHeight","contentTable","calculatedWidth","minWidth","ceil","_resetColspan","skipScrollbar","offsetHeight","clientHeight","outerHeight","cell","_colspan","_layoutTimeout","_axisMeasures","hasMeasure","touchScroller","columnAxis","render","build","_indexes","contentResized","movable","scrollLeft","sender","x","scrollTop","y","scroll","_wheelScroll","delta","ctrlKey","wheelDeltaY","preventDefault","one","maxMembers","tbody","_tbody","colgroup","_colGroup","_rowLength","_buildRows","_normalize","cellsLength","cellIdx","rowSpan","tupleAll","_rowIndex","colSpan","_row","parentRow","rowKey","notFirst","collapsed","className","measureRow","_cell","_content","childRow","childrenLength","allCell","cellAttr","nextMember","cellChildren","memberCollapsed","rootLevelNum","maxcolSpan","allRow","firstMemberName","expandIconAttr","tuplePath","hasChild","axisInfo","total","axisInfoMember","skipChildren","firstEmpty","_buildRow","templateInfo","cellContent","startIdx","plugin","PivotExcelExporter","widget","columnHeaderTable","rowHeaderTable","columnHeaderLength","rowHeaderLength","autoWidth","_cells","callback","background","color","dataCallback","rowRows","columnHeaderRows","rowHeaderRows","contentRows","columnRows","_freezePane","colSplit","rowSplit","workbook","then","sheets","freezePane","proto","excel","saveAsExcel","proxyURL","fileName","exporter","book","ooxml","Workbook","saveAs","dataURI","toDataURL","forceProxy","prototype","PDFMixin","_drawPDF","_drawPDFShadow","avoidLinks","pdf","jQuery","amd","a1","a2","a3"],"mappings":"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","file":"kendo.pivotgrid.min.js","sourcesContent":["/*!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n*/\n(function (f, define) {\n define('kendo.pivotgrid', [\n 'kendo.dom',\n 'kendo.data'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'pivotgrid',\n name: 'PivotGrid',\n category: 'web',\n description: 'The PivotGrid widget is a data summarization tool.',\n depends: [\n 'dom',\n 'data',\n 'data.xml',\n 'sortable'\n ],\n features: [\n {\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 {\n id: 'pivotgrid-filtering',\n name: 'Filtering',\n description: 'Support for filtering',\n depends: ['pivot.fieldmenu']\n },\n {\n id: 'pivotgrid-excel-export',\n name: 'Excel export',\n description: 'Export pivot grid data as Excel spreadsheet',\n depends: ['ooxml']\n },\n {\n id: 'pivotgrid-pdf-export',\n name: 'PDF export',\n description: 'Export pivot grid data as PDF',\n depends: [\n 'pdf',\n 'drawing'\n ]\n },\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 (function ($, undefined) {\n var kendo = window.kendo, ui = kendo.ui, Class = kendo.Class, Widget = ui.Widget, DataSource = kendo.data.DataSource, toString = {}.toString, identity = function (o) {\n return o;\n }, map = $.map, extend = $.extend, isFunction = kendo.isFunction, CHANGE = 'change', ERROR = 'error', MEASURES = 'Measures', PROGRESS = 'progress', STATERESET = 'stateReset', AUTO = 'auto', DIV = '
', NS = '.kendoPivotGrid', ROW_TOTAL_KEY = '__row_total__', DATABINDING = 'dataBinding', DATABOUND = 'dataBound', EXPANDMEMBER = 'expandMember', COLLAPSEMEMBER = 'collapseMember', STATE_EXPANDED = 'k-i-arrow-s', STATE_COLLAPSED = 'k-i-arrow-e', HEADER_TEMPLATE = '#: data.member.caption || data.member.name #', KPISTATUS_TEMPLATE = ' 0 ? \"open\" : data.dataItem.value < 0 ? \"denied\" : \"hold\"#\">#:data.dataItem.value#', KPITREND_TEMPLATE = ' 0 ? \"increase\" : data.dataItem.value < 0 ? \"decrease\" : \"equal\"#\">#:data.dataItem.value#', DATACELL_TEMPLATE = '#= data.dataItem ? kendo.htmlEncode(data.dataItem.fmtValue || data.dataItem.value) || \" \" : \" \" #', LAYOUT_TABLE = '' + '' + '' + '' + '' + '
' + '
' + '
' + '
' + '
';\n function normalizeMeasures(measure) {\n var descriptor = typeof measure === 'string' ? [{ name: measure }] : measure;\n var descriptors = toString.call(descriptor) === '[object Array]' ? descriptor : descriptor !== undefined ? [descriptor] : [];\n return map(descriptors, function (d) {\n if (typeof d === 'string') {\n return { name: d };\n }\n return {\n name: d.name,\n type: d.type\n };\n });\n }\n function normalizeMembers(member) {\n var descriptor = typeof member === 'string' ? [{\n name: [member],\n expand: false\n }] : member;\n var descriptors = toString.call(descriptor) === '[object Array]' ? descriptor : descriptor !== undefined ? [descriptor] : [];\n return map(descriptors, function (d) {\n if (typeof d === 'string') {\n return {\n name: [d],\n expand: false\n };\n }\n return {\n name: toString.call(d.name) === '[object Array]' ? d.name.slice() : [d.name],\n expand: d.expand\n };\n });\n }\n function normalizeName(name) {\n if (name.indexOf(' ') !== -1) {\n name = '[\"' + name + '\"]';\n }\n return name;\n }\n function accumulateMembers(accumulator, rootTuple, tuple, level) {\n var idx, length;\n var children;\n var member;\n if (!tuple) {\n tuple = rootTuple;\n }\n if (!level) {\n level = 0;\n }\n member = tuple.members[level];\n if (!member || member.measure) {\n return;\n }\n children = member.children;\n length = children.length;\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 if (length) {\n for (idx = 0; idx < length; idx++) {\n accumulateMembers(accumulator, rootTuple, children[idx], level);\n }\n }\n accumulateMembers(accumulator, rootTuple, tuple, level + 1);\n }\n function descriptorsForAxes(tuples) {\n var result = {};\n if (tuples.length) {\n accumulateMembers(result, tuples[0]);\n }\n var descriptors = [];\n for (var k in result) {\n descriptors.push({\n name: $.parseJSON(k),\n expand: result[k]\n });\n }\n return descriptors;\n }\n function addMissingPathMembers(members, axis) {\n var tuples = axis.tuples || [];\n var firstTuple = tuples[0];\n if (firstTuple && members.length < firstTuple.members.length) {\n var tupleMembers = firstTuple.members;\n for (var idx = 0; idx < tupleMembers.length; idx++) {\n if (tupleMembers[idx].measure) {\n continue;\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 if (!found) {\n members.push({\n name: [tupleMembers[idx].name],\n expand: false\n });\n }\n }\n }\n }\n function tupleToDescriptors(tuple) {\n var result = [];\n var members = tuple.members;\n for (var idx = 0; idx < members.length; idx++) {\n if (members[idx].measure) {\n continue;\n }\n result.push({\n name: [members[idx].name],\n expand: members[idx].children.length > 0\n });\n }\n return result;\n }\n function descriptorsForMembers(axis, members, measures) {\n axis = axis || {};\n addMissingPathMembers(members, axis);\n if (measures.length > 1) {\n members.push({\n name: MEASURES,\n measure: true,\n children: normalizeMembers(measures)\n });\n }\n var tupletoSearch = { members: members };\n if (axis.tuples) {\n var result = findExistingTuple(axis.tuples, tupletoSearch);\n if (result.tuple) {\n members = tupleToDescriptors(result.tuple);\n }\n }\n return members;\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 function isNumber(val) {\n return typeof val === 'number' && !isNaN(val);\n }\n function isDate(val) {\n return val && val.getTime;\n }\n var functions = {\n sum: function (value, state) {\n var accumulator = state.accumulator;\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\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 if (state.count === undefined) {\n state.count = 0;\n }\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n if (isNumber(value)) {\n state.count++;\n }\n return accumulator;\n },\n result: function (state) {\n var accumulator = state.accumulator;\n if (isNumber(accumulator)) {\n accumulator = accumulator / state.count;\n }\n return accumulator;\n }\n },\n max: function (value, state) {\n var accumulator = state.accumulator;\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\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 if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n if (accumulator > value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\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 _normalizeDescriptors: function (keyField, descriptors) {\n descriptors = descriptors || {};\n var fields = {};\n var field;\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 return descriptors;\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 var rootNamesLength = rootNames.length;\n var result = [];\n var keys = [];\n if (rootNamesLength || measureAggregators.length) {\n for (measureIdx = 0; measureIdx < aggregatorsLength; measureIdx++) {\n root = { members: [] };\n for (idx = 0; idx < rootNamesLength; idx++) {\n name = rootNames[idx];\n parts = name.split('&');\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,\n hierarchy: name\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,\n hierarchy: 'MEASURES'\n };\n }\n result[result.length] = root;\n }\n keys.push(ROW_TOTAL_KEY);\n }\n return {\n keys: keys,\n tuples: result\n };\n },\n _expandedTuples: function (map, expanded, measureAggregators) {\n var aggregatorsLength = measureAggregators.length || 1;\n var dimensionsSchema = this.dimensions || [];\n var measureIdx;\n var tuple;\n var key;\n var mapItem;\n var current;\n var currentKeys;\n var accumulator = [];\n var accumulatorKeys = [];\n var memberInfo;\n var expandedNames;\n var parts;\n var name;\n var idx;\n for (key in map) {\n mapItem = map[key];\n memberInfo = this._findExpandedMember(expanded, mapItem.uniquePath);\n current = accumulator[memberInfo.index] || [];\n currentKeys = accumulatorKeys[memberInfo.index] || [];\n expandedNames = memberInfo.member.names;\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 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,\n hierarchy: name\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,\n hierarchy: 'MEASURES'\n };\n }\n current[current.length] = tuple;\n }\n accumulator[memberInfo.index] = current;\n accumulatorKeys[memberInfo.index] = currentKeys;\n }\n return {\n keys: accumulatorKeys,\n tuples: accumulator\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 _asTuples: function (map, descriptor, measureAggregators) {\n measureAggregators = measureAggregators || [];\n var rootInfo = this._rootTuples(descriptor.root, measureAggregators);\n var expandedInfo = this._expandedTuples(map, descriptor.expanded, measureAggregators);\n return {\n keys: [].concat.apply(rootInfo.keys, expandedInfo.keys),\n tuples: [].concat.apply(rootInfo.tuples, expandedInfo.tuples)\n };\n },\n _measuresInfo: function (measures, rowAxis) {\n var idx = 0;\n var length = measures && measures.length;\n var aggregateNames = [];\n var resultFuncs = {};\n var formats = {};\n var descriptors = this.measures || {};\n var measure;\n var name;\n for (; idx < length; idx++) {\n name = measures[idx].descriptor.name;\n measure = descriptors[name] || {};\n aggregateNames.push(name);\n if (measure.result) {\n resultFuncs[name] = measure.result;\n }\n if (measure.format) {\n formats[name] = measure.format;\n }\n }\n return {\n names: aggregateNames,\n formats: formats,\n resultFuncs: resultFuncs,\n rowAxis: rowAxis\n };\n },\n _toDataArray: function (map, measuresInfo, rowKeys, columnKeys) {\n var result = [];\n var aggregates;\n var name, i, j, k, n;\n var row, column, columnKey;\n var rowMeasureNamesLength = 1;\n var rowMeasureNames = [];\n var columnMeasureNames;\n var rowLength = rowKeys.length || 1;\n var columnLength = columnKeys.length || 1;\n if (measuresInfo.rowAxis) {\n rowMeasureNames = measuresInfo.names;\n rowMeasureNamesLength = rowMeasureNames.length;\n } else {\n columnMeasureNames = measuresInfo.names;\n }\n for (i = 0; i < rowLength; i++) {\n row = map[rowKeys[i] || ROW_TOTAL_KEY];\n for (n = 0; n < rowMeasureNamesLength; n++) {\n if (measuresInfo.rowAxis) {\n columnMeasureNames = [rowMeasureNames[n]];\n }\n for (j = 0; j < columnLength; j++) {\n columnKey = columnKeys[j] || ROW_TOTAL_KEY;\n column = row.items[columnKey];\n if (columnKey === ROW_TOTAL_KEY) {\n aggregates = row.aggregates;\n } else {\n aggregates = column ? column.aggregates : {};\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 return result;\n },\n _addData: function (result, value, format, resultFunc) {\n var fmtValue = '';\n var ordinal;\n if (value) {\n value = resultFunc ? resultFunc(value) : value.accumulator;\n fmtValue = format ? kendo.format(format, value) : value;\n }\n ordinal = result.length;\n result[ordinal] = {\n ordinal: ordinal,\n value: value || '',\n fmtValue: fmtValue\n };\n },\n _matchDescriptors: function (dataItem, descriptor, getters) {\n var parts;\n var parentField;\n var expectedValue;\n var names = descriptor.names;\n var idx = descriptor.expandedIdx;\n var value;\n while (idx > 0) {\n parts = names[--idx].split('&');\n if (parts.length > 1) {\n parentField = parts[0];\n expectedValue = parts[1];\n value = getters[parentField](dataItem);\n value = value !== undefined && value !== null ? value.toString() : value;\n if (value != expectedValue) {\n return false;\n }\n }\n }\n return true;\n },\n _calculateAggregate: function (measureAggregators, aggregatorContext, totalItem) {\n var result = {};\n var state;\n var name;\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 return result;\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 for (; idx < descriptors.length; idx++) {\n descriptor = descriptors[idx];\n if (!this._matchDescriptors(dataItem, descriptor, getters)) {\n continue;\n }\n path = descriptor.names.slice(0, descriptor.expandedIdx).join('');\n name = descriptor.names[descriptor.expandedIdx];\n value = getters[name](dataItem);\n value = value !== undefined && value !== null ? value.toString() : value;\n parentName = name;\n name = name + '&' + value;\n key = path + name;\n column = columns[key] || {\n index: state.columnIndex,\n parentName: parentName,\n name: name,\n uniquePath: path + parentName,\n value: value\n };\n totalItem = rowTotal.items[key] || { aggregates: {} };\n rowTotal.items[key] = {\n index: column.index,\n aggregates: this._calculateAggregate(measureAggregators, aggregatorContext, totalItem)\n };\n if (updateColumn) {\n if (!columns[key]) {\n state.columnIndex++;\n }\n columns[key] = column;\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 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 if (measure) {\n aggregate = measure.aggregate;\n if (typeof aggregate === 'string') {\n defaultAggregate = functions[aggregate.toLowerCase()];\n if (!defaultAggregate) {\n throw new Error('There is no such aggregate function');\n }\n measure.aggregate = defaultAggregate.aggregate || defaultAggregate;\n measure.result = defaultAggregate.result;\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 () {\n return 1;\n }\n });\n }\n return aggregators;\n },\n _buildGetters: function (names) {\n var result = {};\n var parts;\n var name;\n for (var idx = 0; idx < names.length; idx++) {\n name = names[idx];\n parts = name.split('&');\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 return result;\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 for (var idx = 0; idx < expanded.length; idx++) {\n result.push(mapNames(expanded[idx].name, rootNames));\n }\n return {\n root: rootNames,\n expanded: result\n };\n },\n _filter: function (data, filter) {\n if (!filter) {\n return data;\n }\n var expr;\n var idx = 0;\n var filters = filter.filters;\n for (; idx < filters.length; idx++) {\n expr = filters[idx];\n if (expr.operator === 'in') {\n filters[idx] = this._normalizeFilter(expr);\n }\n }\n return new kendo.data.Query(data).filter(filter).data;\n },\n _normalizeFilter: function (filter) {\n var value = filter.value.split(',');\n var result = [];\n if (!value.length) {\n return value;\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 return {\n logic: 'or',\n filters: result\n };\n },\n process: function (data, options) {\n data = data || [];\n options = options || {};\n data = this._filter(data, options.filter);\n var measures = options.measures || [];\n var measuresRowAxis = options.measuresAxis === 'rows';\n var columnDescriptors = options.columns || [];\n var rowDescriptors = options.rows || [];\n if (!columnDescriptors.length && rowDescriptors.length && (!measures.length || measures.length && measuresRowAxis)) {\n columnDescriptors = rowDescriptors;\n rowDescriptors = [];\n measuresRowAxis = false;\n }\n if (!columnDescriptors.length && !rowDescriptors.length) {\n measuresRowAxis = false;\n }\n if (!columnDescriptors.length && measures.length) {\n columnDescriptors = normalizeMembers(options.measures);\n }\n columnDescriptors = this._parseDescriptors(columnDescriptors);\n rowDescriptors = this._parseDescriptors(rowDescriptors);\n var aggregatedData = {};\n var columns = {};\n var rows = {};\n var rowValue;\n var state = { columnIndex: 0 };\n var measureAggregators = this._measureAggregators(options);\n var columnGetters = this._buildGetters(columnDescriptors.root);\n var rowGetters = this._buildGetters(rowDescriptors.root);\n var processed = false;\n var expandedColumns = columnDescriptors.expanded;\n var expandedRows = rowDescriptors.expanded;\n var dataItem;\n var aggregatorContext;\n var hasExpandedRows = expandedRows.length !== 0;\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 if (columnDescriptors.root.length || rowDescriptors.root.length) {\n processed = true;\n for (idx = 0; idx < length; idx++) {\n dataItem = data[idx];\n aggregatorContext = {\n dataItem: dataItem,\n index: idx\n };\n rowTotal = aggregatedData[ROW_TOTAL_KEY] || {\n items: {},\n aggregates: {}\n };\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, rowTotal, state, !hasExpandedRows);\n rowTotal.aggregates = this._calculateAggregate(measureAggregators, aggregatorContext, rowTotal);\n aggregatedData[ROW_TOTAL_KEY] = rowTotal;\n for (rowIdx = 0; rowIdx < expandedRows.length; rowIdx++) {\n rowDescriptor = expandedRows[rowIdx];\n if (!this._matchDescriptors(dataItem, rowDescriptor, rowGetters)) {\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, {\n items: {},\n aggregates: {}\n }, state, true);\n continue;\n }\n path = rowDescriptor.names.slice(0, rowDescriptor.expandedIdx).join('');\n rowName = rowDescriptor.names[rowDescriptor.expandedIdx];\n parentName = rowName;\n rowValue = rowGetters[rowName](dataItem);\n rowValue = rowValue !== undefined ? rowValue.toString() : rowValue;\n rowName = rowName + '&' + rowValue;\n key = path + rowName;\n rows[key] = {\n uniquePath: path + parentName,\n parentName: parentName,\n name: rowName,\n value: rowValue\n };\n value = aggregatedData[key] || {\n items: {},\n aggregates: {}\n };\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, value, state, true);\n value.aggregates = this._calculateAggregate(measureAggregators, aggregatorContext, value);\n aggregatedData[key] = value;\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 columnsInfo = this._asTuples(columns, columnDescriptors, measuresRowAxis ? [] : measureAggregators);\n rowsInfo = this._asTuples(rows, rowDescriptors, measuresRowAxis ? measureAggregators : []);\n columns = columnsInfo.tuples;\n rows = rowsInfo.tuples;\n aggregatedData = this._toDataArray(aggregatedData, this._measuresInfo(measureAggregators, measuresRowAxis), rowsInfo.keys, columnsInfo.keys);\n } else {\n aggregatedData = columns = rows = [];\n }\n return {\n axes: {\n columns: { tuples: columns },\n rows: { tuples: rows }\n },\n data: aggregatedData\n };\n }\n });\n var PivotTransport = Class.extend({\n init: function (options, transport) {\n this.transport = transport;\n this.options = transport.options || {};\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 if (val === undefined) {\n return (options.connection || {}).catalog;\n }\n var connection = options.connection || {};\n connection.catalog = val;\n this.options.connection = connection;\n $.extend(this.transport.options, { connection: connection });\n },\n cube: function (val) {\n var options = this.options || {};\n if (val === undefined) {\n return (options.connection || {}).cube;\n }\n var connection = options.connection || {};\n connection.cube = val;\n this.options.connection = connection;\n extend(true, this.transport.options, { connection: connection });\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 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 if (cube) {\n schema = $.extend(schema, this._cubeSchema(cube));\n this.cubeBuilder = new PivotCubeBuilder(cube);\n }\n DataSource.fn.init.call(this, extend(true, {}, { schema: schema }, options));\n this.transport = new PivotTransport(this.options.transport || {}, this.transport);\n this._columns = normalizeMembers(this.options.columns);\n this._rows = normalizeMembers(this.options.rows);\n measures = this.options.measures || [];\n if (toString.call(measures) === '[object Object]') {\n measuresAxis = measures.axis || 'columns';\n measures = measures.values || [];\n }\n this._measures = normalizeMeasures(measures);\n this._measuresAxis = measuresAxis;\n this._skipNormalize = 0;\n this._axes = {};\n },\n _cubeSchema: function (cube) {\n return {\n dimensions: function () {\n var result = [];\n var dimensions = cube.dimensions;\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 if (cube.measures) {\n result.push({\n name: MEASURES,\n caption: MEASURES,\n uniqueName: MEASURES,\n type: 2\n });\n }\n return result;\n },\n hierarchies: function () {\n return [];\n },\n measures: function () {\n var result = [];\n var measures = cube.measures;\n for (var key in measures) {\n result.push({\n name: key,\n caption: key,\n uniqueName: key,\n aggregator: key\n });\n }\n return result;\n },\n members: $.proxy(function (response, restrictions) {\n var name = restrictions.levelUniqueName || restrictions.memberUniqueName;\n var dataGetter = kendo.getter(this.options.schema.data, true);\n var data = dataGetter(this.options.data) || this._rawData || [];\n var result = [];\n var getter;\n var value;\n var idx = 0;\n var distinct = {};\n if (name) {\n name = name.split('.')[0];\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 return result;\n }\n getter = kendo.getter(normalizeName(name), true);\n for (; idx < data.length; idx++) {\n value = getter(data[idx]);\n if ((value || value === 0) && !distinct[value]) {\n distinct[value] = true;\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 return result;\n }, this)\n };\n },\n options: {\n serverSorting: true,\n serverPaging: true,\n serverFiltering: true,\n serverGrouping: true,\n serverAggregates: true\n },\n catalog: function (val) {\n if (val === undefined) {\n return this.transport.catalog();\n }\n this.transport.catalog(val);\n this._mergeState({});\n this._axes = {};\n this.data([]);\n },\n cube: function (val) {\n if (val === undefined) {\n return this.transport.cube();\n }\n this.transport.cube(val);\n this._axes = {};\n this._mergeState({});\n this.data([]);\n },\n axes: function () {\n return this._axes;\n },\n columns: function (val) {\n if (val === undefined) {\n return this._columns;\n }\n this._skipNormalize += 1;\n this._clearAxesData = true;\n this._columns = normalizeMembers(val);\n this.query({\n columns: val,\n rows: this.rowsAxisDescriptors(),\n measures: this.measures()\n });\n },\n rows: function (val) {\n if (val === undefined) {\n return this._rows;\n }\n this._skipNormalize += 1;\n this._clearAxesData = true;\n this._rows = normalizeMembers(val);\n this.query({\n columns: this.columnsAxisDescriptors(),\n rows: val,\n measures: this.measures()\n });\n },\n measures: function (val) {\n if (val === undefined) {\n return this._measures;\n }\n this._skipNormalize += 1;\n this._clearAxesData = true;\n this.query({\n columns: this.columnsAxisDescriptors(),\n rows: this.rowsAxisDescriptors(),\n measures: normalizeMeasures(val)\n });\n },\n measuresAxis: function () {\n return this._measuresAxis || 'columns';\n },\n _expandPath: function (path, axis) {\n var origin = axis === 'columns' ? 'columns' : 'rows';\n var other = axis === 'columns' ? 'rows' : 'columns';\n var members = normalizeMembers(path);\n var memberToExpand = getName(members[members.length - 1]);\n this._lastExpanded = origin;\n members = descriptorsForMembers(this.axes()[origin], members, this.measures());\n for (var idx = 0; idx < members.length; idx++) {\n var memberName = getName(members[idx]);\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 var descriptors = {};\n descriptors[origin] = members;\n descriptors[other] = this._descriptorsForAxis(other);\n this._query(descriptors);\n },\n _descriptorsForAxis: function (axis) {\n var axes = this.axes();\n var descriptors = this[axis]() || [];\n if (axes && axes[axis] && axes[axis].tuples && axes[axis].tuples[0]) {\n descriptors = descriptorsForAxes(axes[axis].tuples || []);\n }\n return descriptors;\n },\n columnsAxisDescriptors: function () {\n return this._descriptorsForAxis('columns');\n },\n rowsAxisDescriptors: function () {\n return this._descriptorsForAxis('rows');\n },\n _process: function (data, e) {\n this._view = data;\n e = e || {};\n e.items = e.items || this._view;\n this.trigger(CHANGE, e);\n },\n _query: function (options) {\n var that = this;\n if (!options) {\n this._skipNormalize += 1;\n this._clearAxesData = true;\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 query: function (options) {\n var state = this._mergeState(options);\n if (this._data.length && this.cubeBuilder) {\n this._params(state);\n this._updateLocalData(this._pristineData);\n return $.Deferred().resolve().promise();\n }\n return this.read(state);\n },\n _mergeState: function (options) {\n options = DataSource.fn._mergeState.call(this, options);\n if (options !== undefined) {\n this._measures = normalizeMeasures(options.measures);\n if (options.columns) {\n options.columns = normalizeMembers(options.columns);\n } else if (!options.columns) {\n this._columns = [];\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 filter: function (val) {\n if (val === undefined) {\n return this._filter;\n }\n this._skipNormalize += 1;\n this._clearAxesData = true;\n this._query({\n filter: val,\n page: 1\n });\n },\n expandColumn: function (path) {\n this._expandPath(path, 'columns');\n },\n expandRow: function (path) {\n this._expandPath(path, 'rows');\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 _processResult: function (data, axes) {\n if (this.cubeBuilder) {\n var processedData = this.cubeBuilder.process(data, this._requestData);\n data = processedData.data;\n axes = processedData.axes;\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 if (!columnDescriptors.length && rowDescriptors.length && hasColumnTuples && (this._rowMeasures().length || !this.measures().length)) {\n axes = {\n columns: {},\n rows: axes.columns\n };\n }\n if (!columnDescriptors.length && !rowDescriptors.length && this.measuresAxis() === 'rows' && hasColumnTuples) {\n axes = {\n columns: {},\n rows: axes.columns\n };\n }\n this._axes = {\n columns: normalizeAxis(this._axes.columns),\n rows: normalizeAxis(this._axes.rows)\n };\n axes = {\n columns: normalizeAxis(axes.columns),\n rows: normalizeAxis(axes.rows)\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 this._skipNormalize -= 1;\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 if (this._lastExpanded == 'rows') {\n tuples = axes.columns.tuples;\n measures = this._columnMeasures();\n resultAxis = validateAxis(axes.columns, this._axes.columns, measures);\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 if (resultAxis) {\n axisToSkip = 'rows';\n axes.rows = resultAxis;\n adjustDataByRow(tuples, resultAxis.tuples, axes.columns.tuples.length, measures, data);\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 this._lastExpanded = null;\n var result = this._mergeAxes(axes, data, axisToSkip);\n this._axes = result.axes;\n return result.data;\n },\n _readData: function (data) {\n var axes = this.reader.axes(data);\n var newData = this.reader.data(data);\n if (this.cubeBuilder) {\n this._rawData = newData;\n }\n return this._processResult(newData, axes);\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 if (measure) {\n length -= 1;\n }\n for (; idx < length; idx++) {\n member = members[idx];\n levelNum = Number(member.levelNum);\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 if (buildRoot) {\n caption = 'All';\n if (levelNum === 0) {\n parentName = member.name;\n } else {\n levelNum -= 1;\n }\n hasChildren = true;\n name = hierarchy = levelName = parentName;\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 if (measure) {\n root.members.push({\n name: measure.name,\n children: []\n });\n }\n return root;\n },\n _hasRoot: function (target, source, descriptors) {\n if (source.length) {\n return findExistingTuple(source, target).tuple;\n }\n var members = target.members;\n var member;\n var descriptor;\n var isRoot = true;\n var levelNum;\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 if (!(levelNum === 0 || descriptor && member.name === getName(descriptor))) {\n isRoot = false;\n break;\n }\n }\n return isRoot;\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 var oldRowsLength = membersCount(axes.rows.tuples, rowMeasures);\n var newRowsLength = sourceAxes.rows.tuples.length;\n var oldColumnsLength = membersCount(axes.columns.tuples, columnMeasures);\n var newColumnsLength = sourceAxes.columns.tuples.length;\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 var mergedColumns = mergeTuples(axes.columns.tuples, tuples, columnMeasures);\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 axes.columns.tuples = mergedColumns.tuples;\n axes.rows.tuples = mergedRows.tuples;\n if (oldColumnsLength !== membersCount(axes.columns.tuples, columnMeasures)) {\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 startIndex = mergedRows.index + findDataIndex(mergedRows.parsedRoot, mergedRows.memberIndex, rowMeasures);\n data = this._mergeRowData(data, startIndex, newRowsLength, newColumnsLength);\n }\n if (axes.columns.tuples.length === 0 && axes.rows.tuples.length === 0) {\n data = [];\n }\n return {\n axes: axes,\n data: data\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 rowsLength = Math.max(rowsLength, 1);\n if (data.length > 0) {\n drop = columnMeasures;\n offset -= columnMeasures;\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, [\n index,\n 0\n ].concat(toAdd));\n }\n return data;\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 columnsLength = Math.max(columnsLength, 1);\n if (data.length > 0) {\n rowsLength -= rowMeasures;\n newData.splice(0, columnsLength * rowMeasures);\n }\n for (idx = 0; idx < rowsLength; idx++) {\n toAdd = newData.splice(0, columnsLength);\n dataIndex = rowIndex * columnsLength + idx * columnsLength;\n [].splice.apply(data, [\n dataIndex,\n 0\n ].concat(toAdd));\n }\n return data;\n },\n _columnMeasures: function () {\n var measures = this.measures();\n var columnMeasures = [];\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 return columnMeasures;\n },\n _rowMeasures: function () {\n var measures = this.measures();\n var rowMeasures = [];\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 return rowMeasures;\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 this._data = this._observe(data);\n this._ranges = [];\n this._addRange(this._data);\n this._total = this._data.length;\n this._pristineTotal = this._total;\n this._process(this._data);\n },\n data: function (value) {\n var that = this;\n if (value !== undefined) {\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 _normalizeTuples: function (tuples, source, descriptors, measures) {\n var length = measures.length || 1;\n var idx = 0;\n var roots = [];\n var indexes = {};\n var measureIdx = 0;\n var tuple, memberIdx, last;\n if (!tuples.length) {\n return;\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 tuples.splice.apply(tuples, [\n 0,\n tuples.length\n ].concat(roots).concat(tuples));\n idx = length;\n }\n if (measures.length) {\n last = tuple = tuples[idx];\n memberIdx = tuple.members.length - 1;\n while (tuple) {\n if (measureIdx >= length) {\n measureIdx = 0;\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 idx += 1;\n measureIdx += 1;\n tuple = tuples[idx];\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 return indexes;\n },\n _addMissingDataItems: function (result, metadata) {\n while (metadata.rowIndexes[parseInt(result.length / metadata.columnsLength, 10)] !== undefined) {\n for (var idx = 0; idx < metadata.columnsLength; idx++) {\n result = addEmptyDataItem(result);\n }\n }\n while (metadata.columnIndexes[result.length % metadata.columnsLength] !== undefined) {\n result = addEmptyDataItem(result);\n }\n return result;\n },\n _normalizeOrdinals: function (result, dataItem, metadata) {\n var lastOrdinal = metadata.lastOrdinal;\n if (!dataItem) {\n return addEmptyDataItem(result);\n }\n if (dataItem.ordinal - lastOrdinal > 1) {\n lastOrdinal += 1;\n while (lastOrdinal < dataItem.ordinal && result.length < metadata.length) {\n result = this._addMissingDataItems(addEmptyDataItem(result), metadata);\n lastOrdinal += 1;\n }\n }\n dataItem.ordinal = result.length;\n result[result.length] = dataItem;\n return result;\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 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 if (data.length === length) {\n return data;\n }\n while (result.length < length) {\n dataItem = data[dataIdx++];\n if (dataItem) {\n lastOrdinal = dataItem.ordinal;\n }\n result = this._normalizeOrdinals(this._addMissingDataItems(result, options), dataItem, options);\n options.lastOrdinal = lastOrdinal;\n }\n return result;\n },\n discover: function (options, converter) {\n var that = this, transport = that.transport;\n return $.Deferred(function (deferred) {\n transport.discover(extend({\n success: function (response) {\n response = that.reader.parse(response);\n if (that._handleCustomErrors(response)) {\n return;\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 schemaMeasures: function () {\n var that = this;\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 schemaKPIs: function () {\n var that = this;\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 schemaDimensions: function () {\n var that = this;\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 schemaHierarchies: function (dimensionName) {\n var that = this;\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 schemaLevels: function (hierarchyName) {\n var that = this;\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 schemaCubes: function () {\n var that = this;\n return that.discover({\n data: {\n command: 'schemaCubes',\n restrictions: { catalogName: that.transport.catalog() }\n }\n }, function (response) {\n return that.reader.cubes(response);\n });\n },\n schemaCatalogs: function () {\n var that = this;\n return that.discover({ data: { command: 'schemaCatalogs' } }, function (response) {\n return that.reader.catalogs(response);\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 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 _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 var options = DataSource.fn._params.call(this, data);\n options = extend({\n measures: this.measures(),\n measuresAxis: this.measuresAxis(),\n columns: this.columns(),\n rows: this.rows()\n }, options);\n if (this.cubeBuilder) {\n this._requestData = options;\n }\n return options;\n }\n });\n function addEmptyDataItem(result) {\n result[result.length] = {\n value: '',\n fmtValue: '',\n ordinal: result.length\n };\n return result;\n }\n function validateAxis(newAxis, axis, measures) {\n if (newAxis.tuples.length < membersCount(axis.tuples, measures)) {\n return axis;\n }\n return;\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 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 data[rowIdx * columnsLength + columnIdx].ordinal = rowIdx * targetColumnsLength + dataIdx;\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 for (rowIdx = 0; rowIdx < rowsLength; rowIdx++) {\n dataIdx = tupleIndex(sourceTuples[rowIdx], targetTuples);\n dataIdx *= measuresLength;\n dataIdx += rowIdx % measuresLength;\n for (columnIdx = 0; columnIdx < columnsLength; columnIdx++) {\n data[rowIdx * columnsLength + columnIdx].ordinal = dataIdx * columnsLength + columnIdx;\n }\n }\n }\n function tupleIndex(tuple, collection) {\n return findExistingTuple(collection, tuple).index;\n }\n function membersCount(tuples, measures) {\n if (!tuples.length) {\n return 0;\n }\n var queue = tuples.slice();\n var current = queue.shift();\n var result = 1;\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 current = queue.shift();\n }\n if (measures.length) {\n result = result * measures.length;\n }\n return result;\n }\n function normalizeAxis(axis) {\n if (!axis) {\n axis = { tuples: [] };\n }\n if (!axis.tuples) {\n axis.tuples = [];\n }\n return axis;\n }\n function findDataIndex(tuple, memberIndex, measures) {\n if (!tuple) {\n return 0;\n }\n var measuresLength = Math.max(measures.length, 1);\n var tuples = tuple.members.slice(0, memberIndex);\n var counter = measuresLength;\n var current = tuples.shift();\n if (measuresLength > 1) {\n measuresLength += 1;\n }\n while (current) {\n if (current.name === MEASURES) {\n counter += measuresLength;\n } else if (current.children) {\n [].push.apply(tuples, current.children);\n } else {\n counter++;\n [].push.apply(tuples, current.members);\n }\n current = tuples.shift();\n }\n return counter;\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 var result = findExistingTuple(target, source[0]);\n if (!result.tuple) {\n return {\n parsedRoot: null,\n tuples: source,\n memberIndex: 0,\n index: 0\n };\n }\n var targetMembers = result.tuple.members;\n var sourceMembers = source[0].members;\n var memberIndex = -1;\n if (targetMembers.length !== sourceMembers.length) {\n return {\n parsedRoot: null,\n tuples: source,\n memberIndex: 0,\n index: 0\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 targetMembers[idx].children = sourceMembers[idx].children;\n }\n }\n measures = Math.max(measures.length, 1);\n return {\n parsedRoot: result.tuple,\n index: result.index * measures,\n memberIndex: memberIndex,\n tuples: target\n };\n }\n function equalTuples(first, second) {\n var equal = true;\n var idx, length;\n first = first.members;\n second = second.members;\n for (idx = 0, length = first.length; idx < length; idx++) {\n if (first[idx].measure || second[idx].measure) {\n continue;\n }\n equal = equal && getName(first[idx]) === getName(second[idx]);\n }\n return equal;\n }\n function findExistingTuple(tuples, toFind) {\n var idx, length, tuple, found, counter = 0;\n var memberIndex, membersLength, member;\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 counter++;\n for (memberIndex = 0, membersLength = tuple.members.length; memberIndex < membersLength; memberIndex++) {\n member = tuple.members[memberIndex];\n if (member.measure) {\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 return { index: counter };\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 function findParentMember(tuple, map) {\n var members = tuple.members;\n var i, len, member, path = '';\n var parentPath = '';\n var parentMember;\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 path += member.name;\n parentMember = map[member.parentName];\n if (!parentMember) {\n parentMember = map[path];\n if (!parentMember) {\n return null;\n }\n }\n if (parentMember) {\n parentPath += parentMember.name;\n }\n }\n return parentMember;\n }\n function measurePosition(tuple, measures) {\n if (measures.length === 0) {\n return -1;\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 function normalizeTupleMeasures(tuple, index) {\n if (index < 0) {\n return;\n }\n var member = {\n name: MEASURES,\n measure: true,\n children: [$.extend({\n members: [],\n dataIndex: tuple.dataIndex\n }, tuple.members[index])]\n };\n tuple.members.splice(index, 1, member);\n tuple.dataIndex = undefined;\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 for (var i = 0; i < tuples.length; i++) {\n var tuple = tuples[i];\n tuple.dataIndex = i;\n normalizeTupleMeasures(tuple, measureIndex);\n var parentMember = findParentMember(tuple, map);\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 addMembers(tuple.members, map);\n }\n return result;\n }\n function prepareDataOnRows(tuples, data) {\n if (!tuples || !tuples.length) {\n return data;\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 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] || {\n value: '',\n fmtValue: '',\n ordinal: calcIndex\n };\n }\n }\n return result;\n }\n function prepareDataOnColumns(tuples, data) {\n if (!tuples || !tuples.length) {\n return data;\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 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] || {\n value: '',\n fmtValue: '',\n ordinal: calcIndex\n };\n }\n }\n return result;\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 while (tuple) {\n if (tuple.dataIndex !== undefined) {\n result.push(tuple.dataIndex);\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, [\n 0,\n 0\n ].concat(children));\n } else {\n [].splice.apply(tuples, [\n spliceIndex,\n 0\n ].concat(children));\n }\n spliceIndex += children.length;\n }\n tuple = tuples.shift();\n }\n return result;\n }\n PivotDataSource.create = function (options) {\n options = options && options.push ? { data: options } : options;\n var dataSource = options || {}, data = dataSource.data;\n dataSource.data = data;\n if (!(dataSource instanceof PivotDataSource) && dataSource instanceof kendo.data.DataSource) {\n throw new Error('Incorrect DataSource type. Only PivotDataSource instances are supported');\n }\n return dataSource instanceof PivotDataSource ? dataSource : new PivotDataSource(dataSource);\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 function expandMemberDescriptor(names, sort) {\n var idx = names.length - 1;\n var name = names[idx];\n var sortDescriptor;\n sortDescriptor = sortDescriptorForMember(sort, name);\n if (sortDescriptor && sortDescriptor.dir) {\n name = 'ORDER(' + name + '.Children,' + sortDescriptor.field + '.CurrentMember.MEMBER_CAPTION,' + sortDescriptor.dir + ')';\n } else {\n name += '.Children';\n }\n names[idx] = name;\n return names;\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 function crossJoin(names) {\n var result = 'CROSSJOIN({';\n var r;\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 result += '},{';\n result += r;\n result += '})';\n return result;\n }\n function crossJoinCommand(members, measures) {\n var tmp = members.slice(0);\n if (measures.length > 1) {\n tmp.push('{' + measureNames(measures).join(',') + '}');\n }\n return crossJoin(tmp);\n }\n function measureNames(measures) {\n var idx = 0;\n var length = measures.length;\n var result = [];\n var measure;\n for (; idx < length; idx++) {\n measure = measures[idx];\n result.push(measure.name !== undefined ? measure.name : measure);\n }\n return result;\n }\n function getName(name) {\n name = name.name || name;\n if (toString.call(name) === '[object Array]') {\n name = name[name.length - 1];\n }\n return name;\n }\n function getRootNames(members) {\n var length = members.length;\n var names = [];\n var idx = 0;\n for (; idx < length; idx++) {\n names.push(members[idx].name[0]);\n }\n return names;\n }\n function mapNames(names, rootNames) {\n var name;\n var rootName;\n var j;\n var idx = 0;\n var length = names.length;\n var rootLength = rootNames.length;\n rootNames = rootNames.slice(0);\n for (; idx < length; idx++) {\n name = names[idx];\n for (j = 0; j < rootLength; j++) {\n rootName = baseHierarchyPath(rootNames[j]);\n if (name.indexOf(rootName) !== -1) {\n rootNames[j] = name;\n break;\n }\n }\n }\n return {\n names: rootNames,\n expandedIdx: j,\n uniquePath: rootNames.slice(0, j + 1).join('')\n };\n }\n function parseDescriptors(members) {\n var expanded = [];\n var child = [];\n var root = [];\n var member;\n var j, l;\n var idx = 0;\n var length = members.length;\n var name;\n var hierarchyName;\n var found;\n for (; idx < length; idx++) {\n member = members[idx];\n name = member.name;\n found = false;\n if (toString.call(name) !== '[object Array]') {\n member.name = name = [name];\n }\n if (name.length > 1) {\n child.push(member);\n } else {\n hierarchyName = baseHierarchyPath(name[0]);\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 if (!found) {\n root.push(member);\n }\n if (member.expand) {\n expanded.push(member);\n }\n }\n }\n expanded = expanded.concat(child);\n return {\n root: root,\n expanded: expanded\n };\n }\n function serializeMembers(members, measures, sort) {\n var command = '';\n members = members || [];\n var expanded = parseDescriptors(members);\n var root = expanded.root;\n var rootNames = getRootNames(root);\n var crossJoinCommands = [];\n expanded = expanded.expanded;\n var length = expanded.length;\n var idx = 0;\n var memberName;\n var names = [];\n if (rootNames.length > 1 || measures.length > 1) {\n crossJoinCommands.push(crossJoinCommand(rootNames, measures));\n for (; idx < length; idx++) {\n memberName = expandMemberDescriptor(expanded[idx].name, sort);\n names = mapNames(memberName, rootNames).names;\n crossJoinCommands.push(crossJoinCommand(names, measures));\n }\n command += crossJoinCommands.join(',');\n } else {\n for (; idx < length; idx++) {\n memberName = expandMemberDescriptor(expanded[idx].name, sort);\n names.push(memberName[0]);\n }\n command += rootNames.concat(names).join(',');\n }\n return command;\n }\n var filterFunctionFormats = {\n contains: ', InStr({0}.CurrentMember.MEMBER_CAPTION,\"{1}\") > 0',\n doesnotcontain: ', InStr({0}.CurrentMember.MEMBER_CAPTION,\"{1}\") = 0',\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: ', NOT {0}.CurrentMember.MEMBER_CAPTION = \"{1}\"'\n };\n function serializeExpression(expression) {\n var command = '';\n var value = expression.value;\n var field = expression.field;\n var operator = expression.operator;\n if (operator == 'in') {\n command += '{';\n command += value;\n command += '}';\n } else {\n command += 'Filter(';\n command += field + '.MEMBERS';\n command += kendo.format(filterFunctionFormats[operator], field, value);\n command += ')';\n }\n return command;\n }\n function serializeFilters(filter, cube) {\n var command = '', current;\n var filters = filter.filters;\n var length = filters.length;\n var idx;\n for (idx = length - 1; idx >= 0; idx--) {\n current = 'SELECT (';\n current += serializeExpression(filters[idx]);\n current += ') ON 0';\n if (idx == length - 1) {\n current += ' FROM [' + cube + ']';\n command = current;\n } else {\n command = current + ' FROM ( ' + command + ' )';\n }\n }\n return command;\n }\n function serializeOptions(parentTagName, options, capitalize) {\n var result = '';\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 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 var convertersMap = {\n read: function (options) {\n var command = '
';\n command += 'SELECT NON EMPTY {';\n var columns = options.columns || [];\n var rows = options.rows || [];\n var measures = options.measures || [];\n var measuresRowAxis = options.measuresAxis === 'rows';\n var sort = options.sort || [];\n if (!columns.length && rows.length && (!measures.length || measures.length && measuresRowAxis)) {\n columns = rows;\n rows = [];\n measuresRowAxis = false;\n }\n if (!columns.length && !rows.length) {\n measuresRowAxis = false;\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 command += '} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON COLUMNS';\n if (rows.length || measuresRowAxis && measures.length > 1) {\n command += ', NON EMPTY {';\n if (rows.length) {\n command += serializeMembers(rows, measuresRowAxis ? measures : [], sort);\n } else {\n command += measureNames(measures).join(',');\n }\n command += '} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON ROWS';\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 if (measures.length == 1 && columns.length) {\n command += ' WHERE (' + measureNames(measures).join(',') + ')';\n }\n command += '' + options.connection.catalog + 'Multidimensional';\n return command.replace(/\\&/g, '&');\n },\n discover: function (options) {\n options = options || {};\n var command = '
';\n command += '' + (xmlaDiscoverCommands[options.command] || options.command) + '';\n command += '' + serializeOptions('RestrictionList', options.restrictions, true) + '';\n if (options.connection && options.connection.catalog) {\n options.properties = $.extend({}, { Catalog: options.connection.catalog }, options.properties);\n }\n command += '' + serializeOptions('PropertyList', options.properties) + '';\n command += '';\n return command;\n }\n };\n var XmlaTransport = kendo.data.RemoteTransport.extend({\n init: function (options) {\n var originalOptions = options;\n options = this.options = extend(true, {}, this.options, options);\n kendo.data.RemoteTransport.call(this, options);\n if (isFunction(originalOptions.discover)) {\n this.discover = originalOptions.discover;\n } else if (typeof originalOptions.discover === 'string') {\n this.options.discover = { url: originalOptions.discover };\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 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 discover: function (options) {\n return $.ajax(this.setup(options, 'discover'));\n }\n });\n function asArray(object) {\n if (object == null) {\n return [];\n }\n var type = toString.call(object);\n if (type !== '[object Array]') {\n return [object];\n }\n return object;\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 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 result.tuples.push({ members: members });\n }\n return result;\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 },\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 var xmlaReaderMethods = [\n 'axes',\n 'catalogs',\n 'cubes',\n 'dimensions',\n 'hierarchies',\n 'levels',\n 'measures'\n ];\n var XmlaDataReader = kendo.data.XmlDataReader.extend({\n init: function (options) {\n kendo.data.XmlDataReader.call(this, options);\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 for (; idx < length; idx++) {\n methodName = xmlaReaderMethods[idx];\n option = options[methodName];\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 var axes = asArray(kendo.getter('Axes.Axis', true)(root));\n var axis;\n var result = {\n columns: {},\n rows: {}\n };\n for (var idx = 0; idx < axes.length; idx++) {\n axis = axes[idx];\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 return result;\n },\n data: function (root) {\n root = kendo.getter('ExecuteResponse[\"return\"].root', true)(root);\n var cells = asArray(kendo.getter('CellData.Cell', true)(root));\n var result = [];\n var ordinalGetter = kendo.getter('[\\'@CellOrdinal\\']');\n var valueGetter = kendo.getter('Value[\\'#text\\']');\n var fmtValueGetter = kendo.getter('FmtValue[\\'#text\\']');\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 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 var result = [];\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 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 extend(true, kendo.data, {\n PivotDataSource: PivotDataSource,\n XmlaTransport: XmlaTransport,\n XmlaDataReader: XmlaDataReader,\n PivotCubeBuilder: PivotCubeBuilder,\n transports: { xmla: XmlaTransport },\n readers: { xmla: XmlaDataReader }\n });\n var sortExpr = function (expressions, name) {\n if (!expressions) {\n return null;\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 return null;\n };\n var removeExpr = function (expressions, name) {\n var result = [];\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 return result;\n };\n kendo.ui.PivotSettingTarget = Widget.extend({\n init: function (element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n that.element.addClass('k-pivot-setting');\n that.dataSource = kendo.data.PivotDataSource.create(options.dataSource);\n that._refreshHandler = $.proxy(that.refresh, that);\n that.dataSource.first(CHANGE, that._refreshHandler);\n if (!options.template) {\n that.options.template = '
${data.name || data}' + (that.options.enabled ? '' : '') + '
';\n }\n that.template = kendo.template(that.options.template);\n that.emptyTemplate = kendo.template(that.options.emptyTemplate);\n that._sortable();\n that.element.on('click' + NS, '.k-button,.k-item', function (e) {\n var target = $(e.target);\n var name = target.closest('[' + kendo.attr('name') + ']').attr(kendo.attr('name'));\n if (!name) {\n return;\n }\n if (target.hasClass('k-setting-delete')) {\n that.remove(name);\n } else if (that.options.sortable && target[0] === e.currentTarget) {\n that.sort({\n field: name,\n dir: target.find('.k-i-sort-asc')[0] ? 'desc' : 'asc'\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 that.refresh();\n },\n options: {\n name: 'PivotSettingTarget',\n template: null,\n filterable: false,\n sortable: false,\n emptyTemplate: '
${data}
',\n setting: 'columns',\n enabled: true,\n messages: { empty: 'Drop Fields Here' }\n },\n setDataSource: function (dataSource) {\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.dataSource = this.options.dataSource = dataSource;\n if (this.fieldMenu) {\n this.fieldMenu.setDataSource(dataSource);\n }\n dataSource.first(CHANGE, this._refreshHandler);\n this.refresh();\n },\n _sortable: function () {\n var that = this;\n if (that.options.enabled) {\n this.sortable = this.element.kendoSortable({\n connectWith: this.options.connectWith,\n filter: '>:not(.k-empty)',\n hint: that.options.hint,\n cursor: 'move',\n start: function (e) {\n e.item.focus().blur();\n },\n change: function (e) {\n var name = e.item.attr(kendo.attr('name'));\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 _indexOf: function (name, items) {\n var idx, length, index = -1;\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 _isKPI: function (data) {\n return data.type === 'kpi' || data.measure;\n },\n validate: function (data) {\n var isMeasure = data.type == 2 || 'aggregator' in data || this._isKPI(data);\n if (isMeasure) {\n return this.options.setting === 'measures';\n }\n if (this.options.setting === 'measures') {\n return isMeasure;\n }\n var items = this.dataSource[this.options.setting]();\n var name = data.defaultHierarchy || data.uniqueName;\n if (this._indexOf(name, items) > -1) {\n return false;\n }\n items = this.dataSource[this.options.setting === 'columns' ? 'rows' : 'columns']();\n if (this._indexOf(name, items) > -1) {\n return false;\n }\n return true;\n },\n add: function (name) {\n var items = this.dataSource[this.options.setting]();\n var i, l;\n name = $.isArray(name) ? name.slice(0) : [name];\n for (i = 0, l = name.length; i < l; i++) {\n if (this._indexOf(name[i], items) !== -1) {\n name.splice(i, 1);\n i -= 1;\n l -= 1;\n }\n }\n if (name.length) {\n items = items.concat(name);\n this.dataSource[this.options.setting](items);\n }\n },\n move: function (name, index) {\n var items = this.dataSource[this.options.setting]();\n var idx = this._indexOf(name, items);\n if (idx > -1) {\n name = items.splice(idx, 1)[0];\n items.splice(index, 0, name);\n this.dataSource[this.options.setting](items);\n }\n },\n remove: function (name) {\n var items = this.dataSource[this.options.setting]();\n var idx = this._indexOf(name, items);\n if (idx > -1) {\n items.splice(idx, 1);\n this.dataSource[this.options.setting](items);\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 var expressions = this.dataSource.sort() || [];\n var result = removeExpr(expressions, expr.field);\n if (skipExpr && expressions.length !== result.length) {\n expr = null;\n }\n if (expr) {\n result.push(expr);\n }\n this.dataSource.sort(result);\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 if (length) {\n for (; idx < length; idx++) {\n item = items[idx];\n item = item.name === undefined ? { name: item } : item;\n html += this.template(extend({ sortIcon: this._sortIcon(item.name) }, item));\n }\n } else {\n html = this.emptyTemplate(this.options.messages.empty);\n }\n this.element.html(html);\n },\n destroy: function () {\n Widget.fn.destroy.call(this);\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.element.off(NS);\n if (this.sortable) {\n this.sortable.destroy();\n }\n if (this.fieldMenu) {\n this.fieldMenu.destroy();\n }\n this.element = null;\n this._refreshHandler = null;\n },\n _sortIcon: function (name) {\n var expressions = this.dataSource.sort();\n var expr = sortExpr(expressions, getName(name));\n var icon = '';\n if (expr) {\n icon = 'k-i-sort-' + expr.dir;\n }\n return icon;\n }\n });\n var PivotGrid = Widget.extend({\n init: function (element, options) {\n var that = this;\n var columnBuilder;\n var rowBuilder;\n Widget.fn.init.call(that, element, options);\n that._dataSource();\n that._bindConfigurator();\n that._wrapper();\n that._createLayout();\n that._columnBuilder = columnBuilder = new ColumnBuilder();\n that._rowBuilder = rowBuilder = new RowBuilder();\n that._contentBuilder = new ContentBuilder();\n that._templates();\n that.columnsHeader.add(that.rowsHeader).on('click', 'span.k-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 if (button.parent().is('td')) {\n builder = rowBuilder;\n action = 'expandRow';\n eventArgs.axis = 'rows';\n }\n var expanded = button.hasClass(STATE_EXPANDED);\n var metadata = builder.metadata[path];\n var request = metadata.expanded === undefined;\n eventName = expanded ? COLLAPSEMEMBER : EXPANDMEMBER;\n eventArgs.childrenLoaded = metadata.maxChildren > metadata.children;\n if (that.trigger(eventName, eventArgs)) {\n return;\n }\n builder.metadata[path].expanded = !expanded;\n button.toggleClass(STATE_EXPANDED, !expanded).toggleClass(STATE_COLLAPSED, expanded);\n if (!expanded && request) {\n that.dataSource[action](eventArgs.path);\n } else {\n that.refresh();\n }\n });\n that._scrollable();\n if (that.options.autoBind) {\n that.dataSource.fetch();\n }\n kendo.notify(that);\n },\n events: [\n DATABINDING,\n DATABOUND,\n EXPANDMEMBER,\n COLLAPSEMEMBER\n ],\n options: {\n name: 'PivotGrid',\n autoBind: true,\n reorderable: true,\n filterable: false,\n sortable: 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 _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 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 _bindConfigurator: function () {\n var configurator = this.options.configurator;\n if (configurator) {\n $(configurator).kendoPivotConfigurator('setDataSource', this.dataSource);\n }\n },\n cellInfoByElement: function (element) {\n element = $(element);\n return this.cellInfo(element.index(), element.parent('tr').index());\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 if (!columnInfo || !rowInfo) {\n return null;\n }\n dataIndex = rowInfo.index * contentBuilder.rowLength + columnInfo.index;\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 setDataSource: function (dataSource) {\n this.options.dataSource = dataSource;\n this._dataSource();\n if (this.measuresTarget) {\n this.measuresTarget.setDataSource(dataSource);\n }\n if (this.rowsTarget) {\n this.rowsTarget.setDataSource(dataSource);\n }\n if (this.columnsTarget) {\n this.columnsTarget.setDataSource(dataSource);\n }\n this._bindConfigurator();\n if (this.options.autoBind) {\n dataSource.fetch();\n }\n },\n setOptions: function (options) {\n Widget.fn.setOptions.call(this, options);\n this._templates();\n },\n destroy: function () {\n Widget.fn.destroy.call(this);\n clearTimeout(this._headerReflowTimeout);\n },\n _dataSource: function () {\n var that = this;\n var dataSource = that.options.dataSource;\n dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n if (that.dataSource && this._refreshHandler) {\n that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(STATERESET, that._stateResetHandler).unbind(PROGRESS, that._progressHandler).unbind(ERROR, that._errorHandler);\n } else {\n that._refreshHandler = $.proxy(that.refresh, that);\n that._progressHandler = $.proxy(that._requestStart, that);\n that._stateResetHandler = $.proxy(that._stateReset, that);\n that._errorHandler = $.proxy(that._error, that);\n }\n that.dataSource = kendo.data.PivotDataSource.create(dataSource).bind(CHANGE, that._refreshHandler).bind(PROGRESS, that._progressHandler).bind(STATERESET, that._stateResetHandler).bind(ERROR, that._errorHandler);\n },\n _error: function () {\n this._progress(false);\n },\n _requestStart: function () {\n this._progress(true);\n },\n _stateReset: function () {\n this._columnBuilder.reset();\n this._rowBuilder.reset();\n },\n _wrapper: function () {\n var height = this.options.height;\n this.wrapper = this.element.addClass('k-widget k-pivot');\n if (height) {\n this.wrapper.css('height', height);\n }\n },\n _measureFields: function () {\n this.measureFields = $(DIV).addClass('k-pivot-toolbar k-header k-settings-measures');\n this.measuresTarget = this._createSettingTarget(this.measureFields, {\n setting: 'measures',\n messages: { empty: this.options.messages.measureFields }\n });\n },\n _createSettingTarget: function (element, options) {\n var template = '${data.name}';\n var sortable = options.sortable;\n var icons = '';\n if (sortable) {\n icons += '#if (data.sortIcon) {#';\n icons += '';\n icons += '#}#';\n }\n if (options.filterable || sortable) {\n icons += '';\n }\n if (this.options.reorderable) {\n icons += '';\n }\n if (icons) {\n template += '' + icons + '';\n }\n template += '';\n return new kendo.ui.PivotSettingTarget(element, $.extend({\n template: template,\n emptyTemplate: '${data}',\n enabled: this.options.reorderable,\n dataSource: this.dataSource\n }, options));\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 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 _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 k-widget');\n that._measureFields();\n that.columnFields = $(DIV).addClass('k-pivot-toolbar k-header k-settings-columns');\n that.rowFields = $(DIV).addClass('k-pivot-toolbar k-header k-settings-rows');\n that.columnsHeader = $('
').wrap('
');\n that.columnsHeader.parent().css('padding-right', kendo.support.scrollbar());\n that.rowsHeader = $('
');\n that.content = $('
');\n leftContainer.append(that.measureFields);\n leftContainer.append(that.rowFields);\n leftContainer.append(that.rowsHeader);\n gridWrapper.append(that.columnsHeader.parent());\n gridWrapper.append(that.content);\n rightContainer.append(that.columnFields);\n rightContainer.append(gridWrapper);\n that.wrapper.append(layoutTable);\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 that._initSettingTargets();\n },\n _progress: function (toggle) {\n kendo.ui.progress(this.wrapper, toggle);\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 _columnHeaderReflow: function () {\n var columnTable = this.columnsHeader.children('table');\n if (!kendo.support.browser.mozilla) {\n return;\n }\n clearTimeout(this._headerReflowTimeout);\n columnTable.css('table-layout', 'auto');\n this._headerReflowTimeout = setTimeout(function () {\n columnTable.css('table-layout', '');\n });\n },\n _setSectionsWidth: function () {\n var rowsHeader = this.rowsHeader;\n var leftColumn = rowsHeader.parent('.k-pivot-rowheaders').width(AUTO);\n var width;\n width = Math.max(this.measureFields.outerWidth(), this.rowFields.outerWidth());\n width = Math.max(rowsHeader.children('table').width(), width);\n leftColumn.width(width);\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 var padding = rowFieldsHeight - this.rowFields.height();\n var firstRowHeight = columnFieldsHeight > measureFieldsHeight ? columnFieldsHeight : measureFieldsHeight;\n var secondRowHeight = columnsHeight > rowFieldsHeight ? columnsHeight : rowFieldsHeight;\n this.measureFields.height(firstRowHeight);\n this.columnFields.height(firstRowHeight);\n this.rowFields.height(secondRowHeight - padding);\n this.columnsHeader.height(secondRowHeight);\n },\n _setContentWidth: function () {\n var contentTable = this.content.find('table');\n var columnTable = this.columnsHeader.children('table');\n var rowLength = contentTable.children('colgroup').children().length;\n var calculatedWidth = rowLength * this.options.columnWidth;\n var minWidth = Math.ceil(calculatedWidth / this.content.width() * 100);\n if (minWidth < 100) {\n minWidth = 100;\n }\n contentTable.add(columnTable).css('width', minWidth + '%');\n this._resetColspan(columnTable);\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 if (that.wrapper.is(':visible')) {\n if (!innerHeight || !height) {\n if (skipScrollbar) {\n scrollbar = 0;\n }\n content.height('auto');\n rowsHeader.height(content.height() - scrollbar);\n return;\n }\n innerHeight -= that.columnFields.outerHeight();\n innerHeight -= that.columnsHeader.outerHeight();\n if (innerHeight <= scrollbar * 2) {\n innerHeight = scrollbar * 2 + 1;\n if (!skipScrollbar) {\n innerHeight += scrollbar;\n }\n }\n content.height(innerHeight);\n if (skipScrollbar) {\n scrollbar = 0;\n }\n rowsHeader.height(innerHeight - scrollbar);\n }\n },\n _resetColspan: function (columnTable) {\n var that = this;\n var cell = columnTable.children('tbody').children(':first').children(':first');\n if (that._colspan === undefined) {\n that._colspan = cell.attr('colspan');\n }\n cell.attr('colspan', 1);\n clearTimeout(that._layoutTimeout);\n that._layoutTimeout = setTimeout(function () {\n cell.attr('colspan', that._colspan);\n that._colspan = undefined;\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 if (dataSource.measuresAxis() === axis) {\n if (dataSource[axis]().length === 0 || hasMeasure) {\n result = measures;\n }\n }\n return result;\n },\n items: function () {\n return [];\n },\n refresh: function () {\n var that = this;\n var dataSource = that.dataSource;\n var axes = dataSource.axes();\n var columns = (axes.columns || {}).tuples || [];\n var rows = (axes.rows || {}).tuples || [];\n var columnBuilder = that._columnBuilder;\n var rowBuilder = that._rowBuilder;\n var columnAxis = {};\n var rowAxis = {};\n if (that.trigger(DATABINDING, { action: 'rebind' })) {\n return;\n }\n columnBuilder.measures = that._axisMeasures('columns');\n that.columnsHeaderTree.render(columnBuilder.build(columns));\n that.rowsHeaderTree.render(rowBuilder.build(rows));\n columnAxis = {\n indexes: columnBuilder._indexes,\n measures: columnBuilder.measures,\n metadata: columnBuilder.metadata\n };\n rowAxis = {\n indexes: rowBuilder._indexes,\n measures: this._axisMeasures('rows'),\n metadata: rowBuilder.metadata\n };\n that.contentTree.render(that._contentBuilder.build(dataSource.view(), columnAxis, rowAxis));\n that._resize();\n if (that.touchScroller) {\n that.touchScroller.contentResized();\n } else {\n var touchScroller = kendo.touchScroller(that.content);\n if (touchScroller && touchScroller.movable) {\n that.touchScroller = touchScroller;\n touchScroller.movable.bind('change', function (e) {\n that.columnsHeader.scrollLeft(-e.sender.x);\n that.rowsHeader.scrollTop(-e.sender.y);\n });\n }\n }\n that._progress(false);\n that.trigger(DATABOUND);\n },\n _scrollable: function () {\n var that = this;\n var columnsHeader = that.columnsHeader;\n var rowsHeader = that.rowsHeader;\n that.content.scroll(function () {\n columnsHeader.scrollLeft(this.scrollLeft);\n rowsHeader.scrollTop(this.scrollTop);\n });\n rowsHeader.bind('DOMMouseScroll' + NS + ' mousewheel' + NS, $.proxy(that._wheelScroll, that));\n },\n _wheelScroll: function (e) {\n if (e.ctrlKey) {\n return;\n }\n var delta = kendo.wheelDeltaY(e);\n var scrollTop = this.content.scrollTop();\n if (delta) {\n e.preventDefault();\n $(e.currentTarget).one('wheel' + NS, false);\n this.rowsHeader.scrollTop(scrollTop + -delta);\n this.content.scrollTop(scrollTop + -delta);\n }\n }\n });\n var element = kendo.dom.element;\n var htmlNode = kendo.dom.html;\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 var buildPath = function (tuple, index) {\n var path = [];\n var idx = 0;\n for (; idx <= index; idx++) {\n path.push(tuple.members[idx].name);\n }\n return path;\n };\n var tupleName = function (tuple, index) {\n var name = '';\n var idx = 0;\n for (; idx <= index; idx++) {\n name += tuple.members[idx].name;\n }\n return name;\n };\n var ColumnBuilder = Class.extend({\n init: function () {\n this.measures = 1;\n this.metadata = {};\n },\n build: function (tuples) {\n var tbody = this._tbody(tuples);\n var colgroup = this._colGroup();\n return [element('table', null, [\n colgroup,\n tbody\n ])];\n },\n reset: function () {\n this.metadata = {};\n },\n _colGroup: function () {\n var length = this._rowLength();\n var children = [];\n var idx = 0;\n for (; idx < length; idx++) {\n children.push(element('col', null));\n }\n return element('colgroup', null, children);\n },\n _tbody: function (tuples) {\n var root = tuples[0];\n this.map = {};\n this.rows = [];\n this.rootTuple = root;\n this._indexes = [];\n if (root) {\n this._buildRows(root, 0);\n this._normalize();\n } else {\n this.rows.push(element('tr', null, [element('th', null, [htmlNode(' ')])]));\n }\n return element('tbody', null, this.rows);\n },\n _normalize: function () {\n var rows = this.rows;\n var rowsLength = rows.length;\n var rowIdx = 0;\n var row;\n var cellsLength;\n var cellIdx;\n var cells;\n var cell;\n for (; rowIdx < rowsLength; rowIdx++) {\n row = rows[rowIdx];\n if (row.rowSpan === 1) {\n continue;\n }\n cells = row.children;\n cellIdx = 0;\n cellsLength = cells.length;\n for (; cellIdx < cellsLength; cellIdx++) {\n cell = cells[cellIdx];\n if (cell.tupleAll) {\n cell.attr.rowSpan = row.rowSpan;\n }\n }\n }\n },\n _rowIndex: function (row) {\n var rows = this.rows;\n var length = rows.length;\n var idx = 0;\n for (; idx < length; idx++) {\n if (rows[idx] === row) {\n break;\n }\n }\n return idx;\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 if (length) {\n for (; idx < length; idx++) {\n rowLength += cells[idx].attr.colSpan || 1;\n }\n }\n if (!rowLength) {\n rowLength = this.measures;\n }\n return rowLength;\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 var row = map[rowKey];\n if (!row) {\n row = element('tr', null, []);\n row.parentMember = parentMember;\n row.collapsed = 0;\n row.colSpan = 0;\n row.rowSpan = 1;\n map[rowKey] = row;\n parentRow = map[rootName + (Number(levelNum) - 1)];\n if (parentRow) {\n children = parentRow.children;\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 this.rows.splice(this._rowIndex(parentRow) + 1, 0, row);\n } else {\n row.notFirst = false;\n if (!row.parentMember || row.parentMember !== parentMember) {\n row.parentMember = parentMember;\n row.collapsed = 0;\n row.colSpan = 0;\n }\n }\n return row;\n },\n _measures: function (measures, tuple, className) {\n var map = this.map;\n var row = map.measureRow;\n var measure;\n if (!row) {\n row = element('tr', null, []);\n map.measureRow = row;\n this.rows.push(row);\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 return length;\n },\n _content: function (member, tuple) {\n return htmlNode(this.template({\n member: member,\n tuple: tuple\n }));\n },\n _cell: function (className, children, member) {\n var cell = element('th', { className: 'k-header' + className }, children);\n cell.value = member.caption || member.name;\n return cell;\n },\n _buildRows: function (tuple, memberIdx, parentMember) {\n var members = tuple.members;\n var member = members[memberIdx];\n var nextMember = members[memberIdx + 1];\n var row, childRow, children, childrenLength;\n var cell, allCell, cellAttr;\n var cellChildren = [];\n var path;\n var idx = 0;\n var metadata;\n var colSpan;\n var collapsed = 0;\n var memberCollapsed = 0;\n if (member.measure) {\n this._measures(member.children, tuple);\n return;\n }\n path = kendo.stringify(buildPath(tuple, memberIdx));\n row = this._row(tuple, memberIdx, parentMember);\n children = member.children;\n childrenLength = children.length;\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 this._indexes.push({\n path: path,\n tuple: tuple\n });\n if (member.hasChildren) {\n if (metadata.expanded === false) {\n collapsed = metadata.maxChildren;\n row.collapsed += collapsed;\n metadata.children = 0;\n childrenLength = 0;\n }\n cellAttr = { className: 'k-icon ' + (childrenLength ? STATE_EXPANDED : STATE_COLLAPSED) };\n cellAttr[kendo.attr('path')] = path;\n cellChildren.push(element('span', cellAttr));\n }\n cellChildren.push(this._content(member, tuple));\n cell = this._cell(row.notFirst ? ' k-first' : '', cellChildren, member);\n row.children.push(cell);\n row.colSpan += 1;\n if (childrenLength) {\n allCell = this._cell(' k-alt', [this._content(member, tuple)], member);\n row.children.push(allCell);\n for (; idx < childrenLength; idx++) {\n childRow = this._buildRows(children[idx], memberIdx, member);\n }\n colSpan = childRow.colSpan;\n collapsed = childRow.collapsed;\n cell.attr.colSpan = colSpan;\n metadata.children = colSpan;\n metadata.members = 1;\n row.colSpan += colSpan;\n row.collapsed += collapsed;\n row.rowSpan = childRow.rowSpan + 1;\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 row.collapsed += childRow.collapsed;\n memberCollapsed = childRow.collapsed;\n }\n allCell.attr.colSpan = colSpan;\n colSpan -= 1;\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 row.collapsed += childRow.collapsed;\n memberCollapsed = childRow.collapsed;\n }\n metadata.members = colSpan;\n if (colSpan > 1) {\n cell.attr.colSpan = colSpan;\n row.colSpan += colSpan - 1;\n }\n }\n if (metadata.maxMembers < metadata.members + memberCollapsed) {\n metadata.maxMembers = metadata.members + memberCollapsed;\n }\n children = metadata.children + collapsed;\n if (metadata.maxChildren < children) {\n metadata.maxChildren = children;\n }\n (allCell || cell).tupleAll = true;\n return row;\n }\n });\n var RowBuilder = Class.extend({\n init: function () {\n this.metadata = {};\n },\n build: function (tuples) {\n var tbody = this._tbody(tuples);\n var colgroup = this._colGroup();\n return [element('table', null, [\n colgroup,\n tbody\n ])];\n },\n reset: function () {\n this.metadata = {};\n },\n _rowLength: function () {\n var children = this.rows[0].children;\n var length = 0;\n var idx = 0;\n var cell = children[idx];\n while (cell) {\n length += cell.attr.colSpan || 1;\n cell = children[++idx];\n }\n return length;\n },\n _colGroup: function () {\n var length = this._rowLength();\n var children = [];\n var idx = 0;\n for (; idx < length; idx++) {\n children.push(element('col', null));\n }\n return element('colgroup', null, children);\n },\n _tbody: function (tuples) {\n var root = tuples[0];\n this.rootTuple = root;\n this.rows = [];\n this.map = {};\n this._indexes = [];\n if (root) {\n this._buildRows(root, 0);\n this._normalize();\n } else {\n this.rows.push(element('tr', null, [element('td', null, [htmlNode(' ')])]));\n }\n return element('tbody', null, this.rows);\n },\n _normalize: function () {\n var rows = this.rows;\n var rowsLength = rows.length;\n var rowIdx = 0;\n var members = this.rootTuple.members;\n var firstMemberName = members[0].name;\n var membersLength = members.length;\n var memberIdx = 0;\n var row;\n var cell;\n var maxcolSpan;\n var map = this.map;\n var allRow;\n for (; rowIdx < rowsLength; rowIdx++) {\n row = rows[rowIdx];\n for (memberIdx = 0; memberIdx < membersLength; memberIdx++) {\n maxcolSpan = this[members[memberIdx].name];\n cell = row.colSpan['dim' + memberIdx];\n if (cell && cell.colSpan < maxcolSpan) {\n cell.attr.colSpan = maxcolSpan - cell.colSpan + 1;\n }\n }\n }\n row = map[firstMemberName];\n allRow = map[firstMemberName + 'all'];\n if (row) {\n row.children[0].attr.className = 'k-first';\n }\n if (allRow) {\n allRow.children[0].attr.className += ' k-first';\n }\n },\n _row: function (children) {\n var row = element('tr', null, children);\n row.rowSpan = 1;\n row.colSpan = {};\n this.rows.push(row);\n return row;\n },\n _content: function (member, tuple) {\n return htmlNode(this.template({\n member: member,\n tuple: tuple\n }));\n },\n _cell: function (className, children, member) {\n var cell = element('td', { className: className }, children);\n cell.value = member.caption || member.name;\n return cell;\n },\n _buildRows: function (tuple, memberIdx) {\n var map = this.map;\n var path;\n var members = tuple.members;\n var member = members[memberIdx];\n var nextMember = members[memberIdx + 1];\n var children = member.children;\n var childrenLength = children.length;\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 var cell, allCell;\n var childRow, allRow;\n var metadata;\n var className;\n var cellChildren = [];\n var expandIconAttr;\n var idx;\n if (!row || row.hasChild) {\n row = this._row();\n } else {\n row.hasChild = true;\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 row.rowSpan = childrenLength;\n for (idx = 1; idx < childrenLength; idx++) {\n this._row([this._cell(className, [this._content(children[idx], tuple)], children[idx])]);\n }\n return row;\n }\n map[tuplePath + member.name] = row;\n path = kendo.stringify(buildPath(tuple, memberIdx));\n metadata = this.metadata[path];\n if (!metadata) {\n this.metadata[path] = metadata = createMetadata(levelNum, memberIdx);\n metadata.rootLevelNum = rootLevelNum;\n }\n this._indexes.push({\n path: path,\n tuple: tuple\n });\n if (member.hasChildren) {\n if (metadata.expanded === false) {\n childrenLength = 0;\n metadata.children = 0;\n }\n expandIconAttr = { className: 'k-icon ' + (childrenLength ? STATE_EXPANDED : STATE_COLLAPSED) };\n expandIconAttr[kendo.attr('path')] = path;\n cellChildren.push(element('span', expandIconAttr));\n }\n cellChildren.push(this._content(member, tuple));\n className = row.allCell && !childrenLength ? 'k-grid-footer' : '';\n cell = this._cell(className, cellChildren, member);\n cell.colSpan = colSpan;\n row.children.push(cell);\n row.colSpan['dim' + memberIdx] = cell;\n if (!this[rootName] || this[rootName] < colSpan) {\n this[rootName] = colSpan;\n }\n if (childrenLength) {\n row.allCell = false;\n row.hasChild = false;\n for (idx = 0; idx < childrenLength; idx++) {\n childRow = this._buildRows(children[idx], memberIdx);\n if (row !== childRow) {\n row.rowSpan += childRow.rowSpan;\n }\n }\n if (row.rowSpan > 1) {\n cell.attr.rowSpan = row.rowSpan;\n }\n metadata.children = row.rowSpan;\n allCell = this._cell('k-grid-footer', [this._content(member, tuple)], member);\n allCell.colSpan = colSpan;\n allRow = this._row([allCell]);\n allRow.colSpan['dim' + memberIdx] = allCell;\n allRow.allCell = true;\n map[tuplePath + member.name + 'all'] = allRow;\n if (nextMember) {\n childRow = this._buildRows(tuple, memberIdx + 1);\n allCell.attr.rowSpan = childRow.rowSpan;\n }\n row.rowSpan += allRow.rowSpan;\n metadata.members = allRow.rowSpan;\n } else if (nextMember) {\n row.hasChild = false;\n this._buildRows(tuple, memberIdx + 1);\n (allCell || cell).attr.rowSpan = row.rowSpan;\n metadata.members = row.rowSpan;\n }\n if (metadata.maxChildren < metadata.children) {\n metadata.maxChildren = metadata.children;\n }\n if (metadata.maxMembers < metadata.members) {\n metadata.maxMembers = metadata.members;\n }\n return row;\n }\n });\n var ContentBuilder = Class.extend({\n init: function () {\n this.columnAxis = {};\n this.rowAxis = {};\n },\n build: function (data, columnAxis, rowAxis) {\n var index = columnAxis.indexes[0];\n var metadata = columnAxis.metadata[index ? index.path : undefined];\n this.columnAxis = columnAxis;\n this.rowAxis = rowAxis;\n this.data = data;\n this.rowLength = metadata ? metadata.maxChildren + metadata.maxMembers : columnAxis.measures.length || 1;\n if (!this.rowLength) {\n this.rowLength = 1;\n }\n var tbody = this._tbody();\n var colgroup = this._colGroup();\n return [element('table', null, [\n colgroup,\n tbody\n ])];\n },\n _colGroup: function () {\n var length = this.columnAxis.measures.length || 1;\n var children = [];\n var idx = 0;\n if (this.rows[0]) {\n length = this.rows[0].children.length;\n }\n for (; idx < length; idx++) {\n children.push(element('col', null));\n }\n return element('colgroup', null, children);\n },\n _tbody: function () {\n this.rows = [];\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 this._buildRows();\n } else {\n this.rows.push(element('tr', null, [element('td', null, [htmlNode(' ')])]));\n }\n return element('tbody', null, this.rows);\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 var current;\n var dataIdx = 0;\n var firstEmpty = 0;\n var idx = 0;\n var length = indexes.length;\n var measureIdx;\n var index;\n var children;\n var skipChildren;\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 return result;\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 if (children) {\n children -= measuresLength;\n }\n if (current.expanded === false && current.children !== current.maxChildren) {\n skipChildren = current.maxChildren;\n }\n if (current.parentMember && current.levelNum === current.rootLevelNum) {\n children = -1;\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 result[children + firstEmpty + measureIdx] = {\n children: children,\n index: dataIdx,\n measure: measures[measureIdx],\n tuple: axisInfoMember.tuple\n };\n dataIdx += 1;\n }\n while (result[firstEmpty] !== undefined) {\n firstEmpty += 1;\n }\n }\n if (firstEmpty === total) {\n break;\n }\n dataIdx += skipChildren;\n }\n return result;\n },\n _buildRows: function () {\n var rowIndexes = this.rowIndexes;\n var length = rowIndexes.length;\n var idx = 0;\n for (; idx < length; idx++) {\n this.rows.push(this._buildRow(rowIndexes[idx]));\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 var templateInfo;\n var cell, cellContent;\n var attr, dataItem, measure;\n for (; idx < length; idx++) {\n columnInfo = columnIndexes[idx];\n attr = {};\n if (columnInfo.children) {\n attr.className = 'k-alt';\n }\n cellContent = '';\n dataItem = this.data[startIdx + columnInfo.index];\n measure = columnInfo.measure || rowInfo.measure;\n templateInfo = {\n columnTuple: columnInfo.tuple,\n rowTuple: rowInfo.tuple,\n measure: measure,\n dataItem: dataItem\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 if (!cellContent) {\n cellContent = this.dataTemplate(templateInfo);\n }\n cell = element('td', attr, [htmlNode(cellContent)]);\n cell.value = dataItem.value;\n cells.push(cell);\n }\n attr = {};\n if (rowInfo.children) {\n attr.className = 'k-grid-footer';\n }\n return element('tr', attr, cells);\n }\n });\n ui.plugin(PivotGrid);\n kendo.PivotExcelExporter = kendo.Class.extend({\n init: function (options) {\n this.options = options;\n this.widget = options.widget;\n this.dataSource = this.widget.dataSource;\n },\n _columns: function () {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n var columnHeaderLength = columnHeaderTable.children[0].children.length;\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\n var width = this.widget.options.columnWidth;\n var result = [];\n var idx;\n if (rowHeaderLength && this.dataSource.data()[0]) {\n for (idx = 0; idx < rowHeaderLength; idx++) {\n result.push({ autoWidth: true });\n }\n }\n for (idx = 0; idx < columnHeaderLength; idx++) {\n result.push({\n autoWidth: false,\n width: width\n });\n }\n return result;\n },\n _cells: function (rows, type, callback) {\n var result = [];\n var i = 0;\n var length = rows.length;\n var cellsLength;\n var row, cells;\n var j, cell;\n for (; i < length; i++) {\n row = [];\n cells = rows[i].children;\n cellsLength = cells.length;\n for (j = 0; j < cellsLength; j++) {\n cell = cells[j];\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 if (callback) {\n callback(row, i);\n }\n result.push({\n cells: row,\n type: type\n });\n }\n return result;\n },\n _rows: function () {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n var columnHeaderLength = columnHeaderTable.children[0].children.length;\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\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 var columnRows = this._cells(columnHeaderRows, 'header');\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 var dataCallback = function (row, index) {\n var j = 0;\n var cell, value;\n var cells = contentRows[index].children;\n for (; j < columnHeaderLength; j++) {\n cell = cells[j];\n value = Number(cell.value);\n if (isNaN(value)) {\n value = cell.value;\n }\n row.push({\n background: '#dfdfdf',\n color: '#333',\n value: value,\n colSpan: 1,\n rowSpan: 1\n });\n }\n };\n var rowRows = this._cells(rowHeaderRows, 'data', dataCallback);\n return columnRows.concat(rowRows);\n },\n _freezePane: function () {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\n var columnHeaderRows = columnHeaderTable.children[1].children;\n return {\n colSplit: rowHeaderLength,\n rowSplit: columnHeaderRows.length\n };\n },\n workbook: function () {\n var promise;\n if (this.dataSource.view()[0]) {\n promise = $.Deferred();\n promise.resolve();\n } else {\n promise = this.dataSource.fetch();\n }\n return promise.then($.proxy(function () {\n return {\n sheets: [{\n columns: this._columns(),\n rows: this._rows(),\n freezePane: this._freezePane(),\n filter: null\n }]\n };\n }, this));\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 var exporter = new kendo.PivotExcelExporter({ widget: this });\n exporter.workbook().then($.proxy(function (book) {\n if (!this.trigger('excelExport', { workbook: book })) {\n var workbook = new kendo.ooxml.Workbook(book);\n kendo.saveAs({\n dataURI: workbook.toDataURL(),\n fileName: book.fileName || excel.fileName,\n proxyURL: excel.proxyURL,\n forceProxy: excel.forceProxy\n });\n }\n }, this));\n }\n };\n kendo.PivotExcelMixin = PivotExcelMixin;\n if (kendo.ooxml && kendo.ooxml.Workbook) {\n PivotExcelMixin.extend(PivotGrid.prototype);\n }\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(PivotGrid.prototype);\n PivotGrid.fn._drawPDF = function () {\n return this._drawPDFShadow({ width: this.wrapper.width() }, { avoidLinks: this.options.pdf.avoidLinks });\n };\n }\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));"],"sourceRoot":"/source/"}