!function(window) { function ActionItemsResolver() { function isArDrillthroughLink(link) { return null === link || void 0 === link ? !1 : link.match("javascript") && link.match(".goToReport"); } function getElementData(element, attributeName) { var data = element.attr(attributeName); return null === data || void 0 === data || 0 === data.length ? null : decodeURI(data); } function resolveBookmarkInfo(data) { function extractByKey(array, key, separator) { for (var i = 0; i < array.length; i++) { var elem = array[i], preffix = elem.substring(0, key.length); if (preffix.toUpperCase() === key.toUpperCase()) return elem.substring(key.length + separator.length, elem.length); } return null; } if (null === data || void 0 === data) return null; var bookmarkInfo = data.split(","), pageNumberValue = extractByKey(bookmarkInfo, "PageNumber", "="); if (null === pageNumberValue) return null; pageNumberValue = parseInt(pageNumberValue, 10); var targetValue = extractByKey(bookmarkInfo, "Target", "="); return null === targetValue ? null : { PageNumber: pageNumberValue, Target: targetValue }; } function resolveToggleInfo(data) { var parsedData; try { parsedData = $.parseJSON(data); } catch (ex) { return null; } return null === parsedData || void 0 === parsedData ? null : parsedData; } function resolvePageReportElementAction(element) { var dataValue = htmlDecode(getElementData(element, "data")), hrefValue = htmlDecode(getElementData(element, "href")); if (null === dataValue && null === hrefValue) return null; var bookmarkInfo = resolveBookmarkInfo(dataValue); if (null === bookmarkInfo && (bookmarkInfo = resolveBookmarkInfo(hrefValue)), null !== bookmarkInfo) return { actionType: ActionType.bookmark, reportType: ReportType.pageReport, element: element, pageNumber: bookmarkInfo.PageNumber, target: bookmarkInfo.Target }; if (element.is("[class$=toggle]")) { var toggleInfo = resolveToggleInfo(dataValue); if (null !== toggleInfo) return { actionType: ActionType.toggle, reportType: ReportType.pageReport, element: element, toggleInfo: toggleInfo }; } var drillthroughInfo = null !== dataValue ? dataValue : null !== hrefValue ? hrefValue : null; if (element.is("[class$=drillthrough]") || isArDrillthroughLink(drillthroughInfo)) return { actionType: ActionType.drillthrough, reportType: ReportType.pageReport, element: element, drillthroughLink: drillthroughInfo }; var hyperlinkUrl = null !== dataValue ? dataValue : null !== hrefValue ? hrefValue : null; return null !== hyperlinkUrl ? { actionType: ActionType.hyperlink, reportType: ReportType.pageReport, element: element, url: hyperlinkUrl } : null; } function htmlDecode(value) { return value ? $("
").html(value).text() : null; } function resolveFromPageReportContent(content) { return $(content).find("a").map(function(index, item) { return resolvePageReportElementAction($(item)); }).filter(function(item) { return null !== item; }).get().concat($(content).find("map > area").map(function(index, item) { return resolvePageReportElementAction($(item)); }).filter(function(item) { return null !== item; }).get()).concat($(content).find("span").map(function(index, item) { return resolvePageReportElementAction($(item)); }).filter(function(item) { return null !== item; }).get()); } function resolveFromSectionReportContent(content) { return $(content).find("a").map(function(index, item) { var element = $(item), url = getElementData(element, "href"); if (null === url) return !0; var sectionBookmarkLabel = /^toc?:\/\/(.*)/i.exec(url); return null !== sectionBookmarkLabel ? { actionType: ActionType.bookmark, reportType: ReportType.sectionReport, element: element, label: sectionBookmarkLabel[1] } : { actionType: ActionType.hyperlink, reportType: ReportType.sectionReport, element: element, url: url }; }).filter(function(item) { return null !== item; }).get(); } function resolve(content, reportType) { switch (reportType) { case ReportType.pageReport: return resolveFromPageReportContent(content); case ReportType.sectionReport: return resolveFromSectionReportContent(content); default: return []; } } var resolver = { resolve: resolve }; return resolver; } function parseParameterValue(value, type) { if (null === value) return null; if (type == ServiceParameterType.DateTime) { var millis = (+value - ticksOffsetFromUnixEpoch) / ticksInMillisecond, millisUtc = millis + new Date(millis).getTimezoneOffset() * millisecondsInMinute; return new Date(millisUtc); } return value; } function ar_convertServiceParameters(parameters) { function convertValues(values, type) { return (values || []).map(function(v) { return { label: v.Label, value: parseParameterValue(v.Value, type) }; }); } function resolveEditor(p) { return p.MultiLine && p.ParameterType == ServiceParameterType.String ? ParameterEditorType.MultiLine : p.AvailableValues && p.AvailableValues.length > 0 ? p.MultiValue ? ParameterEditorType.MultiValue : ParameterEditorType.SelectOneFromMany : ParameterEditorType.SingleValue; } var ServiceParameterState = { Ok: 0, ExpectValue: 1, HasOutstandingDependencies: 2, ValidationFailed: 3, DynamicValuesUnavailable: 4 }; return parameters.map(function(p) { return { name: p.Name, value: parseParameterValue(p.Value, p.ParameterType), values: convertValues(p.Values, p.ParameterType), availableValues: convertValues(p.AvailableValues, p.ParameterType), prompt: p.Prompt || p.Name, nullable: !!p.Nullable, multiline: !!p.MultiLine, multivalue: !!p.MultiValue, allowEmpty: !!p.AllowEmpty, dateOnly: !!p.DateOnly, type: function(value) { switch (value) { case ServiceParameterType.DateTime: return ParameterType.DateTime; case ServiceParameterType.Bool: return ParameterType.Bool; case ServiceParameterType.Int: return ParameterType.Int; case ServiceParameterType.Float: return ParameterType.Float; default: return ParameterType.String; } }(p.ParameterType), state: function(value) { switch (value) { case ServiceParameterState.ExpectValue: return ParameterState.ExpectValue; case ServiceParameterState.HasOutstandingDependencies: return ParameterState.HasOutstandingDependencies; case ServiceParameterState.ValidationFailed: return ParameterState.ValidationFailed; case ServiceParameterState.DynamicValuesUnavailable: return ParameterState.DynamicValuesUnavailable; default: return ParameterState.Ok; } }(p.State), error: p.ExtendedErrorInfo || "", editor: resolveEditor(p), dependantParameters: (p.DependantParameters || []).map(function(dependant) { return dependant.Name; }) }; }); } function ar_convertClientParameters(parameters) { return parameters.map(ar_convertClientParameter); } function ar_convertClientParameter(p) { function serialize(value) { if (value && value.getMonth) { var millisLocal = value.getTime() - value.getTimezoneOffset() * millisecondsInMinute; return millisLocal * ticksInMillisecond + ticksOffsetFromUnixEpoch; } return value; } function convertValues(values) { return (values || []).map(function(v) { return { Label: v.label || "", Value: serialize(v.hasOwnProperty("value") ? v.value : v) }; }); } return p.multivalue ? { MultiValue: !0, Name: p.name, Values: convertValues(p.values) } : { Name: p.name, Value: serialize(p.value) }; } function ArReportService(options, resourceManager) { function isUndefined(value) { return void 0 === value || null === value; } function open(reportId, parameters) { return $base.post("OpenReport", { version: 2, culture: "en_US", reportPath: reportId, acceptedFormats: [ formats.Html ], lifeTime: 600 }).then(function(d) { if (isUndefined(d.Token)) return $base.invalidResponse(d); var reportInfo = { token: d.Token, parameters: ar_convertServiceParameters(d.ParameterCollection || []), reportType: getReportType(reportId), autoRun: d.AutoRun }; if (parameters && parameters.length) { var def = $.Deferred(); return parameters = mergeParameters(reportInfo.parameters, parameters), validateParameters(reportInfo.token, parameters).done(function(params) { def.resolve($.extend(reportInfo, { parameters: params })); }).fail(function() { def.resolve(reportInfo); }), def.promise(); } return reportInfo; }); } function openDrillthroughReport(token, reportId) { return $base.post("OpenDrillthroughReport", { token: token, reportPath: reportId, lifeTime: 3600 }).then(function(d) { return isUndefined(d.Token) ? $base.invalidResponse(d) : { token: d.Token, parameters: ar_convertServiceParameters(d.ParameterCollection || []), reportType: getReportType(reportId), autoRun: d.AutoRun }; }); } function ping(reportToken) { return $base.post("GetStatus", { token: reportToken }).then(function(d) { var state = d.LoadState; if (isUndefined(state) || isUndefined(d.AvailablePages)) return $base.promise(!1); switch (state) { case loadStates.Error: case loadStates.Cancelled: case loadStates.Cancelling: return $base.promise(!1); } return $base.promise(!0); }); } function getReportType(reportId) { if (null === reportId || void 0 === reportId) return ReportType.unknown; var reportNameExtension = reportId.split(".").pop(); switch (reportNameExtension.toLowerCase()) { case "rdl": case "rdlx": return ReportType.pageReport; case "rpx": return ReportType.sectionReport; default: return ReportType.unknown; } } function close(reportToken, async) { return $base.post("CloseReport", { token: reportToken }, !1, async).then(function() { return !0; }); } function validateParameters(reportToken, parameters) { return $base.post("SetParameters", { token: reportToken, parametersSetAtClient: ar_convertClientParameters(parameters) }, !0).then(function(d) { var failedParams = ar_convertServiceParameters(d.ParameterCollection || []); return parameters.map(function(p) { var f = failedParams.filter(function(fp) { return fp.name == p.name; }); return 1 == f.length ? f[0] : (p.state = ParameterState.Ok, p.error = "", p); }); }); } function validateParameter(reportToken, parameter) { return $base.post("ValidateParameter", { token: reportToken, surrogate: ar_convertClientParameter(parameter) }).then(function(d) { return ar_convertServiceParameters(d.ParameterCollection || []); }); } function areValidParameters(parameters) { return parameters.every(function(p) { return p.state == ParameterState.Ok; }); } function run(reportToken, parameters) { return parameters && parameters.length > 0 ? validateParameters(reportToken, parameters).then(function(params) { return areValidParameters(params) ? runImpl(reportToken) : $base.errorPromise(SR("error.InvalidParameters")); }) : runImpl(reportToken); } function runImpl(reportToken) { return $base.post("RunReport", { token: reportToken }).then(function() { return pollStatus(reportToken); }).then(function() { return getDocumentUrl(reportToken); }); } function pollStatus(reportToken, returnPagesCount) { return $base.delay(getStatus.bind(service, reportToken), pollingTimeout).then(function(status) { return returnPagesCount ? status.pageCount : status.pageCount > 0 || pollStatus(reportToken); }); } function getStatus(reportToken) { return $base.post("GetStatus", { token: reportToken }).then(function(d) { var state = d.LoadState; if (isUndefined(state) || isUndefined(d.AvailablePages)) return $base.errorPromise(SR("error.InvalidResponse")); switch (state) { case loadStates.Error: return $base.errorPromise(SR("error.RequestFailed")); case loadStates.Cancelled: case loadStates.Cancelling: return $base.errorPromise(SR("error.RequestCancelled")); } return { state: state, pageCount: d.AvailablePages }; }); } function getPageCount(doctoken) { function getPageCountImpl() { getStatus(reportToken).done(function(status) { status.state == loadStates.Completed ? def.resolve(status.pageCount) : (def.notify(status.pageCount), setTimeout(getPageCountImpl, pollingTimeout)); }).fail(function(problem) { def.reject(problem); }); } var reportToken = resolveReportToken(doctoken); if (!reportToken) return $base.invalidArg("doctoken", doctoken); var def = $.Deferred(); return getPageCountImpl(), def.promise(); } function getPage(doctoken, index) { if (!resolveReportToken(doctoken)) return $base.invalidArg("doctoken", doctoken); var urlTemplate = "{0}&Page={1}", pageUrl = urlTemplate.format(doctoken, index + 1); return $base.get(pageUrl); } function getDocumentUrl(reportToken) { return $base.post("GetRenderedReportLink", { token: reportToken }).then(function(d) { var link = d.ReportLink; if (isUndefined(link) || isUndefined(link.Uri)) return $base.invalidResponse(d); var url = link.Uri; return url || resolveReportToken(url) ? url + "&WebViewerControlClientId=html5viewer&HtmlViewer=true" : $base.invalidResponse(d); }); } function getToc(doctoken) { var reportToken = resolveReportToken(doctoken); return reportToken ? loadBookmarks(reportToken, -1).then(function(bookmarks) { return { name: "$root", kids: bookmarks }; }) : $base.invalidArg("doctoken", doctoken); } function getBookmarks(token, parent, fromChild, count) { return $base.post("GetBookmarks", { token: token, parentId: parent, fromChild: fromChild, count: count }).then(function(d) { var bookmarks = (d.Bookmarks || []).map(function(b) { var id = b.ID || 0, childCount = b.ChildrenCount || 0, location = b.Location || { X: 0, Y: 0 }, kids = []; return childCount > 0 && (kids = function() { return loadBookmarks(token, id); }), { name: b.Name || "", page: b.Page || 0, location: { left: location.X, top: location.Y }, isLeaf: 0 === childCount, kids: kids }; }); return bookmarks.childCount = d.ChildrenCount || 0, bookmarks; }); } function loadBookmarks(token, parent) { return loadBookmarksImpl(token, parent, 0).then(function(bookmarks) { return delete bookmarks.childCount, bookmarks; }); } function toggle(token, toggleInfo) { return $base.post("ProcessOnClick", { token: token, data: toggleInfo }).then(function() { return pollStatus(token, !0); }).then(function(pagesCount) { return getDocumentUrl(token).then(function(url) { var info = { url: url, pagesCount: pagesCount }; return info; }); }); } function loadBookmarksImpl(token, parent, fromChild) { return getBookmarks(token, parent, fromChild, 100).then(function(kids) { var loadCount = fromChild + kids.length; return loadCount >= kids.childCount || loadCount >= maxBookmarksCount ? kids : loadBookmarksImpl(token, parent, loadCount).then(function(next) { return kids.concat(next); }); }); } function resolveReportToken(url) { return getQueryParameter(url, "token"); } function getExportUri(doctoken, exportType, settings) { var reportToken = resolveReportToken(doctoken); return reportToken ? $base.post("GetExportedReportLink", { token: reportToken, format: exportType, exportingParameters: settings, pageRange: null }).then(function(d) { var link = d.ReportLink; if (isUndefined(link) || isUndefined(link.Uri)) return $base.invalidResponse(d); var url = link.Uri; return url || resolveReportToken(url) ? url : $base.invalidResponse(d); }) : $base.invalidArg("doctoken", doctoken); } function exportImpl(doctoken, exportType, settings) { function translateSettings(ss) { var newSettings = {}; return Object.keys(ss || {}).forEach(function(key) { var val = ss[key]; switch (key) { case "saveAsDialog": val && (newSettings.SaveAsDialog = "true"); break; case "printing": val && (exportType == ExportType.Pdf ? newSettings.PrintOnOpen = !0 : exportType == ExportType.Html && (newSettings.WebViewer = !0, newSettings.Printing = !0)); break; default: newSettings[key] = val; } }), newSettings; } return getPageCount(doctoken).then(function(pc) { if (0 >= pc) throw new Error("document cannot be exported"); return getExportUri(doctoken, exportType, translateSettings(settings)); }); } function search(token, searchOptions) { var maxSearchResults = searchOptions.maxSearchResults || options.maxSearchResults || defaultMaxSearchResults, reportToken = resolveReportToken(token); return reportToken ? $base.post("Search", { token: reportToken, options: { Text: searchOptions.text, MatchCase: searchOptions.matchCase, WholeWord: searchOptions.wholePhrase, SearchBackward: !1 }, startFrom: searchOptions.from ? { ItemIndex: searchOptions.from.idx, TextLen: 1, PageIndex: searchOptions.from.page } : { PageIndex: -1 }, numberOfResults: maxSearchResults }).then(function(d) { return { hasMore: d.SearchResults.length == maxSearchResults, matches: d.SearchResults.map(function(sr) { return { idx: sr.ItemIndex, text: sr.DisplayText, page: sr.PageIndex, location: { left: sr.ItemArea.X, top: sr.ItemArea.Y } }; }) }; }) : $base.invalidArg("token", token); } function drillthrough(token, link) { var drillInfo = parseDrillthroughLink(link); return drillInfo && drillInfo.reportName ? openDrillthrough(token, drillInfo.reportName, drillInfo.parameters) : $base.errorPromise(SR("error.InvalidDrillthroughLink").format(link)); } function openDrillthrough(token, reportPath, parameters) { return openDrillthroughReport(token, reportPath).then(function(r) { function run() { return runImpl(r.token).then(function(documentToken) { return { reportToken: r.token, parameters: params, documentToken: documentToken }; }); } function findAndUpdateValue(parameter, clientParams) { var cp = clientParams.filter(function(x) { return x.name == parameter.name; }); return updateValue(parameter, cp[0]); } function resolveDependencies(dependencies) { return $.Deferred(function(deferred) { if (dependencies.length > 0) { var dependecy = dependencies.pop(); validateParameter(r.token, dependecy).then(function(updated) { return params = params.map(function(p) { var f = updated.filter(function(u) { return u.name == p.name; }); return 1 == f.length ? findAndUpdateValue(f[0], parameters) : p; }), resolveDependencies(dependencies); }).done(deferred.resolve).fail(deferred.reject); } else deferred.resolve(); }).promise(); } function resolveDependantParameters() { return $.Deferred(function(deferred) { var dependantParameters = params.filter(function(p) { return p.state == ParameterState.HasOutstandingDependencies; }); if (dependantParameters.length > 0) { var dependant = dependantParameters[0], dependencies = params.filter(function(p) { return p.dependantParameters && -1 != p.dependantParameters.indexOf(dependant.name); }); dependencies.length > 0 ? resolveDependencies(dependencies).then(resolveDependantParameters).done(deferred.resolve).fail(deferred.reject) : deferred.reject(); } else deferred.resolve(); }).promise(); } var params = mergeParameters(r.parameters, parameters); return params && params.length > 0 ? resolveDependantParameters().then(function() { return validateParameters(r.token, params); }).then(function(p) { return areValidParameters(p) && r.autoRun ? run() : { reportToken: r.token, parameters: params }; }) : run(); }); } function updateValue(parameter, clientParameter) { function convertValue(value, type) { if (type == ParameterType.DateTime) { if ("" === value) return null; if (!Date.isDate(value)) { var d = new Date(); return d.setTime(Date.parse(value)), isNaN(d) && (d = parseParameterValue(value, ServiceParameterType.DateTime)), d; } return value; } return value; } return void 0 === clientParameter || null === clientParameter ? parameter : (parameter.multivalue ? clientParameter.values ? parameter.values = clientParameter.values : (parameter.values.length > 0 && (parameter.values = []), parameter.values.push(convertValue(clientParameter.value, parameter.type))) : parameter.value = convertValue(clientParameter.value, parameter.type), parameter); } function mergeParameters(reportParams, clientParams) { var names = [], merged = reportParams.map(function(p) { names.push(p.name); var cp = clientParams.filter(function(clientParameter) { return p.name == clientParameter.name; }); return 0 === cp.length ? p : updateValue(p, cp[0]); }); return merged.push.apply(merged, clientParams.filter(function(p) { return -1 == names.indexOf(p.name); }).map(function(p) { return void 0 === p.promptUser && (p.promptUser = !1), p; })), merged; } function parseDrillthroughLink(link) { function GetViewModel(id) { return reportName = id, { goToReport: function(reportName, pp) { xreportName = reportName; for (var i in pp) params.push({ name: i, value: pp[i] }); } }; } var xreportName = "", params = []; try { var re = new RegExp(""", "g"); link = link.replace(re, '"'), eval(link); } catch (e) { return null; } return { reportName: xreportName, parameters: params }; } if (!options.url) throw new Error("options has no valid url"); var defaultMaxSearchResults = 50, pagesPollingTimeout = 1e3, pollingTimeout = options.pollingTimeout || pagesPollingTimeout, serviceUrl = options.url; serviceUrl.endsWith("/") || (serviceUrl += "/"); var SR = resourceManager && $.isFunction(resourceManager.get) ? resourceManager.get : identity, formats = { Rdf: 0, Ddf: 1, Xaml: 2, Image: 3, Pdf: 4, Html: 5, Word: 6, Xls: 7, Xml: 8 }, loadStates = { NotStarted: 0, InProgress: 1, Completed: 2, Cancelling: 3, Cancelled: 4, Error: 5 }, service = { open: open, close: close, toggle: toggle, run: run, validateParameters: validateParameters, validateParameter: validateParameter, validateParameterSupported: function() { return !0; }, getPageCount: getPageCount, getPage: getPage, getToc: getToc, "export": exportImpl, search: search, drillthrough: drillthrough, ping: ping }, $base = ReportServiceBase(service, serviceUrl), maxBookmarksCount = 1e5; return service; } function ars_convertClientParameters(parameters) { function convertValue(value) { return Date.isDate(value) ? Date.format(value, "MM/dd/yyyy HH:mm:ss") : value; } var paramDomain = { specifiedValues: 0, selectAll: 1, acceptingDynamicValues: 2 }; return (parameters || []).map(function(p) { if (p.multivalue) { var values = p.values.map(function(pv) { return convertValue(pv.hasOwnProperty("value") ? pv.value : pv); }).filter(function(v) { return null !== v && void 0 !== v; }); return 1 == values.length && values[0] == ParameterSpecialValue.SelectAll ? { Name: p.name, Domain: paramDomain.selectAll, Values: [] } : { Name: p.name, Domain: paramDomain.specifiedValues, Values: values }; } return { Name: p.name, Domain: paramDomain.specifiedValues, Values: [ convertValue(p.value) ].filter(function(v) { return null !== v && void 0 !== v; }) }; }); } function ars_parseParametersXml(xml) { function convertDataType(value) { var map = { string: ParameterType.String, "boolean": ParameterType.Bool, bool: ParameterType.Bool, datetime: ParameterType.DateTime, integer: ParameterType.Int, "int": ParameterType.Int, "float": ParameterType.Float }; return map[(value || "").toLowerCase()] || ParameterType.String; } function convertState(value) { var map = { hasvalidvalue: ParameterState.Ok, missingvalidvalue: ParameterState.ExpectValue, hasoutstandingdependencies: ParameterState.HasOutstandingDependencies, dynamicvaluesunavailable: ParameterState.DynamicValuesUnavailable }; return map[(value || "").toLowerCase()] || ParameterState.Ok; } function parseValue(value, type) { if (null === value) return null; switch (type) { case ParameterType.Bool: return Boolean.parse(value); case ParameterType.Int: case ParameterType.Float: return "" === value ? null : +value; case ParameterType.DateTime: if ("" === value) return null; if (!Date.isDate(value)) { var d = new Date(); return d.setTime(Date.parse(value)), d; } return value; } return value; } function parseValuesElement(e, parameter) { return $(e).children().map(function() { var $this = $(this), stringValue = $this.text(), attrs = $this.attrs(), isSpecial = Boolean.parse(attrs.isspecial); return isSpecial ? { label: attrs.label || stringValue, value: function() { switch (stringValue.toLowerCase()) { case "blank": case "empty": return parameter.type == ParameterType.String ? "" : null; case "null": return null; case "unspecified": return parameter.nullable ? null : void 0; case "selectall": return ParameterSpecialValue.SelectAll; default: return stringValue; } }() } : { label: attrs.label || stringValue, value: parseValue(stringValue, parameter.type) }; }).get(); } function resolveEditor(p) { return p.multiline && p.type == ParameterType.String ? ParameterEditorType.MultiLine : p.multivalue ? ParameterEditorType.MultiValue : p.definesValidValues && p.availableValues.length > 0 ? ParameterEditorType.SelectOneFromMany : ParameterEditorType.SingleValue; } function isDateOnlyDateDomain(dateDomain) { return "Day" == dateDomain || "Month" == dateDomain || "MonthFixedYear" == dateDomain || "Year" == dateDomain; } return $(xml).find("Parameter").map(function() { var $this = $(this), attrs = $this.attrs(), multivalue = Boolean.parse(attrs.multivalue), parameter = { name: attrs.name || "", type: convertDataType(attrs.datatype), hidden: Boolean.parse(attrs.hidden), multivalue: multivalue, multiline: Boolean.parse(attrs.multiline || "false"), allowEmpty: Boolean.parse(attrs.allowblank), dateOnly: isDateOnlyDateDomain(attrs.datedomain), nullable: Boolean.parse(attrs.nullable) && !multivalue, prompt: attrs.prompt || attrs.name || "", state: convertState(attrs.state), promptUser: Boolean.parse(attrs.promptuser), definesValidValues: Boolean.parse(attrs.definesvalidvalues), selectAllEnabled: Boolean.parse(attrs.selectallenabled), dateDomain: attrs.datedomain || "" }; return $.each(this.childNodes, function() { switch (this.nodeName.toLowerCase()) { case "values": parameter.values = parseValuesElement(this, parameter); break; case "validvalues": parameter.availableValues = parseValuesElement(this, parameter); } }), parameter.state == ParameterState.Ok && parameter.values && 1 == parameter.values.length && "Unspecified" == parameter.values[0].label && (parameter.state = ParameterState.ExpectValue), parameter.values = parameter.values || [], parameter.value = parameter.values.length ? parameter.values[0].value : null, parameter.editor = resolveEditor(parameter), parameter.error = "", parameter; }).get(); } function ArsReportService(options, resourceManager) { function documentBase(html) { var doc = $(""); doc.html(html); var style = doc.find("style"); if (style.length) { var text = style.text(); text = text.replace(/background-image\s*:\s*url\((.*)\)/g, function(match, url) { return url = url.replace(/&/g, "&"), url = isAbsoluteUri(url) ? url : resourceHandler + url, "background-image:url({0})".format(url); }), style.text(text); } doc.find("img").each(function() { var $this = $(this), src = $this.attr("src"); isBase64(src) || isAbsoluteUri(src) || (src += "&MobileGet=1", $this.attr("src", resourceHandler + src)); }); var tocUrl = doc.find("meta[name=tocUrl]").attr("content"), documentId = doc.find("meta[name=DocumentId]").attr("content"); return { html: doc, tocUrl: tocUrl, documentId: documentId }; } function pageDocument(token, html) { function getPage(index) { var page = html.clone(); return page.children("div").children("div.page").not(function(i) { return i == index; }).remove(), page.html(); } function exportType(extension) { switch (extension) { case "Xls": return "Excel"; default: return extension; } } var $base = documentBase(html); html = $base.html, html.find("div.page").children().filter(function() { return "absolute" === $(this).css("position"); }).css("position", "relative").css("left", "").css("top", ""); var pages = html.find("div.page").length; return $.extend($base, { reportToken: token, pages: pages, getPage: getPage, exportType: exportType }); } function sectionDocument(token, html) { function getPage(index) { var page = html.clone(); return page.children("div").not(function(i) { return i == index; }).remove(), page.html(); } function exportType(extension) { switch (extension) { case "Xls": return "Excel"; case "Word": return "Rtf"; default: return extension; } } var $base = documentBase(html); html = $base.html; var pages = html.children("div").length; return $.extend($base, { reportToken: token, pages: pages, getPage: getPage, exportType: exportType }); } function post(method, data) { return data.token = securityToken, $base.post(method, data); } function open(reportId, parameters) { var idrev = (reportId || "").split("."), version = null; return 2 == idrev.length && (reportId = idrev[0], version = parseInt(idrev[1])), post("Select", {}).then(function(list) { var f = list.filter(function(d) { return d.Id == reportId || d.Name.toLowerCase() == reportId.toLowerCase(); }); if (0 === f.length) return $base.errorPromise(SR("error.ReportNotFound").format(reportId)); var desc = f[0]; return version && (desc.Version = version), { token: { description: desc }, parameters: [], hasParameters: !!desc.IsParametrized, reportType: getReportType(desc.ReportType), autoRun: !0 }; }).then(function(report) { return report.hasParameters || parameters && 0 !== parameters.length ? resolveParameters(report.token, parameters).then(function(resolvedParameters) { return $.extend(report, { parameters: resolvedParameters }); }) : report; }); } function getReportType(arsReportType) { return 1 === arsReportType || 3 === arsReportType ? ReportType.pageReport : 2 === arsReportType || 4 === arsReportType ? ReportType.sectionReport : ReportType.unknown; } function run(reportToken, parameters) { var description = reportToken.description, renderOptions = { ReportId: description.Id, Name: description.Name, ReportType: description.ReportType, Extension: "Html", ExtensionSettings: mapSettings({ Target: "Screen", RenderMode: "Paginated", NeedExportSupport: !0, TocStream: !0 }), ReportParameters: ars_convertClientParameters(parameters) }; return runTask("RenderReport", description, renderOptions).then(loadResource).then(function(html) { var document; return document = description.ReportType == reportTypes.SectionReport || description.ReportType == reportTypes.CodeBasedReport ? sectionDocument(reportToken, html) : pageDocument(reportToken, html), state.togglesHistory = new TogglesHistory(), state.documentId = document.documentId, document; }); } function resolveParameters(reportToken, parameters) { var description = reportToken.description, renderOptions = { ReportId: description.Id, Name: description.Name, ReportType: description.ReportType, Extension: "Html", ReportParameters: ars_convertClientParameters(parameters) }; return runTask("ResolveParameters", description, renderOptions).then(loadResource).then(function(resource) { return ars_parseParametersXml(resource); }); } function mapSettings(settings) { return Object.keys(settings || {}).map(function(key) { return { Key: key, Value: null === settings[key] ? null : settings[key].toString() }; }); } function exportImpl(token, exportType, settings) { function translateSettings(ss) { var newSettings = {}; return Object.keys(ss || {}).forEach(function(key) { var val = ss[key]; switch (key) { case "printing": val && (exportType == ExportType.Pdf ? newSettings.PrintOnOpen = !0 : exportType == ExportType.Html && (newSettings = $.extend(newSettings, { WebViewer: !0, MhtOutput: !1, RenderTocTree: !1, OutputTOC: !1, Interactivity: !1, RenderMode: "Paginated", Pagination: !0, StyleStream: !1, IncludePageMargins: !1, Printing: !0 }))); break; default: newSettings[key] = val; } }), newSettings; } if (!token) return $base.errorPromise(SR("error.InvalidReportToken")); var description = token.reportToken.description, exportOptions = { DocumentId: token.documentId ? token.documentId : state.documentId, Extension: token.exportType(exportType), ToggleHistory: state.togglesHistory.getSet(), ExtensionSettings: mapSettings(translateSettings(settings)) }; return runTask("ExportDocument", description, exportOptions).then(function(url) { return isAbsoluteUri(url) || (url = resourceHandler + url), url; }); } function runTask(method, description, taskOptions) { return post(method, { description: description, options: taskOptions }).then(getResourceId); } function validateParameters(reportToken, parameters) { return resolveParameters(reportToken, parameters); } function getPageCount(document) { return document ? $base.promise(document.pages || 1) : $base.errorPromise(SR("error.InvalidDocumentToken")); } function getPage(document, index) { return document ? (index >= document.pages && (index = 0), $base.promise(document.getPage(index))) : $base.errorPromise(SR("error.InvalidDocumentToken")); } function getToc(document) { if (!document) return $base.errorPromise(SR("error.InvalidDocumentToken")); var tocUrl = document.tocUrl; return tocUrl ? (tocUrl += "&MobileGet=1", getResource(tocUrl, !0).then(function(toc) { return toc; }).fail(function() { return emptyToc(); })) : emptyToc(); } function emptyToc() { return $base.promise({ name: "$root", kids: [] }); } function getResourceId(requestResult) { var requestInfo = requestResult.Info; switch (requestInfo.State) { case requestStates.Unavailable: case requestStates.Rejected: var err = (requestInfo.Exception || {}).Message || ""; return $base.errorPromise(SR("error.RequestRejected") + " " + err); case requestStates.Cancelled: return $base.errorPromise(SR("error.RequestCancelled")); case requestStates.Pending: case requestStates.Running: return $base.delay(function() { return post("GetRequestStatus", { requestId: requestInfo.RequestId }); }, pollingTimeout).then(getResourceId); default: return encodeURI(requestInfo.PrimaryUrl + "&MobileGet=1"); } } function loadResource(url) { return getResource(url).then(function(data, textStatus, xhr) { if (206 == xhr.status) { var xml = $(data), requestId = xml.find("RequestId").text(); return requestId ? getResourceId({ Info: { State: requestStates.Running, RequestId: requestId } }).then(loadResource) : $base.errorPromise(SR("error.InvalidRequestId")); } return data; }); } function getResource(url, json) { return url += "&NoWrapper=1", isAbsoluteUri(url) || (url = resourceHandler + url), json ? $base.getJson(url) : $base.get(url); } function toggle(token, toggleInfo) { state.togglesHistory.toggle(toggleInfo.Data); var description = token.description, renderOptions = { DocumentId: state.documentId, Name: description.Name, ReportType: description.ReportType, ToggleHistory: state.togglesHistory.getSet(), Extension: "Html", ExtensionSettings: mapSettings({ RenderMode: "Paginated", NeedExportSupport: !0, TocStream: !0, IncludePageMargins: !0 }) }; return runTask("ExportDocument", description, renderOptions).then(loadResource).then(function(html) { return description.ReportType == reportTypes.SectionReport || description.ReportType == reportTypes.CodeBasedReport ? { url: sectionDocument(token, html) } : { url: pageDocument(token, html) }; }); } function drillthrough(token, link) { var drillInfo = parseDrillthroughLink(link); return drillInfo && drillInfo.reportName ? openDrillthrough(token, drillInfo.reportName, drillInfo.params) : $base.errorPromise(SR("error.InvalidDrillthroughLink").format(link)); } function parseDrillthroughLink(link) { function parseParameters(str) { var result = [], parameters = splitEscaped(str, ";"); return parameters.forEach(function(parameter) { var keyValue = splitEscaped(parameter, "="); if (keyValue.length > 1) { var key = keyValue[0], value = keyValue[1]; if (key) { var values = splitEscaped(value, ","); result.push(values.length > 1 ? { name: key, values: values.map(function(v) { return { value: v }; }), multivalue: !0 } : { name: key, value: values[0] }); } } }), result; } var queryStart = link.indexOf("?"); if (-1 == queryStart) return { reportName: "", params: [] }; var reportName = "", params = [], query = link.slice(queryStart + 1); return query.split("&").forEach(function(queryItem) { var parts = queryItem.split(/=(.*)/); parts.length < 2 || ("ReportId" == parts[0] ? reportName = decodeURIComponent(parts[1]) : "Parameters" == parts[0] && (params = parseParameters(decodeURIComponent(parts[1])))); }), { reportName: reportName, params: params }; } function openDrillthrough(token, reportName, parameters) { return service.open(reportName, parameters).then(function(report) { var parametersValid = report.parameters.every(function(p) { return p.state == ParameterState.Ok; }); return parametersValid ? service.run(report.token, report.parameters).then(function(documentToken) { return { reportToken: report.token, parameters: report.parameters, documentToken: documentToken }; }) : { reportToken: report.token, parameters: report.parameters }; }); } var state = { togglesHistory: null, documentId: null }; if (!options.url) throw new Error("options has no valid url"); var reportTypes = { SemanticReport: 1, SectionReport: 2, PageReport: 3, CodeBasedReport: 4 }, requestStates = { Pending: 0, Running: 1, Unavailable: 2, Accomplished: 3, Cancelled: 4, Rejected: 5 }, SR = resourceManager && $.isFunction(resourceManager.get) ? resourceManager.get : identity, defaultPollingTimeout = 1e3, pollingTimeout = options.pollingTimeout || defaultPollingTimeout, serviceUrl = options.url, securityToken = options.securityToken, resourceHandler = options.resourceHandler || ""; serviceUrl.endsWith("/") || (serviceUrl += "/"); var service = { open: open, close: function() { return state = { togglesHistory: null, documentId: null }, $base.promise(!0); }, run: run, validateParameters: validateParameters, validateParameter: function() { return $base.errorPromise(SR("error.NotSupported")); }, validateParameterSupported: function() { return !1; }, getPageCount: getPageCount, getPage: getPage, getToc: getToc, "export": exportImpl, drillthrough: drillthrough, toggle: toggle, ping: function() { return $base.promise(!1); } }, $base = ReportServiceBase(service, serviceUrl); return service; } function ClientSideSearchService() { function search(document, searchOptions) { function fillResults(items, regex, numberOfMatches) { for (var fromIndex = currentPage == options.FromPage + 1 && options.FromElement > 0 ? options.FromElement + 1 : 0, i = fromIndex; i < items.length; i++) { var element = items[i], elementText = element.text(); if (elementText.match(regex) && (result.matches.push({ idx: i, text: elementText, page: currentPage - 1 }), result.matches.length === numberOfMatches)) break; } return numberOfMatches != ALL_RESULTS && result.matches.length >= numberOfMatches; } function searchOnCurrentPage(regex) { var hasMorePages = document.state() === DocumentState.completed && document.pageCount() >= currentPage + 1; fillResults(cachedItems, regex, options.NumberOfResults) || !hasMorePages ? (result.hasMore = hasMorePages, d.resolve(result)) : document.state() === DocumentState.progress && document.pageCount() <= currentPage + 1 ? setTimeout(searchOnCurrentPage, 100) : getPageItems(document, currentPage).done(function(items) { cachedItems = items, currentPage++, searchOnCurrentPage(regex); }); } var d = $.Deferred(), result = { hasMore: !0, matches: [] }; if (null === searchOptions || void 0 === searchOptions) return d.resolve({ hasMore: !1, matches: [] }); var options = ensureOptions(searchOptions); return 0 === options.FromPage && 0 === options.FromElement && (cachedItems = [], currentPage = 0), searchOnCurrentPage(createRegex(searchOptions)), d.promise(); } function getPageItems(document, pageIndex) { return document.getPage(pageIndex).then(resolveTextElements); } function ensureOptions(searchOptions) { var startFromPage = searchOptions && searchOptions.from && searchOptions.from.page || 0, startFromIndex = searchOptions && searchOptions.from && searchOptions.from.idx || 0, numberOfResults = searchOptions.maxSearchResults, maxResultCount = !numberOfResults || 0 > numberOfResults ? ALL_RESULTS : numberOfResults; return { FromPage: startFromPage, FromElement: startFromIndex, NumberOfResults: maxResultCount }; } function resolveTextElements(page) { var topLevelSelector = "div, p, td, li, span", pageObject = page instanceof jQuery ? page : $("").html(page); return jQuery.map(pageObject.find(topLevelSelector), function(topLevelElement) { return $($(topLevelElement).clone().find(topLevelSelector).remove().end()); }); } function createRegex(searchOptions) { for (var escapeChars = "\\|[]()+*.{}$^?", pattern = "", i = 0; i < searchOptions.text.length; i++) { var ch = searchOptions.text[i]; escapeChars.indexOf(ch) >= 0 && (pattern += "\\"), pattern += ch; } searchOptions.wholePhrase && (pattern = "\\b" + pattern, pattern += "\\b"); var flags = "m"; return searchOptions.matchCase || (flags += "i"), new RegExp(pattern, flags); } var service = { search: search }, ALL_RESULTS = "ALL", cachedItems = [], currentPage = 0; return service; } function noop() {} function identity(v) { return v; } function isAbsoluteUri(uri) { return /^https?:\/\//i.test(uri); } function isBase64(uri) { var r = new RegExp("^data:\\w+/\\w+;base64,", "i"); return r.test(uri); } function getQueryParameter(url, name) { if (!url || "string" != typeof url) return null; if (!name || "string" != typeof name) return null; var uri = parseUri(url); if (!uri.query) return null; var f = Object.keys(uri.queryKey).filter(function(key) { return key.toLowerCase() == name; }); return 1 === f.length ? uri.queryKey[f[0]] : null; } function splitEscaped(str, delimiter) { if (null === str || void 0 === str) return []; if (!delimiter) return [ str ]; if ("\\" == delimiter) throw new Error("\\ delimiter is not supported"); if (delimiter.length > 1) throw new Error("delimiter should be single character"); for (var res = [], part = "", escaped = !1, i = 0; i < str.length; ) { var current = str.charAt(i); escaped ? (part += current, escaped = !1) : "\\" == current ? escaped = !0 : current == delimiter ? (res.push(part), part = "") : part += current, i++; } return res.push(part), res; } function getDpi() { var e = document.body.appendChild(document.createElement("DIV")); e.style.width = "1in", e.style.padding = "0"; var dpi = e.offsetWidth; return e.parentNode.removeChild(e), dpi; } function resolveErrorMessage(args) { var xhr = args[0]; if (3 == args.length && xhr.status) { if (xhr.responseJSON && xhr.responseJSON.Message) return xhr.responseJSON.Message; if (xhr.responseText) { var m = /