!function(window) { function ActionItemsResolver() { function isArDrillthroughLink(link) { return null !== link && void 0 !== link && (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 : 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 = getElementData(element, "data"), hrefValue = getElementData(element, "href"); if (null === dataValue && null === hrefValue) return null; null !== dataValue && (dataValue = htmlDecode(dataValue)); var hyperlinkUrl = null !== dataValue ? dataValue : null; null === hyperlinkUrl && null !== hrefValue && (hyperlinkUrl = htmlDecode(hrefValue)); 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 isArDrillthrough = isArDrillthroughLink(hyperlinkUrl); return element.is("[class$=drillthrough]") || isArDrillthrough ? { actionType: ActionType.drillthrough, reportType: ReportType.pageReport, element: element, drillthroughLink: hyperlinkUrl } : null !== hyperlinkUrl ? { actionType: ActionType.hyperlink, reportType: ReportType.pageReport, element: element, url: hyperlinkUrl } : null; } function htmlDecode(value) { if (value) { var textArea = document.createElement("textarea"); textArea.innerHTML = value; var decodedString = textArea.value; return "remove" in Element.prototype && textArea.remove(), decodedString; } return 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(decodeURI(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), index: v.Index }; }); } 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) { var selectAllEnabled = !!p.MultiValue && (p.AvailableValues || []).length > 1, value = selectAllEnabled && p.SelectAll ? ParameterSpecialValue.SelectAll : parseParameterValue(p.Value, p.ParameterType), values = selectAllEnabled && p.SelectAll ? [ ParameterSpecialValue.SelectAll ] : convertValues(p.Values, p.ParameterType); return { name: p.Name, value: value, values: values, availableValues: convertValues(p.AvailableValues, p.ParameterType), prompt: p.Prompt || p.Name, nullable: !!p.Nullable, multiline: !!p.MultiLine, multivalue: !!p.MultiValue, selectAllEnabled: selectAllEnabled, 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), dependantParameterNames: (p.DependantParameters || []).map(function(dependant) { return dependant.Name; }) }; }); } function ar_convertClientParameters(parameters) { return parameters.map(ar_convertClientParameter); } function ar_convertClientParameter(p) { function serialize(value, type) { 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), Index: v.index }; }); } return p.multivalue ? { MultiValue: !0, Name: p.name, Values: convertValues(p.values), SelectAll: p.value === ParameterSpecialValue.SelectAll || p.values.length > 0 && p.values[0].value === ParameterSpecialValue.SelectAll || void 0 } : { Name: p.name, Value: serialize(p.value) }; } function ArReportService(options, resourceManager) { function isUndefined(value) { return void 0 === value || null === value; } function productVersion() { return "12.1.12841.2"; } function open(reportId, parameters) { return $base.post("OpenReport", { version: 4, culture: "en_US", reportPath: reportId, acceptedFormats: useSvg ? [ formats.Svg, formats.Html ] : [ formats.Html ], lifeTime: 600 }).then(function(d) { if (isUndefined(d.Token)) return $base.invalidResponse(d); if (d.ProductVersion > productVersion()) return $base.errorPromise(SR("error.JsVersionsMismatch")); var reportInfo = { token: d.Token, parameters: ar_convertServiceParameters(d.ParameterCollection || []), reportType: getReportType(d.DocumentFormat), autoRun: d.AutoRun }; if (reportInfo.isChangeRenderModeSupported = options.isChangeRenderModeSupported || getReportProperty(reportInfo.token, "ChangeRenderModeSupported"), 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, isChangeRenderModeSupported: options.isChangeRenderModeSupported || getReportProperty(d.Token, "ChangeRenderModeSupported") }; }); } 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(docFormat) { if (null === docFormat || void 0 === docFormat) return ReportType.unknown; switch (docFormat) { case documentFormat.rpx: case documentFormat.rdf: return ReportType.sectionReport; case documentFormat.rdlx: return ReportType.pageReport; 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, param, settings) { return runImpl(reportToken, param, settings); } function runImpl(reportToken, param, settings) { return null === settings || "undefined" == typeof settings ? $base.post("RunReport", { token: reportToken }).then(function() { return pollStatus(reportToken); }).then(function() { return getDocumentUrl(reportToken); }) : $base.post("RunReportEx", { token: reportToken, settings: JSON.stringify(settings) }).then(function() { return pollStatus(reportToken); }).then(function() { return getDocumentUrl(reportToken); }); } function cancelRendering(doctoken) { var reportToken = resolveReportToken(doctoken); if (reportToken) return $base.post("CancelRendering", { token: reportToken }).then(function() { return !0; }); throw new Error("ReportToken is not valid!"); } function pollStatus(reportToken, returnPagesCount) { return $base.delay(getStatus.bind(service, reportToken), pollingTimeout).then(function(status) { return returnPagesCount && status.pageCount > 0 ? 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")); } return { state: state, pageCount: d.AvailablePages }; }); } function getReportProperty(reportToken, propertyName) { return $base.post("GetReportProperty", { token: reportToken, propertyName: propertyName }).then(function(d) { return d.Error ? null : d.PropertyValue; }); } function getPageCount(doctoken) { function getPageCountImpl() { getStatus(reportToken).done(function(status) { status.state == loadStates.Completed || status.state == loadStates.Cancelled ? def.resolve(status.pageCount, status.state == loadStates.Completed ? DocumentState.completed : DocumentState.cancelled) : (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 getXmlAsString(xmlDom) { return "undefined" != typeof XMLSerializer ? new window.XMLSerializer().serializeToString(xmlDom) : xmlDom.xml; } function getPage(doctoken, index) { if (!resolveReportToken(doctoken)) return $base.invalidArg("doctoken", doctoken); var urlTemplate = "{0}&Page={1}&ie=" + $.now(), pageUrl = urlTemplate.format(doctoken, index + 1), result = $.Deferred(); return $base.get(pageUrl).done(function(data, status, xhr) { $.isXMLDoc(data) && (data = getXmlAsString(data)), result.resolve(data, status, xhr); }).fail(result.reject), result.promise(); } 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, settings) { return $base.post("ProcessOnClick", { token: token, data: toggleInfo }).then(function(result) { 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 translateSettings(settings, exportType) { var newSettings = {}; return Object.keys(settings || {}).forEach(function(key) { var val = settings[key]; switch (key) { case "printing": val && (exportType == ExportType.Pdf ? newSettings.PrintOnOpen = !0 : exportType == ExportType.Html && (newSettings.WebViewer = !0, newSettings.Printing = !0)); break; default: newSettings[key] = val; } }), newSettings; } function exportImpl(doctoken, exportType, settings) { return getPageCount(doctoken).then(function(pc) { if (pc <= 0) throw new Error("document cannot be exported"); return getExportUri(doctoken, exportType, translateSettings(settings, exportType)); }); } 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) { var dpi = getDpi(); 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 * dpi, top: sr.ItemArea.Y * dpi, width: sr.ItemArea.Width * dpi, height: sr.ItemArea.Height * dpi } }; }) }; }) : $base.invalidArg("token", token); } function drillthrough(token, link, settings) { var drillInfo = parseDrillthroughLink(link); return drillInfo && drillInfo.reportName ? openDrillthrough(token, drillInfo.reportName, drillInfo.parameters, settings) : $base.errorPromise(SR("error.InvalidDrillthroughLink").format(link)); } function openDrillthrough(token, reportPath, parameters, settings) { return openDrillthroughReport(token, reportPath).then(function(r) { function run() { return runImpl(r.token, null, settings).then(function(documentToken) { return { reportToken: r.token, parameters: params, documentToken: documentToken, isChangeRenderModeSupported: options.isChangeRenderModeSupported || getReportProperty(r.token, "ChangeRenderModeSupported") }; }); } 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.dependantParameterNames && p.dependantParameterNames.indexOf(dependant.name) != -1; }); 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, isChangeRenderModeSupported: options.isChangeRenderModeSupported || getReportProperty(r.token, "ChangeRenderModeSupported") }; }) : 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; } function findParameterByValue(valuetosearch) { for (var i = 0; i < parameter.availableValues.length; i++) if (parameter.availableValues[i].value == valuetosearch) return parameter.availableValues[i]; return null; } if (void 0 === clientParameter || null === clientParameter) return parameter; if (parameter.multivalue) if (clientParameter.values) parameter.values = clientParameter.values; else { if (parameter.values.length > 0 && (parameter.values = []), !Array.isArray(clientParameter.value)) { var t = clientParameter.value; clientParameter.value = [], clientParameter.value.push(t); } clientParameter.value.map(function(p) { var param = findParameterByValue(p); param || (param = convertValue(p, parameter.type)), parameter.values.push(param); }); } else parameter.value = convertValue(clientParameter.value, parameter.type); return 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, Svg: 9, Csv: 10 }, loadStates = { NotStarted: 0, InProgress: 1, Completed: 2, Cancelling: 3, Cancelled: 4, Error: 5 }, documentFormat = { rpx: 0, rdf: 1, rdlx: 2 }, service = { open: open, close: close, toggle: toggle, run: run, cancelRendering: cancelRendering, validateParameters: validateParameters, validateParameter: validateParameter, validateParameterSupported: function() { return !0; }, getPageCount: getPageCount, getPage: getPage, getToc: getToc, export: exportImpl, search: search, drillthrough: drillthrough, ping: ping, canSendEmail: function() { return !1; }, getState: function() { return null; }, setState: function(newState) {} }, $base = WebServiceBase(service, serviceUrl), useSvg = options.renderer && options.renderer == Renderer.SVG, 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 values = values.map(function(v) { return v === ParameterSpecialValue.Empty ? null : v; }), 1 == values.length && values[0] == ParameterSpecialValue.SelectAll ? { Name: p.name, Domain: paramDomain.selectAll, Values: [] } : { Name: p.name, Domain: paramDomain.specifiedValues, Values: values }; } var values2 = [ convertValue(p.value) ].filter(function(v) { return null !== v && void 0 !== v; }); return values2 = values2.map(function(v) { return v === ParameterSpecialValue.Empty ? null : v; }), { Name: p.name, Domain: paramDomain.specifiedValues, Values: values2 }; }); } function arsParametersParser(resourceManager, isSemantic) { 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 isBoolean(value) ? Boolean.parse(value) : null; 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 isBoolean(value) { return "true" == value.toLowerCase() || "false" == value.toLowerCase(); } function parseSpecialValue(value, parameter) { var valueToLower = value.toLowerCase(); return { label: function() { return "blank" === valueToLower || "empty" === valueToLower || "selectall" === valueToLower || "selectallcustom" === valueToLower ? resourceManager.get(valueToLower) : value; }(), value: function() { switch (valueToLower) { case "blank": return parameter.type == ParameterType.String ? "" : null; case "empty": return isSemantic ? ParameterSpecialValue.Empty : null; case "null": return null; case "unspecified": return parameter.nullable ? null : void 0; case "selectall": case "selectallcustom": return ParameterSpecialValue.SelectAll; default: return value; } }() }; } 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 ars_parseParametersXml(xml) { 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 ? parseSpecialValue(stringValue, parameter) : { label: attrs.label || stringValue, value: parseValue(stringValue, parameter.type) }; }).get(); } 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 || "", hasDependantParameters: $this[0].getElementsByTagName("DependentParameters").length > 0 }; 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.values = parameter.values || [], parameter.value = parameter.values.length ? parameter.values[0].value : null, parameter.editor = resolveEditor(parameter), parameter.error = "", parameter; }).get(); } function convertServerParameters(parameters) { function parseAvailableValues(values, parameter) { return values.map(function(v) { if (v.IsSpecial) return parseSpecialValue(v.Value, parameter); var parsedValue = parseValue(v.Value, parameter.type); return { label: v.Label || v.Value, value: null === parsedValue || isNaN(parsedValue) ? v.Value : parsedValue }; }); } function parseValues(values, parameter) { return values.map(function(v) { if (v.IsSpecial) return parseSpecialValue(v.Value, parameter); var value = parseValue(v.Value, parameter.type), expectedValues = parameter.availableValues.filter(function(av) { return av.value === value; }); return { label: expectedValues && expectedValues.length && expectedValues[0].label || v.Value, value: value }; }); } return parameters.map(function(p) { var parameter = { name: p.Name || "", type: convertDataType(p.DataType), hidden: p.Hidden, multivalue: p.MultiValue, multiline: p.MultiLine || !1, allowEmpty: p.AllowBlank, dateOnly: p.DateOnly, nullable: p.Nullable && !p.MultiValue, prompt: p.Prompt || p.Name || "", state: convertState(p.State), definesValidValues: p.DefinesValidValues, selectAllEnabled: p.SelectAllEnabled, hasDependantParameters: !(!p.DependentParameters || !p.DependentParameters.length), dependantParameterNames: p.DependentParameters }; return parameter.availableValues = parseAvailableValues(p.AvailableValues || [], parameter), parameter.values = parseValues(p.Values || [], parameter), parameter.state == ParameterState.Ok && parameter.values && 1 == parameter.values.length && "Unspecified" == parameter.values[0].label && !parameter.nullable && (parameter.state = ParameterState.ExpectValue), parameter.value = parameter.values.length ? parameter.values[0].value : null, parameter.editor = resolveEditor(parameter), parameter.error = "", parameter; }); } return { convertServerParameters: convertServerParameters, parseParametersXml: ars_parseParametersXml }; } 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 = replaceRelativityPath(doc); 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 replaceRelativityPath(doc) { return doc.find("img").each(function() { var $this = $(this), src = $this.attr("src"); isBase64(src) || isAbsoluteUri(src) || (src += "&MobileGet=1", $this.attr("src", resourceHandler + src)); }), doc; } function pageDocument(token, doc) { 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"; case "Html": return "Mht"; default: return extension; } } function updateDelayedContent(data) { for (var property in data) if (data.hasOwnProperty(property)) { var doc = $("
"); doc.html(data[property]), data[property] = replaceRelativityPath(doc), html.find("#" + property).replaceWith(data[property]); } } var $base = documentBase(doc.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, { html: html, reportToken: token, pages: pages, getPage: getPage, exportType: exportType, updateDelayedContent: updateDelayedContent, requestId: doc.requestId }); } function sectionDocument(token, doc) { 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"; case "Html": return "Mht"; default: return extension; } } var $base = documentBase(doc.html); html = $base.html; var pages = html.children("div").length; return $.extend($base, { reportToken: token, pages: pages, getPage: getPage, exportType: exportType }); } function close(async) { return state = { togglesHistory: null, documentId: null, completed: !1, hiddenParameters: [] }, $base.promise(!0); } function usePaging(description) { return (!options.pagingMode || options.pagingMode === ServerPagingMode.UsePaging) && $base.pagingSupported(description); } function renderMode(settings) { return "undefined" != typeof settings && null !== settings ? settings.RenderMode : "Paginated"; } function previewPages(settings) { return "undefined" != typeof settings && null !== settings && "undefined" != typeof settings.PreviewPages && null !== settings.PreviewPages ? settings.PreviewPages : null; } function open(reportId, parameters) { service.close(); var idrev = (reportId || "").split("."), version = null; if (idrev.length > 1) { var lastIndex = idrev.length - 1; version = parseInt(idrev[lastIndex]), isNaN(version) && (version = null), null === version && (lastIndex += 1), reportId = idrev.slice(0, lastIndex).join("."); } var def = $.Deferred(); return $base.getReport(reportId, version).fail(function(result) { "DocumentNotFound" === result.errorCode ? def.reject(SR("error.ReportNotFound").format(reportId)) : def.reject(result); }).then(function(list) { if (0 === list.length) return def.reject(SR("error.ReportNotFound").format(reportId)), def; var desc = list[0]; return version && (desc.Version = version), def.resolve({ token: { description: desc, id: desc._id || desc.Id }, parameters: [], hasParameters: !!desc.IsParametrized, reportType: getReportType(desc.ReportType), autoRun: !0, isChangeRenderModeSupported: $base.promise(desc.IsCpl) }); }), def.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 arsReportType === reportTypes.SemanticReport || arsReportType === reportTypes.PageReport ? ReportType.pageReport : arsReportType === reportTypes.SectionReport || arsReportType === reportTypes.CodeBasedReport ? ReportType.sectionReport : ReportType.unknown; } function run(reportToken, parameters, settings, snapshotCacheId) { var getContent, description = reportToken.description; if (snapshotCacheId) { var exportOptions = createExportOptions(description, snapshotCacheId, state.togglesHistory, settings); getContent = exportDocument(description, "Html", exportOptions); } else { var renderParameters = ars_convertClientParameters(overrideHiddenParameters(parameters)), extensionSettings = { Target: "Screen", RenderMode: renderMode(settings), NeedExportSupport: !0, IncludePageMargins: !0, TocStream: !0, StreamingEnabled: usePaging(description) }; null !== previewPages(settings) && (extensionSettings.PreviewPages = previewPages(settings)), options && options.previewPages && (extensionSettings.PreviewPages = options.previewPages), getContent = $base.renderReport(description, renderParameters, "Html", extensionSettings); } return getContent.then(function(doc) { var document; return document = description.ReportType == reportTypes.PageReport || description.ReportType == reportTypes.SemanticReport ? pageDocument(reportToken, doc) : sectionDocument(reportToken, doc), state.togglesHistory = new TogglesHistory(), state.documentId = document.documentId, document; }); } function cancelRendering(document) { return document ? $base.cancelRendering(document.requestId).then(function() { return !0; }) : $base.errorPromise(SR("error.InvalidDocumentToken")); } function overrideHiddenParameters(parameters) { var notOverriddenHiddenParameters = state.hiddenParameters.filter(function(hiddenParameter) { return !parameters.some(function(parameter) { return parameter.name == hiddenParameter.name; }); }); return notOverriddenHiddenParameters.concat(parameters); } function removeDependants(parameters, dependantNames) { var allDependantsNames = allDependants(parameters, dependantNames); return parameters.filter(function(p) { return allDependantsNames.indexOf(p) === -1; }); } function allDependants(parameters, dependantNames) { dependantNames = dependantNames ? dependantNames : []; var firstGen = parameters.filter(function(p) { return dependantNames.indexOf(p.name) !== -1; }), res = firstGen.slice(); return firstGen.forEach(function(p) { res = res.concat(allDependants(parameters, p.dependantParameterNames)); }), res; } function resolveParameters(reportToken, parameters, dependantNames) { var paramsForResolving = removeDependants(overrideHiddenParameters(parameters), dependantNames); return $base.resolveParameters(reportToken.description, ars_convertClientParameters(paramsForResolving)).then(function(parsedParameters) { var notHiddenParameters = []; return state.hiddenParameters = [], parsedParameters.forEach(function(parsedParameter) { reportToken.description.ReportType == reportTypes.SemanticReport ? (parsedParameter.state == ParameterState.Ok && parsedParameter.values && 1 == parsedParameter.values.length && "Unspecified" == parsedParameter.values[0].label && (parsedParameter.state = ParameterState.ExpectValue), parsedParameter.nullable = !1) : reportToken.description.ReportType === reportTypes.PageReport && parsedParameter.multivalue && (parsedParameter.availableValues || []).length > 1 && (parsedParameter.selectAllEnabled = !0), parsedParameter.hidden ? state.hiddenParameters.push(parsedParameter) : notHiddenParameters.push(parsedParameter); }), reportToken.description.ReportType == reportTypes.SemanticReport && notHiddenParameters.forEach(function(parameter) { switch (parameter.type) { case "string": parameter.availableValues.sort(compareString); break; case "float": case "int": parameter.availableValues.sort(compareNumbers); break; case "datetime": parameter.availableValues.sort(compareDate); break; default: parameter.availableValues.sort(compareString); } }), notHiddenParameters; }); } function compareNumbers(a, b) { return a.label - b.label; } function compareString(a, b) { return a.label.localeCompare(b.label); } function compareDate(a, b) { return new Date(a.label) - new Date(b.label); } function translateSettings(settings, exportType) { var newSettings = {}; return Object.keys(settings || {}).forEach(function(key) { var val = settings[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: !0, Printing: !0 }))); break; default: newSettings[key] = val; } }), newSettings; } function exportImpl(token, exportType, settings, params) { if (!token) return $base.errorPromise(SR("error.InvalidReportToken")); if ("undefined" != typeof settings && null !== settings && settings.state === DocumentState.cancelled) return exportFullReport(token, exportType, settings, params); var description = token.reportToken.description, exportOptions = { DocumentId: token.documentId ? token.documentId : state.documentId, InteractiveActions: state.togglesHistory.getSet(), ExtensionSettings: translateSettings(settings, exportType) }; return $base.exportDocument(description, token.exportType(exportType), exportOptions).then(function(result) { return isAbsoluteUri(result.uri) ? result.uri : resourceHandler + result.uri; }); } function exportFullReport(token, exportType, settings, params) { var def = $.Deferred(); return settings.PreviewPages = 0, run(token.reportToken, params, settings, null).then(function(documentToken) { return getPageCount(documentToken).then(function(pc) { var description = documentToken.reportToken.description, exportOptions = { DocumentId: documentToken.documentId ? documentToken.documentId : state.documentId, InteractiveActions: state.togglesHistory.getSet(), ExtensionSettings: translateSettings(settings, exportType) }; return $base.exportDocument(description, documentToken.exportType(exportType), exportOptions).then(function(result) { return isAbsoluteUri(result.uri) ? def.resolve(result.uri) : def.resolve(resourceHandler + result.uri); }); }); }), def.promise(); } function sendImpl(token, settings) { if (!token) return $base.errorPromise(SR("error.InvalidReportToken")); var description = token.reportToken.description, newsettings = { Distribution: settings.Distribution, DocumentFormat: settings.DocumentFormat, DocumentId: token.documentId ? token.documentId : state.documentId, SendEmailPolicyName: settings.SendEmailPolicyName }; return $("#sendemaildialog").modal("hide"), $base.sendEmail(description, newsettings).then(function(url) { return isAbsoluteUri(url) || (url = resourceHandler + url), url; }); } function validateParameters(reportToken, parameters, dependantNames) { return resolveParameters(reportToken, parameters, dependantNames); } function getPageCount(document) { return document ? usePaging(document.reportToken.description) ? $base.getPageCount(document.requestId).done(function() { state.completed = !0; }) : $base.promise(document.pages || 1) : $base.errorPromise(SR("error.InvalidDocumentToken")); } function getPage(document, index) { return document ? usePaging(document.reportToken.description) ? $base.getPage(index, document.requestId).then(function(page) { var doc = pageDocument("", page); return doc.documentId && !state.documentId && (state.documentId = doc.documentId), doc.tocUrl && !document.tocUrl && (document.tocUrl = doc.tocUrl), getDelayedContent(index, document.requestId).then(function(data) { return doc.updateDelayedContent(data), doc.getPage(0); }); }) : (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; if (!tocUrl) return emptyToc(); tocUrl += "&MobileGet=1"; var result = $.Deferred(); return getResource({ uri: tocUrl }, !0).then(function(toc) { result.resolve(toc); }).fail(function() { emptyToc().done(result.resolve); }), result.promise(); } function emptyToc() { return $base.promise({ name: "$root", kids: [] }); } 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 ? $base.getResourceId(requestId).then(loadResource) : $base.errorPromise(SR("error.InvalidRequestId")); } return data; }); } function getResource(resource, json) { var url = resource.uri + "&NoWrapper=1"; return json ? $cacheService.getJson(url) : $cacheService.get(url); } function toggle(token, toggleInfo, settings) { function createExportResult(doc) { var document = isPageReport ? pageDocument(token, doc) : sectionDocument(token, doc); return { url: document }; } state.togglesHistory.toggle(toggleInfo.Data); var description = token.description, isPageReport = description.ReportType == reportTypes.PageReport || description.ReportType == reportTypes.SemanticReport, renderOptions = createExportOptions(description, state.documentId, state.togglesHistory, settings); return renderOptions.ExtensionSettings.Target = "Screen", options && options.previewPages && (renderOptions.ExtensionSettings.PreviewPages = options.previewPages), usePaging(description) && (state.completed = !1), exportDocument(description, "Html", renderOptions).then(function(doc) { return createExportResult(doc); }); } function exportDocument(description, extensionName, exportOptions) { var exportDoc = $base.exportDocument(description, extensionName, exportOptions); return usePaging(description) ? exportDoc : exportDoc.then(loadResource).then(function(html) { return { html: html }; }); } function drillthrough(token, link, settings) { var drillInfo = parseDrillthroughLink(token, link); return drillInfo && drillInfo.reportName ? openDrillthrough(token, drillInfo.reportName, drillInfo.params, settings) : $base.errorPromise(SR("error.InvalidDrillthroughLink").format(link)); } function parseDrillthroughLink(token, 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, ","); values.length > 1 ? result.push({ name: key, values: values.map(function(v) { return { value: decodeURIComponent(v) }; }), multivalue: !0 }) : result.push({ name: key, value: decodeURIComponent(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, i, _) { var parts = queryItem.split(/=(.*)/); parts.length < 2 || ("ReportId" == parts[0] ? reportName = decodeURIComponent(parts[1]) : "Parameters" == parts[0] && (params = parseParameters(parts[1]))); }), "self" == reportName && (reportName = token.id), { reportName: reportName, params: params }; } function openDrillthrough(token, reportName, parameters, settings) { 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 report.isChangeRenderModeSupported.then(function(isChangeRenderModeSupported) { return { reportToken: report.token, parameters: report.parameters, documentToken: documentToken, isChangeRenderModeSupported: $base.promise(isChangeRenderModeSupported) }; }); }) : report.isChangeRenderModeSupported.then(function(isChangeRenderModeSupported) { return { reportToken: report.token, parameters: report.parameters, isChangeRenderModeSupported: $base.promise(isChangeRenderModeSupported) }; }); }); } function setState(newState) { return state = { togglesHistory: newState.togglesHistory, documentId: newState.documentId, hiddenParameters: newState.hiddenParameters }, !0; } function createExportOptions(description, documentId, togglesHistory, settings) { return { DocumentId: documentId, Name: description.Name, ReportType: description.ReportType, InteractiveActions: togglesHistory ? togglesHistory.getSet() : [], ExtensionSettings: { RenderMode: renderMode(settings), NeedExportSupport: !0, TocStream: !0, IncludePageMargins: !0, StreamingEnabled: usePaging(description) } }; } function getDelayedContent(pageNumber, reqId) { return $base.getDelayedContent && state.completed ? $base.getDelayedContent(pageNumber, reqId) : $.Deferred().resolve({}); } var state; if (!options.url) throw new Error("options has no valid url"); var SR = resourceManager && $.isFunction(resourceManager.get) ? resourceManager.get : identity, resourceHandler = options.resourceHandler || "", serviceUrl = options.url; serviceUrl.endsWith("/") || (serviceUrl += "/"); var service = { open: open, close: close, run: run, cancelRendering: cancelRendering, validateParameters: validateParameters, validateParameter: function() { return $base.errorPromise(SR("error.NotSupported")); }, validateParameterSupported: function() { return !1; }, getPageCount: getPageCount, getPage: getPage, getToc: getToc, getDelayedContent: getDelayedContent, export: exportImpl, sendEmail: sendImpl, drillthrough: drillthrough, toggle: toggle, ping: function() { return $base.promise(!1); }, canSendEmail: function() { return $base.canSendEmail(); }, getState: function() { return state; }, setState: setState }, $base = options.url && options.url.toLowerCase().indexOf("reportservice.svc") !== -1 ? ArsWcfReportService(service, serviceUrl, options, resourceManager, loadResource) : ArsRestReportService(service, serviceUrl, options, resourceManager), $cacheService = WebServiceBase(service, resourceHandler, $base.setAuthToken), reportTypes = $base.reportTypes; return close(), service; } function ArsRestReportService(service, serviceUrl, options, resourceManager) { function setAuthToken(ajaxOptions) { return securityToken && (ajaxOptions.headers = { AuthToken: securityToken }), ajaxOptions; } function getReport(reportId, version) { var url = ""; if (objectIdPattern.test(reportId)) url = "reports/" + reportId + (null !== version ? "." + version : ""); else { var selector = JSON.stringify({ $or: [ { _id: { $eqi: encodeURIComponent(reportId) } }, { Name: { $eqi: encodeURIComponent(reportId) } } ] }); url = "reports?selector=" + selector + (null !== version ? "&version=" + version : ""); } return $base.get(url).then(function(res) { var reports = $.isPlainObject(res) ? [ res ] : res; return reports.forEach(function(r) { r.ReportType = r.Type; }, this), reports; }); } function cancelRendering(reqId) { return $base.postRest("reports/jobs/render/" + reqId + "/cancel", {}).then(function() { return !0; }); } function isPageReport(description) { return description.ReportType === reportTypes.PageReport || description.ReportType === reportTypes.SemanticReport; } function resolveParameters(description, parameters) { return runTask("reports/" + description._id + "/parameters/validateValues", parameters).then(function(parameters) { return arsParametersParser(resourceManager, description.ReportType === reportTypes.SemanticReport).convertServerParameters(parameters); }); } function isStreamingEnabled(options) { return options.ExtensionSettings && options.ExtensionSettings.StreamingEnabled; } function renderReport(description, parameters, extensionName, extensionSettings) { var renderOptions = { ExtensionName: extensionName, ExtensionSettings: extensionSettings, ReportParameters: parameters }, id = description._id; return description.Version && (id = id + "." + description.Version), runTask("reports/" + id + "/jobs/" + RENDERING_JOB, renderOptions).then(function(res) { return isStreamingEnabled(renderOptions) ? getPage(0, res.RequestId) : handleRequestResult(RENDERING_JOB, res); }); } function exportDocument(description, extensionName, exportOptions) { return exportOptions.ExtensionName = extensionName, runTask("reports/" + description._id + "/jobs/" + EXPORT_JOB, exportOptions).then(function(res) { return isStreamingEnabled(exportOptions) ? handlePageRequestResult(RENDERING_JOB, res, 1) : handleRequestResult(EXPORT_JOB, res); }); } function sendEmail(description, sendOptions) { return runTask("reports/jobs/" + description._id + "/emailRequests", sendOptions).then(function(res) { return handleRequestResult("emailRequests", res); }); } function runTask(method, taskOptions) { return $base.postRest(method, taskOptions); } function handleRequestResult(requestType, result) { return null !== result && "object" == typeof result && result.RequestId ? getRequestResult(requestType, result.RequestId) : requestType === EXPORT_JOB ? { uri: result } : { html: result }; } function getRequestResult(requestType, requestId) { return $base.get("reports/jobs/" + requestType + "/" + requestId).then(function(res) { return handleRequestResult(requestType, res); }); } function getResourceId(requestId) { return handleRequestResult(EXPORT_JOB, { RequestId: requestId }); } function handlePageRequestResult(requestType, result, pageNumber, reqid) { var page = { requestId: result.RequestId || reqid }; return result.Content || "object" != typeof result ? (page.html = "object" != typeof result ? result : result.Content, page) : getPageRequestResult(requestType, pageNumber, page.requestId); } function getPageRequestResult(requestType, pageNumber, reqid) { return $base.get("reports/jobs/" + requestType + "/" + reqid + "/pages/" + pageNumber).then(function(res) { return handlePageRequestResult(requestType, res, pageNumber, reqid); }); } function getPage(pageNumber, reqid) { return getPageRequestResult("render", pageNumber + 1, reqid); } function getPageCount(reqId) { function getPageCountImpl() { $base.get("reports/jobs/render/" + reqId + "/pages/available" + getRandomParameter()).done(function(result, status, xhr) { 202 === xhr.status ? getPageCountImpl() : result.Complete || result.Cancelled ? def.resolve(result.AvailablePages, result.Cancelled ? DocumentState.cancelled : DocumentState.completed) : (def.notify(result.AvailablePages), getPageCountImpl()); }).fail(function(problem) { def.reject(problem); }); } var def = $.Deferred(); return getPageCountImpl(), def.promise(); } function getDelayedContent(pageNumber, reqId) { return $base.get("reports/jobs/render/" + reqId + "/pages/" + (pageNumber + 1) + "/delayedcontent"); } function getRandomParameter() { return "?_=" + Math.random().toString().split(".")[1]; } var RENDERING_JOB = "render", EXPORT_JOB = "export", securityToken = options.securityToken, reportTypes = { SemanticReport: "SemanticReport", SectionReport: "SectionReport", PageReport: "PageReport", CodeBasedReport: "CodeBasedSectionReport" }, $base = WebServiceBase(service, serviceUrl, setAuthToken), objectIdPattern = /^[0-9a-fA-F]{24}$/; return { setAuthToken: setAuthToken, getReport: getReport, cancelRendering: cancelRendering, resolveParameters: resolveParameters, getResourceId: getResourceId, renderReport: renderReport, exportDocument: exportDocument, sendEmail: sendEmail, reportTypes: reportTypes, promise: $base.promise, errorPromise: $base.errorPromise, pagingSupported: isPageReport, getPage: getPage, getPageCount: getPageCount, getDelayedContent: getDelayedContent, canSendEmail: function() { return !0; } }; } function ArsWcfReportService(service, serviceUrl, options, resourceManager, loadResource) { function mapSettings(settings) { return Object.keys(settings || {}).map(function(key) { return { Key: key, Value: null === settings[key] ? null : settings[key].toString() }; }); } function post(method, data) { return data.token = options.securityToken, $base.post(method, data); } function getReport(reportId) { return post("Select", {}).then(function(list) { return list.filter(function(d) { return d.Id == reportId || d.Name.toLowerCase() == reportId.toLowerCase(); }); }); } function resolveParameters(description, parameters) { var renderOptions = { ReportId: description.Id, Name: description.Name, ReportType: description.ReportType, Extension: "Html", ReportParameters: parameters }; return runTask("ResolveParameters", description, renderOptions).then(loadResource).then(function(resource) { return arsParametersParser(resourceManager, description.ReportType === reportTypes.SemanticReport).parseParametersXml(resource); }); } function getResourceIdByRequestId(requestId) { return getResourceId({ Info: { State: requestStates.Running, RequestId: requestId } }); } function format(str, args) { if (!args) return str; for (var arg in args) str = str.replace("{" + arg + "}", args[arg]); return str; } function getResourceId(requestResult) { var requestInfo = requestResult.Info; switch (requestInfo.State) { case requestStates.Unavailable: case requestStates.Rejected: var err = (requestInfo.Exception || {}).Message || "", code = requestInfo.ErrorCode || ""; return "" !== code ? $base.errorPromise(SR("error.RequestRejected") + " " + format(SR("error." + code), requestInfo.ErrorData)) : $base.errorPromise(SR("error.RequestRejected") + " " + err); case requestStates.Cancelled: return $base.errorPromise(resourceManager("error.RequestCancelled")); case requestStates.Pending: case requestStates.Running: return $base.delay(function() { return post("GetRequestStatus", { requestId: requestInfo.RequestId }); }, pollingTimeout).then(getResourceId); default: return { uri: encodeURI(requestInfo.PrimaryUrl + "&MobileGet=1") }; } } function renderReport(description, parameters, extensionName, extensionSettings) { var renderOptions = { ReportId: description.Id, Name: description.Name, ReportType: description.ReportType, Extension: extensionName, ExtensionSettings: mapSettings(extensionSettings), ReportParameters: parameters }; return runTask("RenderReport", description, renderOptions).then(loadResource).then(function(html) { return { html: html }; }); } function exportDocument(description, extensionName, exportOptions) { return exportOptions.Extension = extensionName, exportOptions.ExtensionSettings = mapSettings(exportOptions.ExtensionSettings), runTask("ExportDocument", description, exportOptions); } function runTask(method, description, taskOptions) { return post(method, { description: description, options: taskOptions }).then(getResourceId); } function pagingSupported(description) { return !1; } var defaultPollingTimeout = 1e3, pollingTimeout = options.pollingTimeout || defaultPollingTimeout, 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, $base = WebServiceBase(service, serviceUrl); return { getReport: getReport, resolveParameters: resolveParameters, getResourceId: getResourceIdByRequestId, renderReport: renderReport, exportDocument: exportDocument, reportTypes: reportTypes, promise: $base.promise, errorPromise: $base.errorPromise, canSendEmail: function() { return !1; }, pagingSupported: pagingSupported, getPage: function() { throw new Error("Shouldn't be called"); }, getPageCount: function() { throw new Error("Shouldn't be called"); } }; } function BrowserSpecific() { function isEdge() { return navigator.userAgent.toLowerCase().indexOf("edge") > -1; } function isChrome() { return navigator.userAgent.toLowerCase().indexOf("chrome") > -1; } function isSafari() { return navigator.userAgent.toLowerCase().indexOf("safari") > -1; } return { SupportPdfFrame: (isChrome() || isSafari()) && !isEdge(), AllowStopPropagation: !isEdge() }; } 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(getStrippedTextElements); } function getStrippedTextElements(page) { return getTextElements(page, !0); } 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 || numberOfResults < 0 ? ALL_RESULTS : numberOfResults; return { FromPage: startFromPage, FromElement: startFromIndex, NumberOfResults: maxResultCount }; } 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, resourceManager) { var xhr = args[0]; if (3 == args.length && xhr.status) { if (resourceManager && 404 == xhr.status) return resourceManager("error.NotFound"); if (xhr.responseJSON && xhr.responseJSON.ErrorCode && resourceManager && resourceManager("error." + xhr.responseJSON.ErrorCode, xhr.responseJSON.ErrorParameters)) return resourceManager("error." + xhr.responseJSON.ErrorCode); if (xhr.responseJSON && xhr.responseJSON.Message) return xhr.responseJSON.Message; if (xhr.responseJSON && xhr.responseJSON.Error) return xhr.responseJSON.Error; if (xhr.responseText) { var m = /([^<]*)<\/title>/.exec(xhr.responseText); if (m) return m[1]; } return xhr.statusText; } return xhr.errorCode ? resourceManager && resourceManager("error." + xhr.errorCode, xhr.errorParameters) || xhr.message : xhr.statusText ? xhr.statusText : xhr; } function getTextElements(page, removeTextChilds) { var topLevelSelector = "div, p, td, li, span", pageObject = page instanceof jQuery ? page : $("<div/>").html(page), elements = pageObject.find(topLevelSelector); return removeTextChilds ? jQuery.map(elements, function(topLevelElement) { return $($(topLevelElement).clone().find(topLevelSelector).remove().end()); }) : elements; } function ContinuousPageViewModel(viewer) { function initPages() { var doc = viewer.document(); doc.pageCount.subscribe(function(newCount) { _countPages(newCount), addPages(); }), 0 === _heightPage() ? initHeight().then(function() { addPages(), goToPage(viewer.pageIndex()); }) : addPages(); } function initHeight() { return viewer.document().getPage(viewer.pageIndex()).done(function(newPage) { var tempPage = document.getElementById("tempPage"); null !== tempPage && (tempPage.innerHTML = newPage, _heightPage(tempPage.offsetHeight), tempPage.innerHTML = ""); }); } function addPages() { if (_countPages(viewer.document().pageCount()), _countPages() > 0) { for (var entries = _pages(), i = entries.length; i < _countPages(); i++) entries.push({ id: "page" + i, content: ko.observable(), state: null }); _pages.valueHasMutated(); } } function goToPage(pageIndex) { if (viewer.pageDisplayMode() === PageDisplayMode.continuous) { var elem = document.getElementById("contentView"), scrollTop = pageIndex * _heightPage(); elem.scrollTop = scrollTop; } } function getPageContent(id) { var result = $.Deferred(); return viewer.document().getPage(parseInt(id)).done(function(newContent) { result.resolve(newContent); }), result.promise(); } function onScroll(data, event) { var elem = event.target, pageIndex = Math.min(Math.round(elem.scrollTop / _heightPage()), _countPages() - 1); pageIndex >= 0 && (pageIndexSubscription.dispose(), viewer.pageIndex(pageIndex), pageIndexSubscription = viewer.pageIndex.subscribe(pageChagned)); } function clearCache() { _pages([]), _countPages(0), _heightPage(0); } var _pages = ko.observableArray([]), _countPages = ko.observable(0), _heightPage = ko.observable(0), pageChagned = function(pageIndex) { 0 === _heightPage() ? initHeight().then(function() { goToPage(viewer.pageIndex()); }) : goToPage(pageIndex); }, pageIndexSubscription = viewer.pageIndex.subscribe(pageChagned); return viewer.pageDisplayMode.subscribe(function() { clearCache(); }), viewer.document.subscribe(function() { clearCache(); }), { get pages() { return _pages; }, get countPages() { return _countPages; }, get heightPage() { return _heightPage; }, getPageContent: getPageContent, initPages: initPages, onScroll: onScroll }; } function DocumentModel(reportService, token, reportType, resourceManager) { function _resolveActionItems(element) { return _actionItemsResolver.resolve(element, _reportType); } function getToc() { if (!reportService) return $.Deferred().resolve(emptyToc).promise(); var result = $.Deferred(); return _toc() === nullToc || _toc() == emptyToc ? reportService.getToc(token).done(result.resolve).fail(failHandler) : result.resolve(_toc()), result.promise(); } function load() { _pageCount(0), _state(DocumentState.progress), reportService.getPageCount(token).progress(function(count) { _pageCount(count); }).done(function(count, state) { _pageCount(count), _state(state ? state : DocumentState.completed); }).fail(setErrorState).fail(failHandler); } function setErrorState() { _state(DocumentState.error); } function failHandler() { var error = resolveErrorMessage(arguments, SR); $(doc).trigger("error", error); } function getPage(index) { return !token || index < 0 || index >= _pageCount() ? $.Deferred().resolve("").promise() : reportService.getPage(token, index).fail(failHandler); } function exportImpl(exportType, settings, params) { if (!token || _pageCount() <= 0) throw new Error("document is not ready for export"); return reportService.export(token, exportType, settings, params).fail(failHandler); } function sendImpl(settings) { if (!token || _pageCount() <= 0) throw new Error("document is not ready for sending"); return reportService.sendEmail(token, settings); } function cancelRendering() { if (!token) throw new Error("document is not ready for cancelRendering!"); return reportService.cancelRendering(token).fail(failHandler); } var nullToc = { kids: [] }, emptyToc = { kids: [] }, _pageCount = ko.observable(0), _state = ko.observable(DocumentState.init); _state.subscribe(function() { $(document).trigger("documentStateChanged"); }); var _toc = ko.observable(nullToc), _reportType = reportType, _actionItemsResolver = new ActionItemsResolver(), SR = resourceManager && $.isFunction(resourceManager.get) ? resourceManager.get : identity, _search = reportService && reportService.search && reportService.search.apply ? function(searchOptions) { return reportService.search(token, searchOptions); } : function(searchService) { return function(searchOptions) { return searchService.search(doc, searchOptions); }; }(new ClientSideSearchService()), _documentState = null, doc = { get pageCount() { return _pageCount; }, get state() { return _state; }, getPage: getPage, getToc: getToc, get toc() { return reportService ? (_toc() === nullToc && (_toc(emptyToc), ko.waitFor(_state, function(state) { return state == DocumentState.completed; }, function() { return getToc().done(_toc); })), _toc) : _toc; }, export: exportImpl, sendEmail: sendImpl, canSendEmail: function() { return !!reportService && reportService.canSendEmail(); }, search: _search, resolveActionItems: _resolveActionItems, saveDocumentState: function() { reportService && (_documentState = reportService.getState()); }, restoreDocumentState: function() { reportService && reportService.setState(_documentState); }, cancelRendering: cancelRendering }; return reportService && token && load(), doc; } function DocumentViewModel(viewer) { function setInteractivity(value) { var sheet = getStyleSheet(); sheet.disabled = value; } function getStyleSheet() { for (var sheet, i = 0; i < document.styleSheets.length; i++) if (sheet = document.styleSheets[i], sheet.title == uniqueStylesheetTitle) return sheet; return sheet = document.createElement("style"), sheet.innerHTML = ".ars-toggle {visibility: hidden;}\n.ar7-toggle {visibility: hidden;}", sheet.title = uniqueStylesheetTitle, document.body.appendChild(sheet), sheet; } function getContent() { viewer.pageDisplayMode() === PageDisplayMode.single ? _singlePage.getPageContent() : _continuousPage.initPages(), setInteractivity(viewer.document().state() === DocumentState.completed || viewer.document().state() === DocumentState.cancelled); } function onScroll(data, event) { viewer.pageDisplayMode() === PageDisplayMode.continuous && _continuousPage.onScroll(data, event); } var _continuousPage = ContinuousPageViewModel(viewer), _singlePage = SinglePageViewModel(viewer), _isSinglePageMode = ko.computed(function() { return viewer.pageDisplayMode() === PageDisplayMode.single; }), _isContinuousPageMode = ko.computed(function() { return viewer.pageDisplayMode() === PageDisplayMode.continuous; }), uniqueStylesheetTitle = "E650924C6650"; $(viewer).on("firstPageLoaded", getContent), $(viewer).on("togglePageLoaded", getContent), viewer.pageDisplayMode.subscribe(function() { getContent(); }), viewer.document.subscribe(function(doc) { ko.waitFor(doc.state, function(val) { return val === DocumentState.completed || val === DocumentState.cancelled; }, getContent), doc.state.subscribe(function(val) { val !== DocumentState.completed && val !== DocumentState.cancelled || setInteractivity(!0); }); }); var _inProgress = ko.computed(function() { return setInteractivity((viewer.document().state() === DocumentState.completed || viewer.document().state() === DocumentState.cancelled) && !viewer.report().busy()), viewer.report().busy(); }), _parameterValidation = ko.computed(function() { return viewer.report().parameterValidation(); }); return { scrolled: onScroll, get isSinglePageMode() { return _isSinglePageMode; }, get isContinuousPageMode() { return _isContinuousPageMode; }, get singlePage() { return _singlePage; }, get continuousPage() { return _continuousPage; }, get location() { return viewer.location; }, get inProgress() { return _inProgress; }, get parameterValidation() { return _parameterValidation; } }; } function Enum() {} function ErrorPaneViewModel(viewer) { var _showErrorsPane = ko.computed(function() { return viewer.errors().length > 0; }), _showExtendedErrorInfo = ko.observable(!1), _lastError = ko.computed(function() { var nerr = viewer.errors().length; return nerr > 0 ? viewer.errors()[nerr - 1] : ""; }); return _showErrorsPane.subscribe(function(newValue) { newValue || _showExtendedErrorInfo(!1); }), { get visible() { return _showErrorsPane; }, get lastError() { return _lastError; }, get showErrorInfo() { return _showExtendedErrorInfo; }, get errors() { return viewer.errors; }, get showOnlyLastError() { return viewer.showOnlyLastError; }, dismissErrors: function() { _showExtendedErrorInfo(!1), viewer.clearErrors(); } }; } function InteractivityProcessor(services) { function processActions(pageContent) { for (var count = onPageProcessed.length; onPageProcessed.length > 0; ) { var handler = onPageProcessed.pop(); $.isFunction(handler) && handler(pageContent); } return count - onPageProcessed.length; } function processToolTips() { var verticalPositionDelta = 2, horizontalPositionDelta = 15, textTooltip = "<div class='ar-chart-tooltip'></div>", jqTooltip = $("div.ar-chart-tooltip"), allAreas = $("area[data-point-tooltip]"); if (allAreas.length > 0) { 0 === jqTooltip.length && (jqTooltip = $(textTooltip).appendTo($("body"))); var tooltips = {}; allAreas.each(function() { var contentTooltip = $("<div/>"), categoryId = $(this).attr("data-category-id"), categoryLabel = $(this).attr("data-category-label"); categoryLabel && contentTooltip.append($("<div/>").text(categoryLabel).addClass("tooltip-label")), $("area[data-category-id=" + categoryId + "]").each(function() { var sameElements = contentTooltip.has("div[data-series-id=" + $(this).attr("data-series-id") + "]:contains(" + $(this).attr("data-point-tooltip") + ")"); 0 === sameElements.length && contentTooltip.append($("<div/>").text($(this).attr("data-point-tooltip")).attr("data-series-id", $(this).attr("data-series-id"))); }), tooltips[categoryId] || (tooltips[categoryId] = contentTooltip); }), $("#reportContainer, #continuousView").on("mouseenter", "area[data-point-tooltip]", function(e) { e.stopPropagation(); var currentCategoryId = $(this).attr("data-category-id"), content = tooltips[currentCategoryId]; return jqTooltip.text(""), content ? void jqTooltip.append(content) : void jqTooltip.hide(); }), $("body").on("mousemove", "area[data-point-tooltip]", function(e) { e.stopPropagation(), jqTooltip.show(), jqTooltip.css({ top: e.pageY + verticalPositionDelta, left: e.pageX + horizontalPositionDelta }); }), $("body").on("mouseover", function() { jqTooltip.text("").hide(); }); } } function processActionItem(actionItem, pageContent) { function pageBookmarkCustomHandler(item) { onPageProcessed.push(function(content) { if (viewer.pageDisplayMode() === PageDisplayMode.single) { var elementToScroll = $(content).find("#" + item.target).first(); if (null !== elementToScroll) { var viewerOffset = $(content).offset(), elementOffset = $(elementToScroll).offset(), elementToViewerOffset = { top: elementOffset.top - viewerOffset.top, left: elementOffset.left - viewerOffset.left }; viewer.location(elementToViewerOffset); } } else goToElementAfterLoadedPage(item); }), viewer.pageDisplayMode() === PageDisplayMode.single ? viewer.pageIndex() === item.pageNumber - 1 ? processActions(pageContent) : viewer.pageIndex(item.pageNumber - 1) : processActions(pageContent); } function goToElementAfterLoadedPage(item) { var timerId = setInterval(function() { viewer.pageIndex(item.pageNumber - 1); var pageContainer = $("#continuousView").find("#page" + (item.pageNumber - 1)), element = $(pageContainer).find("#" + item.target).first(); if (null !== element && element.length > 0) { clearInterval(timerId); var viewerOffset = $(pageContainer).offset(), elementOffset = $(element).offset(), elementToViewerOffset = { top: elementOffset.top - viewerOffset.top + pageContainer[0].offsetHeight * (item.pageNumber - 1), left: elementOffset.left - viewerOffset.left }; viewer.location(elementToViewerOffset); } }, 200); } function sectionBookmarkCustomHandler(item) { function traverseTocTree(node, path, originalPromise) { function traverseKids(kids, kidLabel, restPath) { for (var i = 0; i < kids.length; i++) { var kid = kids[i]; if (kid.name === kidLabel) return restPath.length > 0 ? traverseTocTree(kid, restPath, d) : d.resolve(kid); } return null; } var d = null === originalPromise || void 0 === originalPromise ? $.Deferred() : originalPromise; if (null === node || void 0 === node) return d.resolve(null); var label = path[0]; return void 0 !== node.name && node.name === label ? d.resolve(node) : (void 0 !== node.kids && (ko.isObservable(node.kids) ? ko.waitFor(node.kids, function(k) { return k.length > 0; }, function(newKids) { traverseKids(newKids, label, path.slice(1, path.length)); }) : traverseKids(node.kids, label, path.slice(1, path.length))), d.promise()); } traverseTocTree(tocPane.root(), item.label.split("\\")).done(function(node) { null !== node && tocPane.navigate(node); }); } function getClickHandler(item) { return function() { var actionHandler = services.action; if (jQuery.isFunction(actionHandler) && !actionHandler(item.actionType, item)) return !1; switch (item.actionType) { case ActionType.hyperlink: window.open(item.url, "_blank"); break; case ActionType.bookmark: item.reportType === ReportType.pageReport ? pageBookmarkCustomHandler(item) : item.reportType === ReportType.sectionReport && sectionBookmarkCustomHandler(item); break; case ActionType.drillthrough: viewer.drillthrough(item.drillthroughLink); break; case ActionType.toggle: viewer.toggle(item.toggleInfo); } return !1; }; } var itemElement = $(actionItem.element); itemElement.click(getClickHandler(actionItem)); } var viewer = services.viewer, tocPane = services.tocPane, onPageProcessed = []; return { processActions: processActions, processActionItem: processActionItem, processToolTips: processToolTips }; } function ParameterModel(p) { function isNullable() { return _nullable; } function getValue() { if (_state == ParameterState.HasOutstandingDependencies) return null; if (null !== _value && void 0 !== _value) return _value; var value; return getValues() && (value = getValues()[0]) ? value.value : _multivalue ? void 0 : null; } function setValue(newValue) { _value = newValue, _values = null, updateState(); } function updateState() { var value = getValue(); (isNullable() || null !== value || _multivalue) && void 0 !== value || (_state = ParameterState.ExpectValue); } function getValues() { return _state == ParameterState.HasOutstandingDependencies ? [] : _values; } function setValues(newValues) { _values = newValues, _value = void 0, updateState(); } var _nullable = p.nullable, _value = p.value, _state = p.state, _values = p.values, _name = p.name, _hidden = p.hidden, _availableValues = p.availableValues, _prompt = p.prompt, _multiline = p.multiline, _multivalue = p.multivalue, _allowEmpty = p.allowEmpty, _dateOnly = p.dateOnly, _type = p.type, _promptUser = p.promptUser, _definesValidValues = p.definesValidValues, _selectAllEnabled = p.selectAllEnabled, _dateDomain = p.dateDomain, _error = p.error, _editor = p.editor, _dependantParameterNames = p.dependantParameterNames, _hasDependantParameters = p.hasDependantParameters; return { updateState: updateState, get name() { return _name; }, get hidden() { return _hidden; }, get value() { return getValue(); }, set value(newValue) { setValue(newValue); }, get values() { return getValues(); }, set values(newValues) { setValues(newValues); }, get availableValues() { return _availableValues; }, get prompt() { return _prompt; }, get nullable() { return isNullable(); }, get multiline() { return _multiline; }, get multivalue() { return _multivalue; }, get allowEmpty() { return _allowEmpty; }, get dateOnly() { return _dateOnly; }, get type() { return _type; }, get state() { return _state; }, get promptUser() { return _promptUser; }, get definesValidValues() { return _definesValidValues; }, get selectAllEnabled() { return _selectAllEnabled; }, get dateDomain() { return _dateDomain; }, get error() { return _error; }, get editor() { return _editor; }, get dependantParameterNames() { return _dependantParameterNames; }, get hasDependantParameters() { return !!this.dependantParameterNames && this.dependantParameterNames.length > 0 || !!_hasDependantParameters; }, setClientValidationFailed: function(message) { _state = ParameterState.ClientValidationFailed, _error = message; }, setOk: function() { _state = ParameterState.Ok, _error = ""; } }; } function ParameterPaneViewModel(services, viewer) { function runReport() { refreshAfterValidation = !1, allowRefresh(!1), viewer.report().run(); } function refreshReport() { if (viewer.report().setHideParameterErrors(!1), parameterViewModels().forEach(function(pm) { pm.enabled() && (pm.$updateValuesFromModel(!0, !0), pm.validateValue()); }), validating) refreshAfterValidation = !0; else try { runReport(); } catch (err) { if (!parameterViewModels().some(function(pm) { return !pm.enabled() || "" !== pm.errorText(); })) throw err; } finally { allowRefresh(!0); } } if (!viewer) throw new ReferenceError("viewer is required here!"); var _allViewsValid = ko.observable(!0), parameterViewModels = ko.observable([]), areAllParametersValid = ko.computed(function() { return viewer.report().allParametersValid() && _allViewsValid(); }); $(document).bind("documentStateChanged", function() { allowRefresh(!0); }), viewer.errors.subscribe(function() { allowRefresh(!0); }); var allowRefresh = ko.observable(!0), parameterPaneVisible = ko.computed({ read: function() { return viewer.sidebarState() === SidebarState.Parameters; }, write: function(value) { viewer.sidebarState(value ? SidebarState.Parameters : SidebarState.Hidden); } }); viewer.report.subscribe(function() { parameterViewModels([]); }); var validating = !1, refreshAfterValidation = !1; ko.computed(function() { return viewer.report().parameters(); }).subscribe(function(params) { function updateIsValid(_) { _allViewsValid(parameterViewModels().every(function(v) { return 0 === v.errorText().length; })); } function parameterChanged(p) { validating = !0, viewer.report().validateParameter({ multivalue: p.multivalue, name: p.name, value: p.value, values: p.values }).done(function() { areAllParametersValid() && refreshAfterValidation && runReport(); }).always(function() { validating = !1; }); } if (0 === parameterViewModels().length) { var paramModels = params.filter(function(p) { return void 0 === p.promptUser || p.promptUser; }).map(function(p) { return ParameterViewModel(services, p, parameterChanged, updateIsValid, viewer.report()); }); parameterViewModels(paramModels); } else parameterViewModels().forEach(function(paramModel) { var updated = params.filter(function(pp) { return pp.name == paramModel.name; }); 1 == updated.length && paramModel.$update(updated[0]); }); }); var _canRefresh = ko.computed(function() { return !viewer.report().parameterValidation() && allowRefresh(); }); return { visible: parameterPaneVisible, isValid: areAllParametersValid, refreshReport: { exec: refreshReport, enabled: _canRefresh }, refreshReportAndClose: { exec: function() { viewer.sidebarState(SidebarState.Hidden), refreshReport(); }, enabled: _canRefresh }, parameters: parameterViewModels }; } function ParameterViewModel(services, param, parameterChanged, parameterUpdateIsValid, reportModel) { function equals(v1, v2) { return _parameterModel.type === ParameterType.DateTime ? v1 - v2 === 0 : v1 === v2; } function isNull(value) { return null === value; } function isUndefined(value) { return void 0 === value; } function updateEnabled() { _enabled(_parameterModel.state != ParameterState.HasOutstandingDependencies && !reportModel.parameterValidation()); } function setIsValueNull(value) { _isValueNull(_nullCheckboxValue && _parameterModel.nullable && null === value); } function updateParameter(p) { function createOptionViewModel(availableValue) { var option = ParameterOptionViewModel(availableValue); return option.selected.subscribe(function() { onSelectedChanged(option); }), option; } if (_parameterModel = p, _value(p.value), setIsValueNull(p.value), updateEnabled(), _editor(p.editor), _values(_value() === ParameterSpecialValue.SelectAll ? [ { value: ParameterSpecialValue.SelectAll, label: getResourceString("selectall") } ] : p.values), p.multivalue && p.state != ParameterState.HasOutstandingDependencies && (p.setOk(), p.updateState()), _errorText(function(state, error) { var errorText = ""; switch (state) { case ParameterState.Ok: return ""; case ParameterState.ExpectValue: errorText = getResourceString("error.ExpectValue"); break; case ParameterState.ValidationFailed: errorText = getResourceString("error.ValidationFailed"); break; case ParameterState.HasOutstandingDependencies: return getResourceString("error.HasOutstandingDependencies"); case ParameterState.ClientValidationFailed: return error; } return [ errorText, error ].filter(identity).join(": "); }(p.state, p.error)), "" !== _errorText() || _parameterModel.nullable || null !== _value() || _parameterModel.multivalue || _errorText(getResourceString("error.ExpectValue")), p.availableValues) { var optionModels = p.availableValues.map(function(av) { var selected = _parameterModel.multivalue ? p.values.some(function(v) { return equals(v.value, av.value) && equals(v.index, av.index); }) : equals(av.value, p.value); return createOptionViewModel({ value: av.value, label: av.label, index: av.index, selected: selected }); }); if (_parameterModel.nullable && !_parameterModel.multivalue) { var nullLabel = getResourceString("null"); optionModels.push(createOptionViewModel({ value: null, label: nullLabel, index: 0, selected: _isValueNull() })); } if (_parameterModel.selectAllEnabled) { var label = getResourceString("selectall"); optionModels.splice(0, 0, createOptionViewModel({ value: ParameterSpecialValue.SelectAll, label: label, selected: p.value === ParameterSpecialValue.SelectAll })); } _options(optionModels), updateEnabled(); } } function isValidDate(d) { return Date.isDate(d); } function convertToTyped(value, type) { if (value = isNull(value) ? null : isUndefined(value) ? void 0 : value, _parameterModel.multivalue && null === value) return null; switch (type) { case ParameterType.Bool: value = convertToBool(value); break; case ParameterType.Int: value = convertToInt(value); break; case ParameterType.Float: value = convertToFloat(value); break; case ParameterType.DateTime: value = convertToDateTime(value); break; case ParameterType.String: value = convertToString(value); break; default: if (null === value && !_parameterModel.nullable && !_parameterModel.multivalue || "" === value && !_parameterModel.allowEmpty) throw new Error(getResourceString("error.ExpectValue")); } return value; } function convertToBool(value) { if (null === value) { if (_isValueNull()) return null; throw new Error(getResourceString("error.ExpectBooleanValue")); } if ("boolean" == typeof value) return value; if ("true" == value.toLowerCase()) return !0; if ("false" == value.toLowerCase()) return !1; throw new Error(getResourceString("error.ExpectBooleanValue")); } function convertToInt(value) { if (null === value) { if (_isValueNull()) return null; throw new Error(getResourceString("error.ExpectNumericValue")); } if (value = parseInt(value, 10), isNaN(value)) throw new Error(getResourceString("error.ExpectNumericValue")); return value; } function convertToFloat(value) { if (null === value) { if (_isValueNull()) return null; throw new Error(getResourceString("error.ExpectNumericValue")); } if ("" === value) return null; value.replace && (value = value.replace(",", ".")); var notFiniteNumber = isNaN(value) || parseFloat(value) == 1 / 0 || parseFloat(value) == -(1 / 0); if (notFiniteNumber) throw new Error(getResourceString("error.ExpectNumericValue")); return value = parseFloat(value); } function convertToDateTime(value) { if (null === value) { if (_isValueNull()) return null; throw new Error(getResourceString("error.ExpectDateValue")); } if (value = checkDateFormatYearOnly(value) ? new Date(parseInt(value), 0, 1) : checkDateFormat(value) ? new Date(value.replace(/-/g, "/").replace(/T/g, " ")) : new Date(value), !isValidDate(value)) throw new Error(getResourceString("error.ExpectDateValue")); return value; } function convertToString(value) { if (void 0 === value && (value = ""), !_nullCheckboxValue && null === value) { if (!_parameterModel.nullable) throw new Error(getResourceString("error.ExpectNotEmptyValue")); value = ""; } if ("" === value && !_parameterModel.allowEmpty) throw new Error(getResourceString("error.ExpectNotEmptyValue")); return value; } function validateAndConvertValue(value) { _hideError = !1, value = isNull(value) ? null : isUndefined(value) ? void 0 : value; try { if (void 0 !== _parameterModel.availableValues && _parameterModel.availableValues.length > 0 && !isPredefinedValue(value)) { if (!_parameterModel.nullable && null === value) throw new Error(getResourceString("error.ExpectNotNullValue")); throw new Error(getResourceString("error.ExpectValueValidationFailed")); } ParameterSpecialValue.notContains(value) && (value = convertToTyped(value, _parameterModel.type)), _parameterModel.setOk(); } catch (e) { _parameterModel.setClientValidationFailed(e.message); } return value; } function isPredefinedValue(value) { function AsString(obj) { return null === obj || void 0 === obj ? "" : obj.toString(); } if (value = isNull(value) ? null : isUndefined(value) ? void 0 : value, void 0 === _parameterModel.availableValues) return !1; if (_parameterModel.availableValues.map(function(v) { return AsString(v.value); }).indexOf(AsString(value)) !== -1) return !0; if (_parameterModel.multivalue) { if (null === value) return !0; if (void 0 === value) return !1; } else if (_parameterModel.availableValues.length > 0 && _parameterModel.nullable && null === value) return !0; return !!(_parameterModel.availableValues.length > 0 && _parameterModel.selectAllEnabled && value === ParameterSpecialValue.SelectAll); } function updateValue(newValue) { newValue = isNull(newValue) ? null : isUndefined(newValue) ? void 0 : newValue, setIsValueNull(newValue), _parameterModel.type == ParameterType.DateTime & (checkDateFormatYearOnly(newValue) | checkDateFormat(newValue)) & !checkYear(newValue) || (newValue = validateAndConvertValue(newValue), _value(newValue), parameterChanged({ name: _parameterModel.name, value: newValue })); } function updateValues(newValues) { try { newValues = newValues.map(function(value) { var resultValue = value.value; return ParameterSpecialValue.notContains(resultValue) && (resultValue = convertToTyped(resultValue, _parameterModel.type)), { label: value.label, value: resultValue, index: value.index }; }), _parameterModel.setOk(); } catch (e) { _parameterModel.setClientValidationFailed(e.message); } newValues != _values && (_hideError = !1), _values(newValues), parameterChanged({ multivalue: !0, name: _parameterModel.name, values: newValues, value: _parameterModel.multivalue ? void 0 : null }); } function onSelectedChanged(option) { _multivalueUpdated = !1, option.selected() && (option.value == ParameterSpecialValue.SelectAll ? _options().filter(function(o) { return o != option; }).forEach(function(o) { o.selected(!1); }) : _parameterModel.selectAllEnabled && _options().filter(function(o) { return o.value == ParameterSpecialValue.SelectAll; }).forEach(function(o) { o.selected(!1); })); } function checkDateFormat(value) { return null !== value && /^[\d]{4}-[\d]{2}(-[\d]{2})?((T| )[\d]{2}:[\d]{2}(:[\d]{2})?)?$/.test(value); } function checkDateFormatYearOnly(value) { return null !== value && /^[\d]{4}$/.test(value); } function checkYear(value) { if (null !== value && void 0 !== value) { var year = value.toString().split("-")[0]; return year > 1e3 && year < 1e4; } return !1; } var _parameterModel = param, _value = _parameterModel.multivalue ? ko.observable(void 0) : ko.observable(null), _isValueNull = ko.observable(!1), _enabled = ko.observable(!1), _errorText = ko.observable(""), _nullCheckboxValue = _parameterModel.nullable, _hideError = !0, _multivalueUpdated = !1, _options = ko.observable([]), _values = ko.observable([]), _editor = ko.observable(ParameterEditorType.SingleValue), getResourceString = services.resourceManager && services.resourceManager.get || identity; reportModel.parameterValidation.subscribe(function() { updateEnabled(); }), _errorText.subscribe(function(v) { parameterUpdateIsValid(0 === v.length); }); var _dateTimePickerSuported, _isValueNullProperty = ko.computed({ read: _isValueNull, write: function(v) { _nullCheckboxValue = v, updateValue(v ? null : _value()); } }), _valueProperty = ko.computed({ read: _value, write: updateValue }), _stringValueProperty = ko.computed({ read: function() { function toDateString(dt) { return _parameterModel.dateOnly ? dt.toLocaleDateString() : dt.toLocaleString(); } return _editor() == ParameterEditorType.MultiValue ? _values().map(function(v) { return v.label; }).join(", ") : _editor() == ParameterEditorType.SelectOneFromMany ? _options().filter(function(o) { return equals(o.value, _value()); }).map(function(v) { return v.label; }).join(", ") : null === _value() || void 0 === _value() ? "" : _parameterModel.type === ParameterType.DateTime && _value() instanceof Date ? toDateString(_value()) : _value().toString(); }, write: updateValue }), _isDateTimePickedSupported = function() { if (void 0 === _dateTimePickerSuported) { var element = document.createElement("input"); element.setAttribute("type", "datetime-local"), _dateTimePickerSuported = "datetime-local" === element.type; } return _dateTimePickerSuported; }, _datePickerValueProperty = ko.computed({ read: function() { function toDateString(dt) { function pad(v) { return ("0" + v).right(2); } var dateTimeDelimiter = _isDateTimePickedSupported() ? "T" : " ", dateString = dt.getFullYear() + "-" + pad(dt.getMonth() + 1) + "-" + pad(dt.getDate()); return _parameterModel.dateOnly ? dateString : dateString + dateTimeDelimiter + pad(dt.getHours()) + ":" + pad(dt.getMinutes()) + ":" + pad(dt.getSeconds()); } return null !== _value() && void 0 !== _value() && _parameterModel.type === ParameterType.DateTime && _value() instanceof Date ? toDateString(_value()) : ""; }, write: updateValue }), _displayValueProperty = ko.computed({ read: function() { return _parameterModel.multivalue ? 0 === _values().length ? getResourceString("enterValue") : _stringValueProperty() : _parameterModel.nullable ? null === _value() ? getResourceString("null") : _stringValueProperty() : null === _value() || void 0 === _value() ? getResourceString("enterValue") : _stringValueProperty(); } }); return updateParameter(_parameterModel), { get prompt() { return _parameterModel.prompt; }, get nullable() { return _parameterModel.nullable; }, get type() { return _parameterModel.type; }, get name() { return _parameterModel.name; }, get editor() { return _editor; }, get dateOnly() { return _parameterModel.dateOnly; }, get enabled() { return _enabled; }, get isValueNull() { return _isValueNullProperty; }, get errorText() { return reportModel.hideParameterErrors && _hideError && _errorText(""), _errorText; }, get errorHidden() { return reportModel.hideParameterErrors && _hideError; }, get value() { return _valueProperty; }, get stringValue() { return _stringValueProperty; }, get datePickerValue() { return _datePickerValueProperty; }, get displayValue() { return _displayValueProperty; }, get options() { return _options; }, validateValue: function() { validateAndConvertValue(_value()), updateParameter(_parameterModel); }, clearOptions: function() { _options().forEach(function(o) { o.selected(!1); }), updateValues([]); }, $update: updateParameter, $updateValuesFromModel: function(apply, refresh) { if ((!_multivalueUpdated || !refresh) && (_multivalueUpdated = !0, _parameterModel.multivalue && apply)) { var values = _options().filter(function(v) { return v.selected(); }).map(function(v) { return { value: v.value, label: v.label, index: v.index }; }); updateValues(values); } } }; } function ParameterOptionViewModel(availableValue) { var _selected = ko.observable(!!availableValue.selected); return { get label() { return availableValue.label || String(availableValue.value); }, get value() { return availableValue.value; }, get selected() { return _selected; }, get index() { return availableValue.index; } }; } function parseUri(str) { for (var o = parseUri.options, m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), uri = {}, i = 14; i--; ) uri[o.key[i]] = m[i] || ""; return uri[o.q.name] = {}, uri[o.key[12]].replace(o.q.parser, function(match, first, second) { first && (uri[o.q.name][first] = second); }), uri; } function PrintingService(resourceManager, browserSpecific) { function printImpl(documentModel, callExportCallback) { var settings = { printing: !0 }; return documentModel.state() == DocumentState.cancelled && (settings.PreviewPages = documentModel.pageCount()), documentModel.export(ExportType.Pdf, settings).done(function(exportUrl) { function useFrame(exportUrl) { var printingFrameId = "gc-viewer-print-frame", iframe = document.getElementById("#" + printingFrameId); iframe || (iframe = document.createElement("iframe"), iframe.setAttribute("id", printingFrameId), document.body.appendChild(iframe)), iframe.setAttribute("src", encodeURI(exportUrl)); } function openInWindow(exportUrl) { var printWindow = null; try { printWindow = window.open(exportUrl, "_blank"), printWindow && printWindow.focus(); } catch (e) {} return !!printWindow; } if (exportUrl) return browserSpecific.SupportPdfFrame ? void useFrame(exportUrl) : void (openInWindow(exportUrl) || callExportCallback(exportUrl + "&Attachment=1", function(url) { window.location = url; })); }); } return { print: function(documentModel, callExportCallback) { return printImpl(documentModel, callExportCallback); } }; } function convertPropertiesToJson(input) { function unescape(s) { return s = s.replace(/\\u(\d+)/g, function(match, ns) { return String.fromCharCode(parseInt(ns, 10)); }), s = s.replace(/\\(.)/g, "all.js"), s.endsWith("\\") && (s = s.substr(0, s.length - 1)), s; } function parse(s) { var m = s.match(/((\\.|[^:=])+)[:=](.*)/); return m ? { key: unescape(m[1].trim()), value: unescape(m[3].trim()) } : null; } if ("string" != typeof input || !input) return {}; for (var lines = input.split(/\r?\n/g), output = {}, i = 0; i < lines.length; i++) { var l = lines[i].trim(); if (l && !l.startsWith("#") && !l.startsWith("!")) { var p = parse(l); if (p) { for (;l.endsWith("\\") && i + 1 < lines.length; ) l = lines[++i].trim(), p.value += unescape(l); output[p.key] = p.value; } } } return output; } function ReportModel(reportService, reportInfo, busy, resourceManager, renderMode, previewPages) { function setHideParameterErrors(value) { _hideParameterErrors = value; } function getReportName(reportId) { var format = reportId.split(".").pop(); switch (format) { case "rpx": case "rdlx": case "rdl": case "rdf": return reportId.replace(/\.[^.]+$/, ""); default: return format; } } function dispose(async) { if (_disposed = !0, _reportToken) { var token = _reportToken; _reportToken = null, _reportType(ReportType.unknown), _params([]), _state(ReportModelState.closed), reportService.close(token, async); } } function open(manualRun) { reportInfo.id && (_reportToken = null, _reportType(ReportType.unknown), _busy(!0), reportService.open(reportInfo.id, reportInfo.parameters || []).done(function(rpt) { _reportToken = rpt.token, _reportType(rpt.reportType), _autoRun(!!rpt.autoRun), rpt.isChangeRenderModeSupported.done(function(val) { _isChangeRenderModeSupported(val), _isChangeRenderModeSupported() || _renderModeState("Paginated"); }), _params(reportInfo.snapshotId ? [] : rpt.parameters.map(function(serviceParameter) { return ParameterModel(serviceParameter); }) || []), keepAlive(), _state(ReportModelState.open), !rpt.autoRun || !_allParametersValid() || manualRun && _hasPromptParams() || run(), _disposed && dispose(!0); }).fail(failHandler).always(function() { (!_autoRun() || !_allParametersValid() || _hasPromptParams() && manualRun) && _busy(!1); })); } function keepAlive() { _reportToken && reportService.ping(_reportToken).done(function(shouldContinue) { shouldContinue && setTimeout(function() { keepAlive(); }, pingTimeout); }); } function failHandler() { var error = resolveErrorMessage(arguments, SR); _busy(!1), _state(ReportModelState.error), raiseError(error); } function raiseError(error) { $report.trigger("error", error); } function subscribeFirstPageLoaded(docModel) { docModel && (ko.waitFor(docModel.pageCount, function(pageCount) { return pageCount > 0; }, function() { $report.trigger("firstPageLoaded"), _busy(!1); }), ko.waitFor(docModel.state, function(state) { return state == DocumentState.completed; }, function() { _busy(!1); })); } function subscribeTogglePageLoaded(docModel, index) { docModel && (ko.waitFor(docModel.pageCount, function(pageCount) { return pageCount > index; }, function() { $report.trigger("togglePageLoaded"), _busy(!1); }), ko.waitFor(docModel.state, function(state) { return state == DocumentState.completed; }, function() { _busy(!1); })); } function run(ignorePreviewPages) { if (!_reportToken) throw new Error("Report is not opened!"); if (!_allParametersValid()) throw new Error("Invalid parameters!"); return ignorePreviewPages && (_settings.PreviewPages = 0), validateParameters(_params()).done(function() { var allParametersOk = _params().every(function(p) { return p.state == ParameterState.Ok; }); return allParametersOk ? (_busy(!0), reportService.run(_reportToken, _params(), _settings, reportInfo.snapshotId).then(function(d) { _state(ReportModelState.documentReady); var dm = DocumentModel(reportService, d, _reportType(), resourceManager); subscribeFirstPageLoaded(dm), $report.trigger("documentReady", dm); }).fail(failHandler)) : $.Deferred().resolve(); }); } function validateParameters(parameters, dependantNames) { return parameters && parameters.length > 0 ? (_parameterValidation(!0), reportService.validateParameters(_reportToken, parameters, dependantNames).then(function(newParameters) { _params(newParameters.map(function(serviceParameter) { return ParameterModel(serviceParameter); })); }).fail(failHandler).always(function() { _parameterValidation(!1); })) : $.Deferred().resolve(); } function validateParameter(parameter) { var parameterFromModel = _params().filter(function(p) { return p.name == parameter.name; })[0]; if (parameterFromModel.hasDependantParameters) { if (reportService.validateParameterSupported()) return reportService.validateParameter(_reportToken, parameter).then(function(updated) { var newParameters = _params().map(function(parameterModel) { var f = updated.filter(function(u) { return u.name == parameterModel.name; }); return 1 == f.length ? ParameterModel(f[0]) : parameterModel; }); _params(newParameters); }).fail(failHandler); var parameters = _params().map(function(p) { return p.name == parameter.name ? parameter : p; }); return validateParameters(parameters, parameterFromModel.dependantParameterNames); } return parameter.multivalue ? parameterFromModel.values = parameter.values : parameterFromModel.value = parameter.value, _params(_params()), $.Deferred().resolve(); } function drillthrough(drillthroughLink) { _busy(!0); var settings = reportInfo.settings || {}; return settings.RenderMode || (settings.RenderMode = _renderModeState()), reportService.drillthrough(_reportToken, drillthroughLink, settings).then(function(result) { var parameterModels = result.parameters.map(function(serviceParameter) { var parameterModel = ParameterModel(serviceParameter); return parameterModel.setOk(), parameterModel.updateState(), parameterModel; }) || [], child = ReportModel(reportService, { token: result.reportToken, parameters: parameterModels, docToken: result.documentToken, reportType: ReportType.pageReport, settings: settings }, !0); child.renderModeState(settings.RenderMode), result.isChangeRenderModeSupported.done(function(result) { child.isChangeRenderModeSupported(result); }), child.keepAlive(); var dm = result.documentToken ? DocumentModel(reportService, result.documentToken, ReportType.pageReport, resourceManager) : null; return child.subscribeFirstPageLoaded(dm), { report: child, document: dm }; }).fail(failHandler).always(function() { _busy(!1); }); } function toggle(toggleInfo, currentPageIndex) { _busy(!0); var pageIndex = currentPageIndex; return reportService.toggle(_reportToken, toggleInfo, _settings).then(function(info) { _state(ReportModelState.documentReady); var dm = DocumentModel(reportService, info.url, _reportType(), resourceManager); return subscribeTogglePageLoaded(dm, pageIndex), $report.trigger("documentReady", dm), info; }).fail(failHandler).always(function() { _busy(!1); }); } if (!reportService) throw new ReferenceError("ReportService is required here!"); reportInfo = reportInfo || {}; var _reportName = reportInfo.id ? getReportName(reportInfo.id) : "", pingTimeout = 6e4, SR = resourceManager && $.isFunction(resourceManager.get) ? resourceManager.get : identity, _busy = ko.observable(void 0 !== busy && busy), _parameterValidation = ko.observable(!1), _state = ko.observable(ReportModelState.noReport), _autoRun = ko.observable(!1), _reportToken = null, _params = ko.observable([]), _settings = JSON.parse(JSON.stringify(reportInfo.settings || {})); "Galley" == renderMode ? _settings.RenderMode = renderMode : _settings.RenderMode = "Paginated", _settings.PreviewPages = previewPages; var _renderModeState = ko.observable(_settings.RenderMode); _renderModeState.subscribe(function(newValue) { _settings.RenderMode = newValue; }); var _isChangeRenderModeSupported = ko.observable(!1), _allParametersValid = ko.computed(function() { var parameters = _params(); return parameters.every(function(p) { return p.state == ParameterState.Ok; }); }), _hasPromptParams = ko.computed(function() { var parameters = _params(); return parameters.filter(function(p) { return void 0 === p.promptUser || p.promptUser; }).length > 0; }), _reportType = ko.observable(ReportType.unknown), _disposed = !1, _hideParameterErrors = !0, report = { get reportType() { return _reportType(); }, get state() { return _state; }, get busy() { return _busy; }, get parameterValidation() { return _parameterValidation; }, get parameters() { return _params; }, get hasPromptParameters() { return _hasPromptParams; }, get allParametersValid() { return _allParametersValid; }, get hideParameterErrors() { return _hideParameterErrors; }, get reportName() { return _reportName; }, setHideParameterErrors: setHideParameterErrors, validateParameter: validateParameter, subscribeFirstPageLoaded: subscribeFirstPageLoaded, open: open, run: run, renderMode: function(mode) { _renderModeState(mode), run(); }, renderModeState: _renderModeState, isChangeRenderModeSupported: _isChangeRenderModeSupported, dispose: dispose, drillthrough: drillthrough, toggle: toggle, keepAlive: keepAlive, get autoRun() { return _autoRun; } }, $report = $(report); return reportInfo.id ? (_reportToken = null, _params([]), _reportType(ReportType.unknown), _state(ReportModelState.noReport)) : reportInfo.token && (_reportToken = reportInfo.token, _reportType(reportInfo.reportType), _params(reportInfo.parameters.map(function(parameter) { return ParameterModel(parameter); })), _state(reportInfo.docToken ? ReportModelState.documentReady : ReportModelState.open)), report; } function ReportServiceSelector(options, resourceManager) { function realService() { return impl || (impl = options.securityToken ? ArsReportService(options, resourceManager) : ArReportService(options, resourceManager)), impl; } function delegate(method) { return function() { var args = arguments, service = realService(); return service[method].apply(service, args); }; } if (!options.url) throw new Error("options has no valid url"); var impl, api = {}; return [ "open", "close", "run", "cancelRendering", "validateParameters", "validateParameter", "getPageCount", "getPage", "getToc", "export", "search", "drillthrough", "toggle", "ping", "sendEmail", "canSendEmail", "getState", "setState", "getDelayedContent" ].forEach(function(method) { "function" == typeof realService()[method] && (api[method] = delegate(method)); }), api.validateParameterSupported = function() { return impl && impl.validateParameterSupported(); }, api; } function ResourceManager() { var embedded = {}, resources = {}; embedded = { sidebar: "Sidebar", toc: "TOC", tocfull: "Table of Contents", firstPage: "First", lastPage: "Last", prevPage: "Prev", nextPage: "Next", print: "Print", backToParent: "Back to Parent", params: "Parameters", saveas: "Save As...", renderMode: "Change render mode", Galley: "Galley", Paginated: "Paginated", SinglePageView: "Single page view", ContinuousPageView: "Continuous page view", CancelRendering: "Cancel Report", RunFullReport: "Partial Data. Run Full Report", PartialData: "This report is based on partial data", pdfDocument: "PDF Document", wordDocument: "Word Document", docxDocument: "Word Document (.docx)", imageFile: "Image File", mhtDocument: "MHTML Web Archives", excelWorkbook: "Excel Workbook", csvFile: "CSV File", yes: "Yes", no: "No", true: "True", false: "False", null: "Null", "null-label": "Null value", on: "On", off: "Off", selectall: "(select all)", enterValue: "Enter value", clearAllOptions: "Reset all", blank: "Blank", empty: "Empty", back: "Back", refreshReport: "View report", search: "Search", matchCase: "Match case", wholePhrase: "Whole phrase", more: "More...", noResults: "No results", clear: "Clear", findLabel: "Find:", email: "Email", sendEmailTitle: "Send report by email", sendEmailTo: "Send to", emailSubject: "Subject", emailMessage: "Message", asLink: "As link", asAttachment: "As attachment", documentFormat: "Document format", cancel: "Cancel", sendEmail: "Send", deliveryMethodCaption: "Delivery Method", sendEmailPolicyName: "Emailing report", "docformat.pdf": "PDF document", "docformat.excel": "Excel file (xls)", "docformat.mht": "MHT document", "docformat.image": "Image file", "docformat.word": "Word document", "docformat.xml": "XML file (xml)", "docformat.csv": "CSV file", "errorPane.Details": "Show details", "errorPane.HideDetails": "Hide details", "errorPane.DismissAll": "Dismiss all", "errorPane.ErrorPaneTitle": "An error(s) occurred", "error.ExpectValue": "Value expected", "error.ExpectNotEmptyValue": "Value expected: Blank value assigned to non-Blank parameter.", "error.ExpectNotNullValue": "Value expected: null value assigned to non-Nullable parameter.", "error.ExpectValueValidationFailed": "Value expected: Parameter value is not a valid value.", "error.ValidationFailed": "Validation failed.", "error.HasOutstandingDependencies": "Has outstanding dependencies.", "error.ExpectNumericValue": "Not a numeric value.", "error.ExpectBooleanValue": "Not a boolean value.", "error.ExpectDateValue": "Invalid date value.", "error.NotSupported": "Operation is not supported.", "error.NotFound": "Not Found.", "error.ReportNotFound": "Unable to open report '{0}'.", "error.InvalidReportToken": "Invalid report token.", "error.InvalidDocumentToken": "Invalid document token.", "error.RequestFailed": "Your request failed.", "error.RequestRejected": "Your request was rejected.", "error.RequestCancelled": "Your request was cancelled.", "error.InvalidRequestId": "Invalid request id.", "error.InvalidDrillthroughLink": "Invalid drillthrough link '{0}'.", "error.InvalidDrillthroughParameters": "Invalid drillthrough parameters.", "error.InvalidResponse": "Invalid response.", "error.InvalidParameters": "Invalid report parameters.", "error.DocumentNotInCache": "The document is not present in the cache. Please refresh the report.", "error.JsVersionsMismatch": "The version of GrapeCity.ActiveReports.Viewer.Html.js or GrapeCity.ActiveReports.Viewer.Html.min.js does not match the version of ActiveReports installed on the server side. Please update the javascript files in your application.", "error.InvalidSharedDataSource": "The shared data source '{0}' cannot be loaded.", "error.NoAgentsAvailable": "No licensed agents available to proceed the request.", "error.LicenseExpired": "Your evaluation of ActiveReports 12 Server has expired so you cannot perform this action. Please contact our sales team ActiveReports.Sales@grapecity.com to extend your evaluation.", "error.NoLicense": "You cannot perform this action due to licensing issues. Please contact our sales team ActiveReports.Sales@grapecity.com.", "error.InternalServerError": "Internal Server error.", "error.AccessDenied": "Access to the requested document is denied.", "error.ReportError.DataSetNotSpecified": "DataSet name needs to be specified in the Fixed Page Layout settings.", "error.ReportError.NoDataSets": "No data sets.", "error.NoDataSets": "No data sets.", "error.ReportError.DataSetNotFound": "A DataSet '{0}' referenced in the report could not be found.", "error.ReportError.SubreportNotFound": "Unable to locate subreport '{0}'.", "error.ReportError.NoMasterReport": "Unable to load the master report for the specified content report.", "error.ReportError.UnableToCreateConnection": "Cannot connect to data source.", "error.ReportError.JsonSchemaNotAvailableOrInvalid": "Json schema either not available or invalid.", "error.InvalidEmailFormat": "Enter emails in correct format.", "error.InvalidSmtpSettings": "SMTP settings are not provided.", "error.InvalidDbEntity": "Database entity has invalid values.", "error.NotificationUrlIsNotSet": "Can't create resource link: the notification link URL is not set.", "error.ReportError.BlankValueAssignedToNonBlankParameter": "Blank value assigned to non-Blank parameter '{0}'.", "error.ReportError.InvalidDataTypeForParameter": "Invalid data type for parameter '{0}'.", "error.ReportError.NullValueAssignedToNonNullableParameter": "null value assigned to non-Nullable parameter '{0}'.", "error.ReportError.ParameterValueIsNotValid": "Parameter '{0}' value is not a valid value.", "error.IncorrectSmtpSettings": "The SMTP settings are incorrect." }; var manager; return manager = { get: function(key, args) { if (!key) return ""; var value = ""; return resources.hasOwnProperty(key) && (value = resources[key]), value = value || embedded[key] || "", args && Array.isArray(args) && args.length > 0 && (value = value.replace(/\{([\d]+)\}/g, function(match, matchNumber) { return void 0 !== args[parseInt(matchNumber)] ? args[parseInt(matchNumber)] : match; })), value; }, update: function(uri) { return "string" == typeof uri && uri ? $.get(uri).then(function(text) { return "string" == typeof text && (resources = convertPropertiesToJson(text), $(manager).trigger("updated"), !0); }) : $.Deferred(function(d) { d.reject("Invalid uri."); }).promise(); } }; } function SearchPaneViewModel(viewer, documentViewModel, maxSearchResults, pageElement) { function _clear() { _searchString(""), _matchCase(!1), _wholePhrase(!1), _lastSearchResult(null), _reset(); } function _search() { _lastSearchOptions = { text: _searchString(), matchCase: _matchCase(), wholePhrase: _wholePhrase(), maxSearchResults: maxSearchResults }, _reset(), viewer.document().search(_lastSearchOptions).done(function(res) { _hasMore(res.hasMore), _searchResults(res.matches), _isReady(!0); }); } function getOffsetRect(elem) { var box = elem.getBoundingClientRect(), body = document.body, docElem = document.documentElement, scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, top = box.top + scrollTop - clientTop, left = box.left + scrollLeft - clientLeft; return { top: Math.round(top), left: Math.round(left) }; } function _navigate(searchResult) { _lastSearchResult(searchResult), viewer.pageIndex(searchResult.page), navigateAfterLoadedPage(searchResult, viewer.pageDisplayMode() === PageDisplayMode.single ? singleViewNavigate : continuousViewNavigate); } function singleViewNavigate(searchResult, item, pageContainer) { var locationSingle = searchResult.location || getItemLocation(item, pageContainer); viewer.location({ left: locationSingle.left, top: locationSingle.top }), highlightSearchResult(locationSingle); } function continuousViewNavigate(searchResult, item, pageContainer) { var locationContinuous = searchResult.location ? { left: searchResult.location.left, top: searchResult.location.top + documentViewModel.continuousPage.heightPage() * viewer.pageIndex(), width: searchResult.location.width, height: searchResult.location.height } : getItemLocation(item, pageContainer); viewer.location(locationContinuous), highlightSearchResult(locationContinuous); } function navigateAfterLoadedPage(searchResult, navigate) { if (searchResult.location) navigate(searchResult); else var timerId = setInterval(function() { var pageContainer = viewer.pageDisplayMode() === PageDisplayMode.continuous ? $("#continuousView").find("#page" + searchResult.page) : $("#singleView", pageElement), item = getTextElements(pageContainer, !1)[searchResult.idx]; void 0 !== item && (clearInterval(timerId), navigate(searchResult, item, pageContainer)); }, 200); } function getItemLocation(item, pageContainer) { var location = { left: 0, top: 0, width: 0, height: 0 }; "TD" == item.parentElement.tagName && (item = item.parentElement); var rect = getOffsetRect(item), containerRect = getOffsetRect(pageContainer[0]); return rect.left && (location.left = rect.left - containerRect.left), rect.top && (location.top = rect.top - containerRect.top), location.width = item.offsetWidth, location.height = item.offsetHeight, viewer.pageDisplayMode() === PageDisplayMode.continuous && (location.top += documentViewModel.continuousPage.heightPage() * viewer.pageIndex()), location; } var _searchString = ko.observable(), _matchCase = ko.observable(!1), _wholePhrase = ko.observable(!1), _isReady = ko.observable(), _searchResults = ko.observableArray([]), _hasMore = ko.observable(), _searchEnabled = ko.computed(function() { return _searchString() && viewer.document().state() !== DocumentState.init; }), _lastSearchOptions = null, _found = ko.computed(function() { return _isReady() && _searchResults().length > 0; }), _highlightEnabled = ko.observable(!1), _highlightLeft = ko.observable(0), _highlightTop = ko.observable(0), _highlightWidth = ko.observable(0), _highlightHeight = ko.observable(0), _lastSearchResult = ko.observable(), _pagePadding = 5 * getDpi() / 72, _reset = function() { _isReady(!1), _searchResults([]), _hasMore(!1), highlightSearchResult(!1); }; viewer.document.subscribe(function() { _clear(); }), ko.isObservable(viewer.pageIndex) && viewer.pageIndex.subscribe(function() { viewer.pageDisplayMode() === PageDisplayMode.single && _highlightEnabled(!1); }), documentViewModel.continuousPage.heightPage.subscribe(function() { viewer.pageDisplayMode() === PageDisplayMode.continuous && null !== _lastSearchResult() && _lastSearchResult().page === viewer.pageIndex() && _navigate(_lastSearchResult()); }), viewer.pageDisplayMode.subscribe(function(mode) { _highlightEnabled(!1), mode === PageDisplayMode.single && null !== _lastSearchResult() && _lastSearchResult().page === viewer.pageIndex() && _navigate(_lastSearchResult()); }); var highlightSearchResult = function(location) { return location ? (_highlightLeft(_pagePadding + location.left + "px"), _highlightTop(_pagePadding + location.top + "px"), _highlightWidth(location.width + "px"), _highlightHeight(location.height + "px"), _highlightEnabled(!0), void 0) : void _highlightEnabled(!1); }, searchVisible = ko.computed({ read: function() { var visible = viewer.sidebarState() === SidebarState.Search; return visible || highlightSearchResult(!1), visible; }, write: function(value) { viewer.sidebarState(value ? SidebarState.Search : SidebarState.Hidden); } }); return { visible: searchVisible, get searchString() { return _searchString; }, get searchResults() { return _searchResults; }, get isReady() { return _isReady; }, get matchCase() { return _matchCase; }, get wholePhrase() { return _wholePhrase; }, get hasMore() { return _hasMore; }, get found() { return _found; }, get highlightEnabled() { return _highlightEnabled; }, get highlightLeft() { return _highlightLeft; }, get highlightTop() { return _highlightTop; }, get highlightWidth() { return _highlightWidth; }, get highlightHeight() { return _highlightHeight; }, search: { exec: _search, enabled: _searchEnabled }, keyPressHandler: function(data, event) { return 13 == event.keyCode && _searchEnabled() && _search(), !0; }, navigate: function(searchResult) { _navigate(searchResult); }, navigateAndClose: function(searchResult) { viewer.sidebarState(SidebarState.Hidden), _navigate(searchResult); }, more: function() { _lastSearchOptions.from = _searchResults()[_searchResults().length - 1], viewer.document().search(_lastSearchOptions).done(function(res) { _hasMore(res.hasMore), $.each(res.matches, function(k, v) { _searchResults.push(v); }); }); }, clear: { exec: _clear } }; } function sendEmailDialogViewModel(services, viewer) { function clear() { _errorText(""), errorResponse(""), distribution.To(""), distribution.MessageBody(""), distribution.Subject(""), distribution.asCheck("asattachment"), documentFormat("PDF"); } var _errorText = ko.observable(""), errorResponse = ko.observable(""), getResourceString = services.resourceManager && services.resourceManager.get || identity, distribution = { To: ko.observable(""), Subject: ko.observable(), MessageBody: ko.observable(), asCheck: ko.observable("asattachment") }, sendEnabled = ko.observable(!1); _chekEmails = function() { var res = !0, emails = distribution.To().split(/\s*,\s*/).filter(function(em) { return "" !== em; }); return emails.forEach(function(item) { return "" === item ? res : null !== item && (/^[0-9a-z]+[\w-\.]*\@[0-9a-z-]{1,}(\.[0-9a-z-]{1,}){0,}\.[a-z]{1,}$/i.test(item) || (res = !1), res); }), distribution.To(emails.join(", ")), res; }, distribution.To.subscribe(function() { var er = _chekEmails(); er ? (_errorText(""), sendEnabled(null !== distribution.To() && distribution.To().length > 0 ? !0 : !1)) : (_errorText(getResourceString("error.InvalidEmailFormat")), sendEnabled(!1)); }); var documentFormat = ko.observable("PDF"), sendEmailVisible = ko.computed({ read: function() { return viewer.sidebarState() === SidebarState.Email; }, write: function(value) { viewer.sidebarState(value ? SidebarState.Email : SidebarState.Hidden); } }); return sendEmailVisible.subscribe(function() { clear(); }), { get visible() { return sendEmailVisible; }, get distribution() { return distribution; }, get documentFormat() { return documentFormat; }, get availableFormats() { return availableFormats; }, get errorText() { return _errorText; }, get sendEnabled() { return sendEnabled; }, get errorResponse() { return errorResponse; }, clear: clear }; } function SinglePageViewModel(viewer) { function getPageContent() { var returnPageIndex = viewer.pageIndex(); viewer.document().getPage(returnPageIndex).done(function(x) { if (returnPageIndex == viewer.pageIndex()) return _pageContent(x); }); } var _pageContent = ko.observable(); return viewer.pageDisplayMode.subscribe(function() { _pageContent(null); }), viewer.pageIndex.subscribe(function() { viewer.pageDisplayMode() === PageDisplayMode.single && getPageContent(); }), { get pageContent() { return _pageContent; }, getPageContent: getPageContent }; } function Templates(baseUri, resourceManager) { function get(name) { name = name.toLowerCase(); var template = cache[name]; if (template) return promise(template); var localName = name; return load(name).pipe(preprocess).pipe(function(html) { return cache[localName] = html, html; }); } function getSync(name) { var result = ""; return get(name).done(function(html) { return result = html, html; }), result; } function load(name) { var template = templates[name]; if (template) return promise(template); var url = templateDir + name + ".html"; return $.ajax({ url: url, async: !1, dataType: "text" }); } function preprocess(html) { return html = html.replace(/@include\s+"(\w+)"/g, function(match, name) { return getSync(name); }), html.replace(/%([\w_\.\-]+)%/g, function(match, key) { return resourceManager.get(key) || key; }); } function promise(value) { return $.Deferred(function(d) { d.resolve(value); }).promise(); } baseUri.endsWith("/") || (baseUri += "/"); var templateDir = baseUri + "ui/", templates = {}, cache = {}; return templates.custom = '<div class="ar-viewer custom" style="width: 100%; height: 100%">\n\t@include "reportView"\n</div>', templates.desktop = '<div class="ar-viewer desktop" style="width: 100%; height: 100%" data-bind="resizeViewerBody: {}">\n\t<!-- toolbar -->\n\t<div class="btn-toolbar toolbar toolbar-top">\n\t\t<div class="btn-group btn-group-sm">\t\t\t\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.sidebar" title="%sidebar%">\n\t\t\t\t<span class="glyphicon glyphicon-list-alt" />\n\t\t\t</button>\t\t\t\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.search" title="%search%">\n\t\t\t\t<span class="glyphicon glyphicon-search" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.firstPage" title="%firstPage%">\n\t\t\t\t<span class="glyphicon glyphicon-step-backward" />\n\t\t\t</button>\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.prevPage" title="%prevPage%">\n\t\t\t\t<span class="glyphicon icon-large glyphicon-chevron-left" />\n\t\t\t</button>\n\t\t\t<div class="navbar-left input-group-sm">\n\t\t\t\t<input class="form-control" type="text" data-bind="valueEdit: toolbar.pageNumber, enable: toolbar.pageNumberEnabled" />\n\t\t\t</div>\n\t\t\t<button class="btn btn-default" data-bind="\tcommand: toolbar.nextPage" title="%nextPage%">\n\t\t\t\t<span class="glyphicon icon-large glyphicon-chevron-right" />\n\t\t\t</button>\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.lastPage" title="%lastPage%">\n\t\t\t\t<span class="glyphicon icon-large glyphicon-step-forward" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button id="backToParent" class="btn btn-default" data-bind="command: toolbar.backToParent" title="%backToParent%">\n\t\t\t\t<span class="glyphicon glyphicon-share-alt mirror-by-x" />\n\t\t\t</button>\n\t\t</div>\n\t\t\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.print" title="%print%">\n\t\t\t\t<span class="glyphicon glyphicon-print" />\n\t\t\t</button>\n\t\t</div>\n\t\t\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button id="renderMode" class="btn btn-default" title="%renderMode%" data-bind="command: toolbar.renderMode, css: { active: toolbar.renderModeState() == \'Galley\'}" >\n\t\t\t\t<span class="glyphicon glyphicon-share" />\n\t\t\t</button>\n\t\t</div>\n\t\t\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button id="single" class="btn btn-default" title="%SinglePageView%" data-bind="command: toolbar.singlePageView, css: { active: toolbar.pageViewMode === \'single\' }">\n\t\t\t\t<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1.4em" height="1.4em" viewBox="0 0 14 14">\n\t\t\t\t\t<path fill="currentColor" d="M9.491,3.333C9.496,3.349,9.5,3.37,9.5,3.394v1.211c0,0.025-0.004,0.046-0.009,0.062H4.509\n\t\t\t\t\t\tC4.504,4.65,4.5,4.63,4.5,4.604V3.394c0-0.023,0.004-0.045,0.009-0.061H9.491 M3,2v4h8V2H3z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M13,7.5h-2v-1h2V7.5z M10.5,7.5h-2v-1h2V7.5z M8,7.5H6v-1h2V7.5z\n\t\t\t\t\t\tM5.5,7.5h-2v-1h2V7.5z M3,7.5H1v-1h2V7.5z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M9.491,9.333C9.496,9.349,9.5,9.37,9.5,9.394v1.211c0,0.025-0.004,0.046-0.009,0.062H4.509\n\t\t\t\t\t\tC4.504,10.65,4.5,10.63,4.5,10.604V9.394c0-0.023,0.004-0.045,0.009-0.061H9.491 M3,8v4h8V8H3z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t<button id="continuous" class="btn btn-default" title="%ContinuousPageView%" data-bind="command: toolbar.continuousPageView, css: { active: toolbar.pageViewMode === \'continuous\' }">\n\t\t\t\t<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1.4em" height="1.4em" viewBox="0 0 14 14">\n\t\t\t\t\t<path fill="currentColor" d="M9.991,3.5C9.996,3.518,10,3.541,10,3.568v6.864c0,0.026-0.004,0.051-0.009,0.067H4.009\n\t\t\t\t\t\tC4.004,10.482,4,10.459,4,10.432V3.568C4,3.541,4.004,3.518,4.009,3.5H9.991 M10.605,2H3.395C2.9,2,2.5,2.479,2.5,3.068v7.864\n\t\t\t\t\t\tC2.5,11.521,2.9,12,3.395,12h7.211c0.494,0,0.895-0.479,0.895-1.068V3.068C11.5,2.479,11.1,2,10.605,2L10.605,2z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M5.5,7.5c-0.13,0-0.26-0.05-0.35-0.15C5.05,7.26,5,7.13,5,7s0.05-0.26,0.141-0.35\n\t\t\t\t\t\tc0.199-0.2,0.529-0.19,0.719,0C5.95,6.74,6,6.87,6,7S5.95,7.26,5.85,7.35C5.76,7.45,5.63,7.5,5.5,7.5z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M7,7.5c-0.13,0-0.26-0.05-0.35-0.15C6.55,7.26,6.5,7.13,6.5,7s0.05-0.26,0.15-0.35\n\t\t\t\t\t\tc0.18-0.19,0.52-0.19,0.699,0C7.45,6.74,7.5,6.87,7.5,7S7.45,7.26,7.35,7.35C7.26,7.45,7.13,7.5,7,7.5z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M8.5,7.5c-0.13,0-0.26-0.05-0.352-0.141C8.05,7.26,8,7.13,8,7s0.05-0.26,0.148-0.35\n\t\t\t\t\t\tC8.33,6.46,8.66,6.46,8.85,6.641C8.95,6.74,9,6.87,9,7S8.95,7.26,8.85,7.35C8.76,7.45,8.63,7.5,8.5,7.5z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t</div>\n\t\t\n\t\t<div class="btn-group btn-group-sm" data-bind="visible: toolbar.exportsAreAvailable">\n\t\t\t<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" data-bind="enable: toolbar.canExport">\n\t\t\t\t<span class="loader" data-bind="visible: toolbar.isExportProcessing" role="status" />\n\t\t\t\t%saveas%<span class="caret"></span>\n\t\t\t</button>\n\t\t\t<ul class="dropdown-menu" role="menu">\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Pdf\'), attr: { hidden: !toolbar.exportToAvailable(\'Pdf\') } "><a href="#" >%pdfDocument%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Word\'), attr: { hidden: !toolbar.exportToAvailable(\'Word\') } "><a href="#" >%wordDocument%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Docx\'), attr: { hidden: !toolbar.exportToAvailable(\'Docx\') }"><a href="#">%docxDocument%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Image\'), attr: { hidden: !toolbar.exportToAvailable(\'Image\') }"><a href="#" >%imageFile%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Html\'), attr: { hidden: !toolbar.exportToAvailable(\'Html\') }"><a href="#" >%mhtDocument%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Xls\'), attr: { hidden: !toolbar.exportToAvailable(\'Xls\') }"><a href="#" >%excelWorkbook%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Csv\'), attr: { hidden: !toolbar.exportToAvailable(\'Csv\') }"><a href="#" >%csvFile%</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button class="btn btn-default" id="sendemail-btn" data-target="#sendemaildialog" data-toggle="modal" data-bind="enable: toolbar.canExport, visible: canSendEmail(), click: function() {sendEmailDialog.clear()}">\n\t\t\t\t%email%\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class="flex-group">\n\t\t\t<button id="cancelRender" class="btn btn-secondary btn-sm pull-right" title="%CancelRendering%" data-bind="command: toolbar.cancelRendering">\n\t\t\t\t<span>%CancelRendering%</span>\n\t\t\t\t<span class="glyphicon glyphicon-remove-circle info" />\n\t\t\t</button>\n\n\t\t\t<button id="renderFullReport" class="btn btn-secondary btn-sm pull-right" title="%PartialData%" data-bind="command: toolbar.renderFullReport">\n\t\t\t\t<span>%RunFullReport%</span>\n\t\t\t\t<span class="glyphicon glyphicon-play" />\n\t\t\t</button>\n\t\t</div>\n\n\t</div>\n\n\t<div class="viewer-body" style="width: 100%">\n\t\t<!-- sidebar -->\n\t\t<div class="sidebar" data-bind="visible: sidebarState() != \'Hidden\', showSidebar: sidebarState() != \'Hidden\'">\n\t\t\t<ul class="nav nav-tabs">\n\t\t\t\t<li data-bind="visible: hasToc, css: { \'active\': sidebarState() === \'TOC\' }"><a href="#gc-viewer-tab-toc" data-toggle="tab" data-bind="\tclick: function () { setSidebarState(\'TOC\') }">%toc%</a></li>\n <li data-bind="visible: hasParameters, css: { \'active\': sidebarState() === \'Parameters\' }"><a href="#gc-viewer-tab-params" data-toggle="tab" data-bind="click: function () { setSidebarState(\'Parameters\') }">%params%</a></li>\n\t\t\t\t<li data-bind="css: { \'active\': sidebarState() === \'Search\' }" ><a href="#gc-viewer-tab-search" data-toggle="tab" data-bind="\tclick: function () { setSidebarState(\'Search\') }">%search%</a></li>\n\t\t\t</ul>\n\t\t\t<div class="tab-content" style="width: 100%" data-bind="activeTab: sidebarState">\n\t\t\t\t<div id="gc-viewer-tab-toc" class="tab-pane toc-container" data-tab-name="TOC" data-bind="visible: hasToc">\n\t\t\t\t\t@include "tocPane"\n\t\t\t\t</div>\n\t\t\t\t<div id="gc-viewer-tab-params" class="tab-pane" data-tab-name="Parameters" data-bind="visible: hasParameters, spin: document.parameterValidation">\n\t\t\t\t\t@include "parametersPane"\n\t\t\t\t</div>\n\t\t\t\t<div id="gc-viewer-tab-search" class="tab-pane" data-tab-name="Search">\n\t\t\t\t\t@include "searchPane"\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t@include "reportView"\n\t</div>\n <div id="sendemaildialog" class="modal fade" role="dialog">\n @include "SendEmailDialog"\n </div>\n</div>', templates.errorpanel = '<!-- error panel for desktop mode data is bound to ViewerViewModel -->\n\n<div id="gcv-errorpane" class="errorpane alert alert-danger" data-bind="visible: errorPane.visible, with: errorPane">\n\t<div data-bind="visible: !showErrorInfo()">\n\t\t\n\t\t<button id="gcv-details" type="button" class="btn btn-sm btn-danger pull-right"\n\t\t data-bind="click: function () { showErrorInfo(true); }, visible: !showOnlyLastError" >\n\t\t\t<span>%errorPane.Details%</span>\n\t\t</button>\n\t\t\n\t\t<span class="glyphicon glyphicon-warning-sign"></span>\n\t\t<span id="gcv-lasterror" data-bind="text: lastError"></span>\n\t\t<span class="badge" data-bind="text: errors().length > 1 ? errors().length : \'\'"></span>\n\n\t\t<button id="placeholder" type="button" class="btn btn-sm" style="visibility: hidden;"> </button>\n\t</div>\n\t\t\n\t<!-- Extended error info -->\n\t<div id="gcv-exterrinfo" data-bind="visible: showErrorInfo" style="overflow-y: auto; max-height: 200pt;">\n\t\t<button id="gcv-hidedetails" type="button" class="btn btn-sm btn-danger pull-right" data-bind="click: function () { showErrorInfo(false); }" >\n\t\t\t<span>%errorPane.HideDetails%</span>\n\t\t</button>\n\t\t\n\t\t<span class="glyphicon glyphicon-warning-sign"></span>\n\t\t<span>%errorPane.ErrorPaneTitle%</span>\n\t\t\t\n\t\t<ul data-bind="foreach: errors">\n\t\t\t<li data-bind="text: $data"></li>\n\t\t</ul>\n\n\t\t<div style="text-align: right">\n\t\t\t<button id="gcv-dismissall" type="button" class="btn btn-default btn-sm" data-bind="click: dismissErrors">\n\t\t\t\t<span>%errorPane.DismissAll%</span>\n\t\t\t</button>\n\t\t</div>\n\t\t\n\t</div>\n</div>', templates.mobile = '<div class="ar-viewer mobile" style="width: 100%; height: 100%; position: relative" data-bind="resizeViewerBody: {}">\n\t\n\t<!-- top toolbar -->\n\t<div class="btn-toolbar toolbar toolbar-top" style="width: 100%;">\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.toc" title="%toc%">\n\t\t\t\t<span class="glyphicon glyphicon-align-justify" />\n\t\t\t</button>\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.params" title="%params%" >\n\t\t\t\t<span class="glyphicon glyphicon-cog" />\n\t\t\t</button>\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.search" title="%search%">\n\t\t\t\t<span class="glyphicon glyphicon-search" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button id="renderMode" class="btn btn-default" title="%renderMode%" data-bind="command: toolbar.renderMode, css: { active: toolbar.renderModeState() == \'Galley\' }" >\n\t\t\t\t<span class="glyphicon glyphicon-share" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button id="single" class="btn btn-default" title="%SinglePageView%" data-bind="command: toolbar.singlePageView, css: { active: toolbar.pageViewMode === \'single\' }">\n\t\t\t\t<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1.4em" height="1.4em" viewBox="0 0 14 14">\n\t\t\t\t\t<path fill="currentColor" d="M9.491,3.333C9.496,3.349,9.5,3.37,9.5,3.394v1.211c0,0.025-0.004,0.046-0.009,0.062H4.509\n\t\t\t\t\t\tC4.504,4.65,4.5,4.63,4.5,4.604V3.394c0-0.023,0.004-0.045,0.009-0.061H9.491 M3,2v4h8V2H3z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M13,7.5h-2v-1h2V7.5z M10.5,7.5h-2v-1h2V7.5z M8,7.5H6v-1h2V7.5z\n\t\t\t\t\t\tM5.5,7.5h-2v-1h2V7.5z M3,7.5H1v-1h2V7.5z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M9.491,9.333C9.496,9.349,9.5,9.37,9.5,9.394v1.211c0,0.025-0.004,0.046-0.009,0.062H4.509\n\t\t\t\t\t\tC4.504,10.65,4.5,10.63,4.5,10.604V9.394c0-0.023,0.004-0.045,0.009-0.061H9.491 M3,8v4h8V8H3z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t<button id="continuous" class="btn btn-default" title="%ContinuousPageView%" data-bind="command: toolbar.continuousPageView, css: { active: toolbar.pageViewMode === \'continuous\' }">\n\t\t\t\t<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1.4em" height="1.4em" viewBox="0 0 14 14">\n\t\t\t\t\t<path fill="currentColor" d="M9.991,3.5C9.996,3.518,10,3.541,10,3.568v6.864c0,0.026-0.004,0.051-0.009,0.067H4.009\n\t\t\t\t\t\tC4.004,10.482,4,10.459,4,10.432V3.568C4,3.541,4.004,3.518,4.009,3.5H9.991 M10.605,2H3.395C2.9,2,2.5,2.479,2.5,3.068v7.864\n\t\t\t\t\t\tC2.5,11.521,2.9,12,3.395,12h7.211c0.494,0,0.895-0.479,0.895-1.068V3.068C11.5,2.479,11.1,2,10.605,2L10.605,2z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M5.5,7.5c-0.13,0-0.26-0.05-0.35-0.15C5.05,7.26,5,7.13,5,7s0.05-0.26,0.141-0.35\n\t\t\t\t\t\tc0.199-0.2,0.529-0.19,0.719,0C5.95,6.74,6,6.87,6,7S5.95,7.26,5.85,7.35C5.76,7.45,5.63,7.5,5.5,7.5z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M7,7.5c-0.13,0-0.26-0.05-0.35-0.15C6.55,7.26,6.5,7.13,6.5,7s0.05-0.26,0.15-0.35\n\t\t\t\t\t\tc0.18-0.19,0.52-0.19,0.699,0C7.45,6.74,7.5,6.87,7.5,7S7.45,7.26,7.35,7.35C7.26,7.45,7.13,7.5,7,7.5z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t\t<path fill="currentColor" d="M8.5,7.5c-0.13,0-0.26-0.05-0.352-0.141C8.05,7.26,8,7.13,8,7s0.05-0.26,0.148-0.35\n\t\t\t\t\t\tC8.33,6.46,8.66,6.46,8.85,6.641C8.95,6.74,9,6.87,9,7S8.95,7.26,8.85,7.35C8.76,7.45,8.63,7.5,8.5,7.5z" shape-rendering="geometricPrecision">\n\t\t\t\t\t</path>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class="btn-group btn-group-sm" data-bind="visible: toolbar.exportsAreAvailable">\n\t\t\t<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" data-bind="enable: toolbar.canExport" title="%saveas%">\n\t\t\t\t<span class="loader" data-bind="visible: toolbar.isExportProcessing" role="status" />\n\t\t\t\t<span class="glyphicon glyphicon-export" />\n\t\t\t</button>\n\t\t\t<ul class="dropdown-menu" role="menu">\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Pdf\'), attr: { hidden: !toolbar.exportToAvailable(\'Pdf\') } "><a href="#" >%pdfDocument%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Word\'), attr: { hidden: !toolbar.exportToAvailable(\'Word\') } "><a href="#" >%wordDocument%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Docx\'), attr: { hidden: !toolbar.exportToAvailable(\'Docx\') }"><a href="#">%docxDocument%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Image\'), attr: { hidden: !toolbar.exportToAvailable(\'Image\') }"><a href="#" >%imageFile%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Html\'), attr: { hidden: !toolbar.exportToAvailable(\'Html\') }"><a href="#" >%mhtDocument%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Xls\'), attr: { hidden: !toolbar.exportToAvailable(\'Xls\') }"><a href="#" >%excelWorkbook%</a></li>\n\t\t\t\t<li data-bind="command: toolbar.exportTo(\'Csv\'), attr: { hidden: !toolbar.exportToAvailable(\'Csv\') }"><a href="#" >%csvFile%</a></li>\n\t\t\t</ul>\n\t\t</div>\n <div class="btn-group btn-group-sm">\n <button class="btn btn-default" id="sendemail-btn" data-target="#sendemaildialog" data-toggle="modal" data-bind="command: toolbar.email, visible: canSendEmail()" title="%email%">\n <span class="glyphicon glyphicon-envelope" />\n </button>\n </div>\n\t</div>\n\t\n\t<div class="viewer-body" style="width: 100%;">\n\t\t@include "reportView"\n\t</div>\n\t\n\t<div class="panelsSite" data-bind="showPanelsSite: searchPane.visible() || tocPane.visible() || parametersPane.visible()">\n\t\t@include "mtocPane"\n\t\t@include "msearchPane"\n\t\t@include "mparametersPane"\n\t\t@include "msendEmailDialog"\n\t</div>\n\n\t<!-- bottom toolbar -->\n\t<div class="btn-toolbar toolbar toolbar-bottom" style="width: 100%;">\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.prevPage" title="%prevPage%">\n\t\t\t\t<span class="glyphicon glyphicon-circle-arrow-left" />\n\t\t\t</button>\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.nextPage" title="%nextPage%">\n\t\t\t\t<span class="glyphicon glyphicon-circle-arrow-right" />\n\t\t\t</button>\n\t\t</div>\n\t\t\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<div class="navbar-left input-group-sm">\n\t\t\t\t<input class="form-control form-control-sm" type="text" data-bind="valueEdit: toolbar.pageNumber, enable: toolbar.pageNumberEnabled" tabindex="-1" />\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class="btn-group btn-group-sm">\n\t\t\t<button class="btn btn-default" data-bind="command: toolbar.backToParent" title="%backToParent%">\n\t\t\t\t<span class="glyphicon glyphicon-share-alt mirror-by-x" />\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class="flex-group">\n\t\t\t<div class="btn-group btn-group-sm pull-right">\n\t\t\t\t<button id="cancelRender" class="btn btn-secondary" title="%CancelRendering%" data-bind="command: toolbar.cancelRendering">\n\t\t\t\t\t<span class="glyphicon glyphicon-remove" />\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="btn-group btn-group-sm pull-right">\n\t\t\t\t<button id="renderFullReport" class="btn btn-secondary" title="%RunFullReport%" data-bind="command: toolbar.renderFullReport">\n\t\t\t\t\t<span class="glyphicon glyphicon-play" />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\n\t</div>\n</div>\n', templates.mparameternullswitch = '<!-- ko if: nullable -->\t\n<div style="margin-top: 5pt">\n\t<label>%null-label%</label>\n\t<div class="make-switch" style="vertical-align: middle" data-bind="bootstrapSwitch: isValueNull"\n\t\t\tdata-on-label="%yes%" data-off-label="%no%">\n\t\t<input type="checkbox">\n\t</div>\n</div>\n<!-- /ko -->\n', templates.mparameterspane = '<!-- parameters pane for mobile layout -->\n<div id="parametersPane" class="panel panel-default overlay" data-bind="showPanel: parametersPane.visible, spin: document.parameterValidation">\n\t<div class="panel-heading" style="text-align: center">\n\t\t<button type="button" class="close">×</button>\n\t\t<h2 class="panel-title">%params%</h2>\n\t</div>\n\t<div class="panel-body">\n\t\t<div class="params-pane" data-bind="foreach: parametersPane.parameters">\n\t\t\t\t<h5 data-bind="text: prompt" />\n\n\t\t\t\t<div class="param-value truncatedString well well-sm"\n\t\t\t\t\t data-bind="css: { \'has-error\': errorText().length > 0 }, attr: {pname: name},\n\tshowEditor: { template: \'parameter-editor-template\', placeholder: $($element).closest(\'.ar-viewer\').find(\'#paramEditorHere\'), enable: enabled, visible: enabled && $parent.visible, onClose: function (v) { $updateValuesFromModel(v); } }">\n\t\t\t\t\t<i class="glyphicon glyphicon-play pull-right" data-bind="visible: enabled"></i>\n\t\t\t\t\t<span data-bind="text: nullable && value() == null ? \'%null%\' : stringValue"></span> \n\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t<div style="color: red" data-bind="visible: errorText().length > 0">\n\t\t\t\t\t<span class="glyphicon glyphicon-exclamation-sign" />\n\t\t\t\t\t<span data-bind="text: errorText" style="font-size: small" />\n\t\t\t\t</div>\n\t\t</div>\n\n\t\t<button id="refresh-button" class="btn btn-block btn-default btn-primary" data-bind="command: parametersPane.refreshReportAndClose">\n\t\t\t%refreshReport%\n\t\t</button>\n\t</div>\n</div>\n\n<div id="paramEditorHere" />\n\n<!-- single parameter editor form for mobile target platform -->\n<script type="text/html" id="parameter-editor-template">\n\t<div class="panel panel-default overlay" style="z-index: 11;">\n\t\t<div class="panel-heading" style="text-align: center; vertical-align: middle">\n\t\t\t<button type="button" class="btn close-onclick btn-default btn-sm pull-left">\n\t\t\t\t<i class="glyphicon glyphicon-arrow-left" />\n\t\t\t</button>\n\t\t\t<button type="button" class="close">×</button>\n\t\t\t<span class="panel-title" data-bind="text: prompt"></span>\n\t\t</div>\n\t\t<div class="panel-body">\n\t\t\t<!-- ko if: editor() == \'SingleValue\' -->\n\t\t\t<!-- ko if: type == \'bool\' -->\t\t\n\t\t\t<ul class="list-group">\n\t\t\t\t<li class="list-group-item close-onclick" data-bind="click: function () { value(true); }">%true%\n\t\t\t\t\t<i class="glyphicon glyphicon-ok pull-right" data-bind="visible: value"></i>\n\t\t\t\t</li>\n\t\t\t\t<li class="list-group-item close-onclick" data-bind="click: function () { value(false); }">%false%\n\t\t\t\t\t<i class="glyphicon glyphicon-ok pull-right" data-bind="visible: value() === false"></i>\n\t\t\t\t</li>\n\t\t\t\t<!-- ko if: nullable -->\n\t\t\t\t<li class="list-group-item close-onclick" data-bind="click: function () { isValueNull(true); }">%null%\n\t\t\t\t\t<i class="glyphicon glyphicon-ok pull-right" data-bind="visible: isValueNull"></i>\n\t\t\t\t</li>\n\t\t\t\t<!-- /ko -->\n\t\t\t</ul>\n\t\t\t<!-- /ko -->\n\n\t\t\t<!-- ko if: (type == \'datetime\' && dateOnly == true) -->\n\t\t\t<input type="date" class="form-control" data-date-format="yyyy-mm-dd" data-bind="value: datePickerValue, attr: { pname: name }" />\n\t\t\t<!-- /ko -->\n\t\t\t<!-- ko if: (type == \'datetime\' && dateOnly == false) -->\n\t\t\t<input type="datetime-local" step="1" class="form-control" data-date-format="yyyy-mm-dd hh:ii:ss" data-bind="value: datePickerValue, attr: { pname: name }" />\n\t\t\t<!-- /ko -->\n\n\t\t\t<!-- ko if: !(type == \'datetime\' || type == \'bool\') -->\n\t\t\t<input type="text" class="form-control" data-bind="value: stringValue, attr: { pname: name }" />\n\t\t\t<!-- /ko -->\n\n\t\t\t<!-- ko if: type != \'bool\' && nullable -->\t\n\t\t\t@include "mparameterNullSwitch"\n\t\t\t<!-- /ko -->\n\n\t\t\t<!-- /ko -->\n\t\t\t\n\t\t\t<!-- ko if: editor() == \'SelectOneFromMany\' -->\n\t\t\t<ul class="list-group" data-bind="foreach: options">\n\t\t\t\t<li class="list-group-item close-onclick" data-bind="click: function () { $parent.value(value); }">\n\t\t\t\t\t<span data-bind="text: label"></span>\n\t\t\t\t\t<i class="glyphicon glyphicon-ok pull-right" data-bind="visible: selected"></i>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<!-- /ko -->\n\t\t\t\n\t\t\t<!-- ko if: editor() == \'MultiValue\' -->\n\t\t\t<ul class="list-group">\n\t\t\t\t<!-- ko foreach: options -->\t\n\t\t\t\t<li class="list-group-item" data-bind="click: function() { selected(!selected()); }">\n\t\t\t\t\t<span data-bind="text: label"></span>\n\t\t\t\t\t<i class="glyphicon glyphicon-ok pull-right" data-bind="visible: selected"></i>\n\t\t\t\t</li>\n\t\t\t\t<!-- /ko -->\n\t\t\t\t\n\t\t\t\t<!-- TODO should be \'nullable\' but this does not work yet as server tells parameter is not nullable RdlxReportParameter.Nullable impl -->\n\t\t\t\t<!-- ko if: true -->\t\n\t\t\t\t<li class="list-group-item" data-bind="click: function () { clearOptions(); }">\n\t\t\t\t\t%clearAllOptions%\n\t\t\t\t</li>\n\t\t\t\t<!-- /ko -->\n\t\t\t</ul>\n\n\t\t\t<!-- /ko -->\n\t\t\n\t\t\t<!-- ko if: editor() == \'MultiLine\' -->\n\t\t\t<textarea rows="5" class="form-control" data-bind="value: stringValue, enable: enabled, attr: { pname: name }" />\n\t\t\t@include "mparameterNullSwitch"\n\t\t\t<!-- /ko -->\n\t\t\n\t\t\t<div style="color: red" data-bind="visible: errorText().length > 0">\n\t\t\t\t<span class="glyphicon glyphicon-exclamation-sign" />\n\t\t\t\t<span data-bind="text: errorText" style="font-size: small" />\n\t\t\t</div>\n\n\t\t</div>\n\t</div>\n</script>', templates.msearchpane = '<!-- template for search result item -->\n<div class="panel panel-default overlay" data-bind="showPanel: searchPane.visible">\n\t<div class="panel-heading" style="text-align: center">\n\t\t<button type="button" class="close">×</button>\n\t\t<h2 class="panel-title">%search%</h2>\n\t</div>\n\t<div class="panel-body" data-bind="with: searchPane">\n\t\t<div class="form-horizontal">\n\t\t\t<input type="search" class="form-control" data-bind="value: searchString, valueUpdate: \'input\', event: { keypress: keyPressHandler }" />\n\t\t\t<div class="form-group" style="margin: 4pt 4pt 0 4pt">\n\t\t\t\t<label for="matchCase" class="control-label" style="vertical-align: middle">%matchCase%</label>\n\t\t\t\t<div class="make-switch pull-right" data-bind="bootstrapSwitch: matchCase"\n\t\t\t\t data-on-label="%on%" data-off-label="%off%">\n\t\t\t\t\t<input type="checkbox" id="matchCase"/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="form-group" style="margin: 4pt 4pt 0 4pt">\n\t\t\t\t<label for="whole" class="control-label" style="vertical-align: middle">%wholePhrase%</label>\n\t\t\t\t<div class="make-switch pull-right" data-bind="bootstrapSwitch: wholePhrase"\n\t\t\t\t data-on-label="%on%" data-off-label="%off%">\n\t\t\t\t\t<input type="checkbox" id="whole"/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<button class="btn btn-default btn-primary btn-block" data-bind="command: search" style="margin-top: 5pt">%search%</button>\n\t\t\t<!-- ko if: isReady -->\n\t\t\t<!-- ko if: found -->\n\t\t\t<ul class="list-group toc" data-bind="foreach: searchResults" style="margin-top: 5pt">\n\t\t\t\t<li class="list-group-item">\n\t\t\t\t\t<div data-bind="click: $parent.navigateAndClose" class="truncatedString">\n\t\t\t\t\t\t<i class="glyphicon glyphicon-chevron-right pull-right"></i>\n\t\t\t\t\t\t<a data-bind="text: text" href="#"/>\n\t\t\t\t\t</div>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<button class="btn" data-bind="click: more, visible: hasMore">%more%</button>\n\t\t\t<!-- /ko-->\n\t\t\t<!-- ko ifnot: found -->\n\t\t\t<span>%noResults%</span>\n\t\t\t<!-- /ko-->\n\t\t\t<!-- /ko -->\n\t\t</div>\n\t</div>\n</div>', templates.msendemaildialog = '<div class="panel panel-default overlay" data-bind="showPanel: sendEmailDialog.visible">\n <div class="panel-heading" style="text-align: center">\n <button type="button" class="close">×</button>\n <h2 class="panel-title">%sendEmailTitle%</h2>\n </div>\n <div class="panel-body" data-bind="with: sendEmailDialog">\n <div class="form-horizontal">\n <form data-bind="submit: $root.sendEmail">\n <div style="margin-top: 5pt">\n <label class="control-label">%sendEmailTo%</label>\n <input id="email-input" class="form-control" type="text" data-bind="value: distribution.To" />\n </div>\n <div style="color: red" data-bind="visible: errorText().length > 0">\n <span class="glyphicon glyphicon-exclamation-sign" />\n <span data-bind="text: errorText" style="font-size: small" />\n </div>\n <div style="margin-top: 5pt">\n <label class="control-label">%emailSubject%</label>\n <input class="form-control" type="text" data-bind="value: distribution.Subject, valueUpdate: \'input\'" />\n </div>\n <div style="margin-top: 5pt">\n <label class="control-label">%emailMessage%</label>\n <textarea rows="5" class="form-control" data-bind="value: distribution.MessageBody, valueUpdate: \'input\'"></textarea>\n </div>\n <div style="margin-top: 5pt">\n <label class="control-label">%documentFormat%</label>\n\t <select class="btn btn-default dropdown-toggle form-control" data-bind="value: documentFormat">\n\t\t\t\t\t\t<option value="PDF">%docformat.pdf%</option>\n\t\t\t\t\t\t<option value="Excel">%docformat.excel%</option>\n\t\t\t\t\t\t<option value="Mht">%docformat.mht%</option>\n\t\t\t\t\t\t<option value="Image">%docformat.image%</option>\n\t\t\t\t\t\t<option value="Word">%docformat.word%</option>\n\t\t\t\t\t\t<option value="XML">%docformat.xml%</option>\n <option value="CSV">%docformat.csv%</option>\n\t </select>\n </div>\n <div style="margin-top: 5pt">\n <div>\n <label class="control-label">%deliveryMethodCaption%</label>\n </div>\n <label class="radio-inline">\n <input type="radio" name="sendtype" value="aslink" data-bind="checked: distribution.asCheck" />%asLink%\n </label>\n <label class="radio-inline">\n <input type="radio" name="sendtype" value="asattachment" data-bind="checked: distribution.asCheck" />%asAttachment%\n </label>\n </div>\n <div id="errorResponse" class="errorpane alert alert-danger" data-bind="visible: errorResponse().length>0">\n <span class="glyphicon glyphicon-exclamation-sign" />\n <span data-bind="text: errorResponse" style="font-size: small" />\n </div>\n <button class="btn btn-default btn-primary btn-block" type="submit" style="margin-top: 15pt" data-bind="enable: sendEnabled">%sendEmail%</button>\n </form>\n </div>\n </div>\n</div>', templates.mtocpane = '<div class="panel panel-default overlay" data-bind="showPanel: tocPane.visible">\n\t<div class="panel-heading">\n\t\t<div class="btn-toolbar" style="text-align: center">\n\t\t\t<button type="button" class="close" data-bind="click: function() { tocPane.reset(); tocPane.visible(false); }">×</button>\n\t\t\t<a class="btn btn-default pull-left" title="%back%" data-bind="command: tocPane.back, visible: tocPane.back.enabled()">\n\t\t\t\t<i class="glyphicon glyphicon-arrow-left" />\n\t\t\t</a>\n\t\t\t<span class="panel-title">%tocfull%</span>\n\t\t</div>\n\t</div>\n\t<div class="panel-body" data-bind="with: tocPane.selectedNode">\n\t\t<ul class="list-group toc" data-bind="foreach: kids">\n\t\t\t<li class="list-group-item">\n\t\t\t\t<div class="truncatedString" style="min-height: 1.2em" data-bind="click: function () { $root.tocPane.navigateAndClose($data); }">\n\t\t\t\t\t<i class="glyphicon glyphicon-chevron-right pull-right"\n\t\t\t\t\t\tdata-bind="visible: !isLeaf, click: function(data, e) { e.stopImmediatePropagation(); $root.tocPane.select($data); }"></i>\n\t\t\t\t\t<a data-bind="text: name" />\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</div>\n', templates.parameterspane = '<!-- parameters pane for desktop layout -->\n<div class="panel-body" style="min-width: 120px">\n\n\t<div data-bind="foreach: parametersPane.parameters">\n\t\t<div style="margin-bottom: 10px;">\n\t\t\t<label data-bind="text: prompt, tooltip: name"></label>\n\n\t\t\t<div class="param-value" data-bind="css: { \'has-error\': errorText().length > 0 }, attr: { pname: name }">\n\t\t\t\t<!-- ko if: editor() == \'SingleValue\' -->\n\t\t\t\t<!-- ko if: type == \'bool\' -->\n\t\t\t\t<label class="radio-inline" data-bind="style:{ \'margin-bottom\': type == \'bool\' ? \'5px\' : \'\'}">\n\t\t\t\t\t<input type="radio" value="true" data-bind="checked: stringValue, enable: enabled" />%true%</label>\n\t\t\t\t<label class="radio-inline" data-bind="style:{ \'margin-bottom\': type == \'bool\' ? \'5px\' : \'\'}">\n\t\t\t\t\t<input type="radio" value="false" data-bind="checked: stringValue, enable: enabled" />%false%</label>\n\t\t\t\t<!-- /ko -->\n\t\t\t\t<!-- ko if: (type == \'datetime\' && dateOnly == true) -->\n\t\t\t\t<input type="date" class="form-control" data-date-format="yyyy-mm-dd" data-bind="value: datePickerValue, enable: enabled" />\n\t\t\t\t<!-- /ko -->\n\t\t\t\t<!-- ko if: (type == \'datetime\' && dateOnly == false) -->\n\t\t\t\t<input type="datetime-local" step="1" class="form-control" data-date-format="yyyy-mm-dd hh:ii:ss" data-bind="value: datePickerValue, enable: enabled" />\n\t\t\t\t<!-- /ko -->\n\t\t\t\t<!-- ko if: !(type == \'datetime\' || type == \'bool\') -->\n\t\t\t\t<input type="text" class="form-control" data-bind="value: stringValue, enable: enabled" />\n\t\t\t\t<!-- /ko -->\n\t\t\t\t<!-- /ko -->\n\n\t\t\t\t<!-- ko if: editor() == \'MultiLine\' -->\n\t\t\t\t<textarea rows="5" class="form-control" data-bind="value: stringValue, enable: enabled" />\n\t\t\t\t<!-- /ko -->\n\n\t\t\t\t<!-- ko if: editor() == \'SelectOneFromMany\' -->\n\t\t\t\t<div class="dropdown">\n\t\t\t\t\t<a data-toggle="dropdown" class="dropdown-toggle form-control btn btn-default" style="text-align: left" data-bind="active: enabled">\n\t\t\t\t\t\t<i class="glyphicon glyphicon-chevron-down pull-right"></i>\n\t\t\t\t\t\t<div class="truncatedString" data-bind="text: displayValue"></div>\n\t\t\t\t\t</a>\n\t\t\t\t\t<ul class="dropdown-menu dropdown-menu-uniform-size" data-bind="foreach: options">\n\t\t\t\t\t\t<li data-bind="click: function() { $parent.value(value); }">\n\t\t\t\t\t\t\t<a tabindex="-1">\n\t\t\t\t\t\t\t\t<i class="glyphicon glyphicon-ok pull-right" data-bind="visible: selected"></i>\n\t\t\t\t\t\t\t\t<div class="truncatedString" data-bind="text: label"></div>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<!-- /ko -->\n\n\t\t\t\t<!-- ko if: editor() == \'MultiValue\' -->\n\t\t\t\t<div class="dropdown" data-bind="dropdownForm: { onApply: function(v) { $updateValuesFromModel(v); }, onShown: function() { $($element).find(\'a:first span\').text(\'\'); } }">\n\t\t\t\t\t<a data-toggle="dropdown" class="dropdown-toggle form-control btn btn-default" style="text-align: left" data-bind="active: enabled">\n\t\t\t\t\t\t<i class="glyphicon glyphicon-chevron-down pull-right"></i>\n\t\t\t\t\t\t<div class="truncatedString" data-bind="text: displayValue"></div>\n\t\t\t\t\t</a>\n\t\t\t\t\t<ul class="dropdown-menu dropdown-menu-uniform-size dropdown-menu-form">\n\t\t\t\t\t\t<!-- ko foreach: options -->\n\t\t\t\t\t\t<li data-bind="click: function() { selected(!selected()); }">\n\t\t\t\t\t\t\t<a tabindex="-1">\n\t\t\t\t\t\t\t\t<i class="glyphicon glyphicon-ok pull-right" data-bind="visible: selected"></i>\n\t\t\t\t\t\t\t\t<div class="truncatedString" data-bind="text: label"></div>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t<li data-bind="click: function() { clearOptions(); }">\n\t\t\t\t\t\t\t<a tabindex="-1">\n\t\t\t\t\t\t\t\t<div class="truncatedString">%clearAllOptions%</div>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<!-- /ko -->\n\n\t\t\t\t<span data-bind="visible: nullable && editor() != \'SelectOneFromMany\'" >\n <input type="checkbox" data-bind="checked: isValueNull, enable: enabled, style:{ \'margin-left\': type == \'bool\' ? \'10px\' : \'\'}">\n <label>%null%</label>\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t<div style="color: red" data-bind="visible: errorText().length > 0">\n\t\t\t\t<span class="glyphicon glyphicon-exclamation-sign" />\n\t\t\t\t<span data-bind="text: errorText" style="font-size: small" />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div>\n\t\t<button id="refresh-button" class="btn btn-block btn-default btn-primary" data-bind="command: parametersPane.refreshReport">\n\t\t\t%refreshReport%\n\t\t</button>\n\t</div>\n</div>\n', templates.reportview = '<div style="height: 100%; overflow: hidden; position: relative;" data-bind="spin: document.inProgress">\n\n\t@include "errorPanel"\n\n\t<div id="contentView" style="width: 100%; height: 100%; padding: 5pt; overflow: auto; position: absolute; line-height: normal;" data-bind="scrollPosition: document.location, event: { scroll: document.scrolled }">\n\t\t<!-- ko if: document.isSinglePageMode -->\n\t\t\t<div id="singleView" style="position: absolute;" class="document-view" data-bind="htmlPage: { page: document.singlePage.pageContent, onupdate: processPage }"></div>\n\t\t<!-- /ko -->\n\t\t<!-- ko if: document.isContinuousPageMode -->\n\t\t<div id="continuousView" style="width: 99%; position: absolute;" class="document-view" data-bind="virtualScroll: { pages: document.continuousPage.pages, heightPage: document.continuousPage.heightPage, countPages: document.continuousPage.countPages, getPageContent: document.continuousPage.getPageContent}">\n\t\t\t<div data-bind="htmlPage: { page: content, onupdate: $root.processPage }, attr: { id: id}">\n\t\t\t</div>\n\t\t</div>\n\t\t<div id="tempPage" style="position: absolute;" class="document-view" data-bind="html: document.tempPage"></div>\n\t\t<!-- /ko -->\n\n\t\t<div style="position: absolute; background: blueviolet; opacity: 0.5; filter: alpha(opacity=50);" data-bind="visible: searchPane.highlightEnabled, \n\t\t\tstyle: { left: searchPane.highlightLeft, top: searchPane.highlightTop, width: searchPane.highlightWidth, height: searchPane.highlightHeight }"></div>\n\t</div>\n\n</div>', templates.searchpane = '<div class="panel-body" data-bind="with: searchPane">\n\t<div>\n\t\t<label class="control-label">%findLabel%</label>\n\t</div>\n\t<div>\n\t\t<input type="search" class="form-control" data-bind="value: searchString, valueUpdate: \'input\', event: { keypress: keyPressHandler }"/>\n\t</div>\n\t<div style="margin-top: 5pt">\n\t\t<input type="checkbox" data-bind="checked: matchCase" />\n\t\t<label class="control-label">%matchCase%</label>\n\t</div>\n\t<div>\n\t\t<input type="checkbox" data-bind="checked: wholePhrase" />\n\t\t<label class="control-label">%wholePhrase%</label>\n\t</div>\n\t<div style="float: right">\n\t\t<button class="btn btn-primary" data-bind="command: clear" style="margin: 1pt">%clear%</button>\n\t\t<button class="btn btn-primary" data-bind="command: search" style="margin: 1pt">%search%</button>\n\t</div>\n\t<div style="clear: both">\n\t\t<!-- ko if: isReady -->\n\t\t<!-- ko if: found -->\n\t\t<div data-bind="foreach: searchResults" style="margin-top: 5pt; border: 1pt solid black;">\n\t\t\t<div class="truncatedString" data-bind="click: $parent.navigate" style="margin: 3pt;">\n\t\t\t\t<a data-bind="text: text" href="#" />\n\t\t\t</div>\n\t\t</div>\n\t\t<button class="btn" data-bind="click: more, visible: hasMore">%more%</button>\n\t\t<!-- /ko-->\n\t\t<!-- ko ifnot: found -->\n\t\t<div style="margin: 5pt; padding: 5pt; border: 1pt solid black;">\n\t\t\t%noResults%\n\t\t</div>\n\t\t<!-- /ko-->\n\t\t<!-- /ko -->\n\t</div>\n</div>\n', templates.sendemaildialog = '<div class="modal-dialog" data-bind="with: sendEmailDialog">\n <div class="modal-content">\n <form data-bind="submit: $root.sendEmail">\n <div class="modal-header">\n\n <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>\n <h4 class="modal-title">%sendEmailTitle%</h4>\n\n </div>\n <div class="modal-body">\n <div style="margin-top: 5pt">\n <label class="control-label">%sendEmailTo%</label>\n <input id="email-input" class="form-control" type="text" data-bind="value: distribution.To" />\n </div>\n <div style="color: red" data-bind="visible: errorText().length > 0">\n <span class="glyphicon glyphicon-exclamation-sign" />\n <span data-bind="text: errorText" style="font-size: small" />\n </div>\n <div style="margin-top: 5pt">\n <label class="control-label">%emailSubject%</label>\n <input class="form-control" type="text" data-bind="value: distribution.Subject, valueUpdate: \'input\'" />\n </div>\n <div style="margin-top: 5pt">\n <label class="control-label">%emailMessage%</label>\n <textarea rows="5" class="form-control" data-bind="value: distribution.MessageBody, valueUpdate: \'input\'"></textarea>\n </div>\n <div style="margin-top: 5pt">\n\t <label class="control-label">%documentFormat%</label>\n\t <select class="btn btn-default dropdown-toggle form-control" data-bind="value: documentFormat">\n\t\t\t\t\t\t<option value="PDF">%docformat.pdf%</option>\n\t\t\t\t\t\t<option value="Excel">%docformat.excel%</option>\n\t\t\t\t\t\t<option value="Mht">%docformat.mht%</option>\n\t\t\t\t\t\t<option value="Image">%docformat.image%</option>\n\t\t\t\t\t\t<option value="Word">%docformat.word%</option>\n\t\t\t\t\t\t<option value="XML">%docformat.xml%</option>\n <option value="CSV">%docformat.csv%</option>\n\t </select>\n </div>\n <div style="margin-top: 5pt">\n <div>\n <label class="control-label">%deliveryMethodCaption%</label>\n </div>\n <label class="radio-inline">\n <input type="radio" name="sendtype" value="aslink" data-bind="checked: distribution.asCheck" />%asLink%\n </label>\n <label class="radio-inline">\n <input type="radio" name="sendtype" value="asattachment" data-bind="checked: distribution.asCheck" />%asAttachment%\n </label>\n </div>\n </div>\n <div id="errorResponse" class="errorpane alert alert-danger" data-bind="visible: errorResponse().length>0">\n <span class="glyphicon glyphicon-exclamation-sign" />\n <span data-bind="text: errorResponse" style="font-size: small" />\n </div>\n <div class="modal-footer">\n <div class="pull-left">\n <button type="button" class="btn btn-default" data-dismiss="modal">%cancel%</button>\n </div>\n <div class="pull-right">\n <button class="btn btn-primary" type="submit" style="margin: 1pt" data-bind="enable: sendEnabled">%sendEmail%</button>\n </div>\n </div>\n </form>\n </div>\n</div>', templates.tocpane = '<div data-bind="template: { name: \'toc-template\', data: tocPane.root }">\n</div>\n<script id="toc-node-template" type="text/html">\n\t<li class="toc-node collapsed"\n\t\tdata-bind="css: { leaf: $data.isLeaf != false, branch: $data.isLeaf == false }, treeNode: { template: \'toc-template\', node: $data }">\n\t\t<a class="toggle" href="#" data-bind="visible: $data.isLeaf == false"></a>\n\t\t<a class="link" href="#" data-bind="text: name, click: function() { $root.tocPane.navigate($data); return false; }"></a>\n\t</li>\n</script>\n<script id="toc-template" type="text/html">\n\t<ul class="toc" data-bind="template: { name: \'toc-node-template\', foreach: $data.kids }"></ul>\n</script>', $(resourceManager).on("updated", function() { cache = {}; }), { get: get }; } function TocPaneViewModel(viewer, documentViewModel) { function convertNode(node) { var promiseFn, kids; return $.extend({}, node, { kids: $.isFunction(node.kids) ? (kids = ko.observable([]), promiseFn = node.kids, ko.computed({ read: function() { return promiseFn && promiseFn().done(function(newKids) { promiseFn = null, kids(newKids.map(convertNode)); }), kids(); }, deferEvaluation: !0 })) : (node.kids || []).map(convertNode) }); } function reset() { _stack.removeAll(), _selectedNode(_root()); } function _navigate(node) { reset(), _lastNodeNavigate(node), viewer.pageIndex(node.page); var dpi = getDpi(), location = node.location || { left: 0, top: 0 }; if (viewer.pageDisplayMode() === PageDisplayMode.single) viewer.location({ left: location.left * dpi, top: location.top * dpi }); else { var heightPage = documentViewModel.continuousPage.heightPage(); viewer.location({ left: location.left * dpi, top: location.top * dpi + heightPage * viewer.pageIndex() }); } } var _root = ko.computed(function() { return convertNode(viewer.document().toc()); }), _selectedNode = ko.observable(_root()), _stack = ko.observableArray(), tocVisible = ko.computed({ read: function() { return viewer.sidebarState() === SidebarState.TOC; }, write: function(value) { viewer.sidebarState(value ? SidebarState.TOC : SidebarState.Hidden); } }), _lastNodeNavigate = ko.observable(null); return viewer.pageDisplayMode.subscribe(function(mode) { mode === PageDisplayMode.single && null !== _lastNodeNavigate() && _navigate(_lastNodeNavigate()); }), documentViewModel.continuousPage.heightPage.subscribe(function() { viewer.pageDisplayMode() === PageDisplayMode.continuous && null !== _lastNodeNavigate() && _navigate(_lastNodeNavigate()); }), viewer.pageIndex.subscribe(function(pageIndex) { null !== _lastNodeNavigate() && _lastNodeNavigate().page !== pageIndex && _lastNodeNavigate(null); }), viewer.document.subscribe(function() { _lastNodeNavigate(null); }), _root.subscribe(reset), { visible: tocVisible, get root() { return _root; }, get selectedNode() { return _selectedNode; }, navigateAndClose: function(node) { viewer.sidebarState(SidebarState.Hidden), _navigate(node); }, navigate: function(node) { _navigate(node); }, reset: reset, select: function(node) { _stack.push(_selectedNode()), _selectedNode(node); }, back: { exec: function() { var node = _stack.pop(); _selectedNode(node); }, enabled: ko.computed(function() { return _stack().length > 0; }) } }; } function TogglesHistory() { var togglesSet = []; this.toggle = function(toggleId) { togglesSet.push(toggleId); }, this.getSet = function() { var result = togglesSet.slice(); return result; }; } function ToolbarViewModel(services, viewer) { function pageCount() { return viewer.document().pageCount(); } var updateText = ko.observable(!1); $(services.resourceManager).on("updated", function() { updateText(!updateText()); }); var _pageNumber = ko.computed({ read: function() { var inProgress = viewer.document().state() == DocumentState.progress, pc = pageCount(); return 0 === pc ? "" : viewer.pageIndex() + 1 + "/" + pc + (inProgress ? "+" : ""); }, write: function(value) { var n = parseInt(value, 10); !isNaN(n) && n >= 1 && n <= pageCount() && viewer.pageIndex(n - 1); } }); viewer.document.subscribe(function() { _lastSidebarState = null; }), _pageNumber.text = function() { return "" + (viewer.pageIndex() + 1); }; var _lastSidebarState, _isDocReady = ko.computed(function() { return pageCount() > 0 && (viewer.document().state() === DocumentState.progress || viewer.document().state() === DocumentState.completed || viewer.document().state() === DocumentState.cancelled) && !viewer.report().busy(); }), _availableExports = ko.computed(function() { return viewer.availableExports().length > 0; }), _isExportProcessing = ko.observable(!1); return { pageNumber: _pageNumber, pageNumberEnabled: ko.computed(function() { return _isDocReady(); }), firstPage: { exec: function() { viewer.pageIndex(0); }, enabled: ko.computed(function() { return _isDocReady() && 0 !== viewer.pageIndex(); }) }, lastPage: { exec: function() { viewer.pageIndex(pageCount() - 1); }, enabled: ko.computed(function() { return _isDocReady() && viewer.pageIndex() !== pageCount() - 1; }) }, prevPage: { exec: function() { viewer.pageIndex(viewer.pageIndex() - 1); }, enabled: ko.computed(function() { return _isDocReady() && viewer.pageIndex() - 1 >= 0; }) }, nextPage: { exec: function() { viewer.pageIndex(viewer.pageIndex() + 1); }, enabled: ko.computed(function() { return _isDocReady() && viewer.pageIndex() + 1 < pageCount(); }) }, sidebar: { exec: function() { viewer.sidebarState() !== SidebarState.Hidden ? (_lastSidebarState = viewer.sidebarState(), viewer.sidebarState(SidebarState.Hidden)) : viewer.sidebarState(_lastSidebarState || (_isDocReady() || !viewer.report().hasPromptParameters() ? SidebarState.Search : SidebarState.Parameters)); }, enabled: !0 }, search: { exec: function() { viewer.sidebarState(SidebarState.Search); }, enabled: _isDocReady }, email: { exec: function() { viewer.sidebarState(SidebarState.Email); }, enabled: _isDocReady }, toc: { exec: function() { viewer.sidebarState(SidebarState.TOC); }, enabled: ko.computed(function() { return viewer.document().toc && viewer.document().toc().kids.length > 0; }) }, params: { exec: function() { viewer.sidebarState(SidebarState.Parameters); }, enabled: ko.computed(function() { return viewer.report().hasPromptParameters(); }) }, backToParent: { exec: function() { viewer.sidebarState(SidebarState.Hidden), viewer.backToParent(); }, enabled: ko.computed(function() { return viewer.backToParentEnabled(); }) }, print: { exec: function() { services.printingService.print(viewer.document(), viewer.callExportCallback); }, enabled: ko.computed(function() { return _isDocReady() && services.printingService && "Galley" !== viewer.report().renderModeState(); }) }, exportTo: function(exportType) { return { exec: function() { var options = { FileName: viewer.report().reportName, PreviewPages: 0 }; _isExportProcessing(!0), viewer.document().export(exportType, options, viewer.report().parameters()).done(function(exportUrl) { if (_isExportProcessing(!1), exportUrl) { var exportWindow = null; try { exportWindow = window.open(exportUrl + "&Attachment=1", "_blank"), exportWindow && exportWindow.focus(); } catch (e) {} exportWindow || viewer.callExportCallback(exportUrl + "&Attachment=1", function(url) { window.location = url; }); } }); }, enabled: _isDocReady }; }, renderMode: { exec: function() { "Galley" === viewer.report().renderModeState() ? viewer.report().renderMode("Paginated") : viewer.report().renderMode("Galley"); }, enabled: ko.computed(function() { return viewer.document().state() === DocumentState.completed && !viewer.report().busy(); }), visible: ko.computed(function() { return viewer.report().isChangeRenderModeSupported(); }) }, renderModeState: ko.computed(function() { return viewer.report().renderModeState(); }), get pageViewMode() { return viewer.pageDisplayMode(); }, singlePageView: { exec: function() { viewer.singlePageView(); }, enabled: _isDocReady }, continuousPageView: { exec: function() { viewer.continuousPageView(); }, enabled: _isDocReady }, renderFullReport: { exec: function() { viewer.report().run(!0); }, visible: ko.computed(function() { return viewer.document().state() === DocumentState.cancelled && !viewer.report().busy(); }) }, showMessagePartialData: ko.computed(function() { return viewer.document().state() === DocumentState.cancelled; }), cancelRendering: { exec: function() { viewer.document().cancelRendering(); }, visible: ko.computed(function() { return viewer.document().state() === DocumentState.progress && viewer.report().reportType === ReportType.pageReport; }) }, exportToAvailable: function(exportType) { return (exportType != ExportType.Docx || 1 == viewer.report().reportType) && viewer.availableExports().indexOf(exportType) >= 0; }, get exportsAreAvailable() { return _availableExports; }, get canExport() { return _isDocReady; }, get isExportProcessing() { return _isExportProcessing(); } }; } function ViewerImpl(services, options, viewModels) { function createReportModel() { viewerModel.report && documentReadySubscribe && (documentReadySubscribe.dispose(), documentReadySubscribe = null), viewerModel.report = ReportModel(reportService, options.report, null, resourceManager, options.renderMode, options.previewPages), options.reportLoaded && ko.waitFor(viewerModel.report().state, function(st) { return st === ReportModelState.open || st === ReportModelState.documentReady; }, function() { options.reportLoaded({ parameters: viewerModel.report().parameters() }); }); } function init() { options.report && !viewerModel.report().reportName && createReportModel(), options.availableExports && viewerModel.availableExports(options.availableExports), updateTemplate(); } function viewerElement() { return $(options.element); } function findElement(selector) { var $e = viewerElement().find(selector); return $e.length ? $e[0] : null; } function updateTemplate() { var uiType = options.uiType || "mobile"; templates.get(uiType).done(function(html) { var $e = viewerElement(); $e.html(html), ko.applyBindings(viewModel, $e.find(".ar-viewer")[0]); }); } function loadLocale(uri) { if ("string" != typeof uri || !uri) throw new Error("Invalid locale URI."); return resourceManager.update(uri).fail(function(error) { console.log("Unable to load locale from '{0}'. Error: {1}".format(uri, error)); }); } function optionImpl(name) { var invalid = function() { throw new Error("Ivalid option name: " + (name || "(null or undefined)")); }; return (optionMap[name] || invalid).apply(null, Array.prototype.slice.call(arguments, 1)); } function refresh() { viewerModel.clearErrors(), viewerModel.report().run(); } function print() { var pc = viewerModel.document().pageCount(); if (0 === pc) throw new Error("document is not ready for printing"); if (!services.printingService) throw new Error("Printing service is not available"); services.printingService.print(viewerModel.document(), viewerModel.callExportCallback).fail(viewerModel.handleError); } function exportImpl(exportType, callback, saveAsDialog, settings) { var pc = viewerModel.document().pageCount(); if (0 === pc) throw new Error("document is not ready for export"); settings = settings || {}, viewerModel.document().export(exportType, settings).done(function(exportUrl) { saveAsDialog && (exportUrl += "&Attachment=1"), viewerModel.callExportCallback(exportUrl, callback); }).fail(viewerModel.handleError); } function goToPage(number, offset, callback) { if (isNaN(number) || number <= 0 || number > viewerModel.document().pageCount()) throw new Error("The 'page' parameter must be integer in range 1..PageCount."); if (viewerModel.document().state() !== DocumentState.completed || 0 === viewerModel.document().pageCount()) throw new Error("Can't perform goToPage due to document state."); if (callback) var watcher = viewModel.document.singlePage.pageContent.subscribe(function() { watcher.dispose(), callback(); }); viewerModel.pageIndex(number - 1), offset && viewerModel.location(offset); } function backToParent() { viewerModel.backToParent(); } function search(searchTerm, searchOptions, callback) { if (viewerModel.document().state() !== DocumentState.completed) throw new Error("Can't perform search due to document state."); viewerModel.document().search({ text: searchTerm, matchCase: searchOptions.matchCase, wholePhrase: searchOptions.wholePhrase, from: searchOptions.from, maxSearchResults: searchOptions.maxSearchResults || options.maxSearchResults }).done(callback || noop).fail(viewerModel.handleError); } function getToc(callback) { function toPromise(value) { return "function" == typeof value ? value() : $.Deferred().resolve(value).promise(); } function traverseTocTree(node) { function traverseKids(kids) { return $.when.apply($, kids.map(traverseTocTree)); } var d = $.Deferred(); return null === node || void 0 === node ? d.resolve($.extend({}, nullNode, {})) : node.isLeaf || !node.kids ? d.resolve($.extend({}, node, {})) : (toPromise(node.kids).then(function(kids) { traverseKids(kids).then(function() { d.resolve($.extend({}, node, { kids: [].slice.call(arguments) })); }); }), d); } var nullNode = { name: "", page: 0, location: { left: 0, top: 0 }, isLeaf: !0, kids: [] }; viewerModel.document().getToc().then(traverseTocTree).done(callback); } function destroy() { viewerModel.clearReports(!1, function() { var $e = viewerElement(); ko.cleanNode($e[0]), $e.html(""); }); } if (!options) throw new Error("Viewer options are not specified."); var documentReadySubscribe, reportService = services.reportService, resourceManager = services.resourceManager, templates = services.templates, viewerModel = viewModels.viewerModel, viewModel = viewModels.viewerViewModel, viewer = { destroy: destroy, option: optionImpl, refresh: refresh, print: print, export: exportImpl, getToc: getToc, goToPage: goToPage, backToParent: backToParent, search: search, get pageCount() { return viewerModel.document().pageCount(); }, get currentPage() { return viewerModel.pageIndex() + 1; }, get toolbar() { return findElement(".toolbar"); }, get toolbarTop() { return findElement(".toolbar-top"); }, get toolbarBottom() { return findElement(".toolbar-bottom"); }, get displayMode() { return viewerModel.pageDisplayMode(); }, set displayMode(mode) { mode === PageDisplayMode.continuous ? viewerModel.continuousPageView() : viewerModel.singlePageView(); } }, optionMap = { uiType: function() { return arguments.length > 0 && (options.uiType = arguments[0], updateTemplate(options.uiType || "mobile", !1)), options.uiType; }, report: function() { return arguments.length > 0 && (options.report = arguments[0], createReportModel()), options.report; }, reportService: function() { return arguments.length > 0 && (options.reportService = arguments[0], reportService = ReportServiceSelector(options.reportService, resourceManager), services.reportService = reportService), options.reportService; }, localeUri: function() { if (arguments.length > 0) { var uri = arguments[0]; loadLocale(uri).done(function() { options.localeUri = uri, updateTemplate(); }); } return options.localeUri; }, availableExports: function() { return arguments.length > 0 && viewerModel.availableExports(arguments[0]), viewerModel.availableExports(); }, action: function() { return arguments.length > 0 && (options.action = arguments[0]), options.action; }, error: function() { return arguments.length > 0 && (options.error = arguments[0]), options.error; }, reportLoaded: function() { return arguments.length > 0 && (options.reportLoaded = arguments[0]), options.reportLoaded; }, documentLoaded: function() { return arguments.length > 0 && (options.documentLoaded = arguments[0]), options.documentLoaded; }, maxSearchResults: function() { return arguments.length > 0 && (options.maxSearchResults = arguments[0]), options.maxSearchResults; }, element: function() { if (arguments.length > 0) throw new Error("You can't change the element."); return options.element; }, renderMode: function() { return arguments.length > 0 && (options.renderMode = arguments[0]), options.renderMode; }, displayMode: function() { return arguments.length > 0 && (arguments[0] === PageDisplayMode.continuous ? viewerModel.continuousPageView() : viewerModel.singlePageView()), viewerModel.pageDisplayMode(); } }, load = options.localeUri ? loadLocale(options.localeUri) : $.Deferred().resolve(); return load.always(function() { init(); }), viewer; } function ViewerModel(reportService, options) { function clearDrillthroughStack(async) { $(_drillthroughStack).each(function() { var drill = _drillthroughStack.pop(); drill.Report.dispose(async); }), _backToParentEnabled(_drillthroughStack.length > 0); } function singlePageView() { _pageDisplayMode(PageDisplayMode.single); } function continuousPageView() { _pageDisplayMode(PageDisplayMode.continuous); } function errorHandler(e, error) { viewer.handleError(error); } function setReport(value) { if (!value) throw new ReferenceError("value"); _reloadingOnInteraction = !1, _report() && ($(_report()).unbind("error", errorHandler), $(_report()).unbind("documentReady", onDocumentReady), $(_report()).unbind("firstPageLoaded", onFirstPageLoaded), $(_report()).unbind("togglePageLoaded", onTogglePageLoaded)), viewer.document = nullDocument, _report(value), $(value).on("error", errorHandler), $(value).on("documentReady", onDocumentReady), $(value).on("firstPageLoaded", onFirstPageLoaded), $(value).on("togglePageLoaded", onTogglePageLoaded), ko.waitFor(value.state, function(st) { return st == ReportModelState.open; }, function(st) { value.hasPromptParameters() ? value.autoRun() && value.allParametersValid() && !_manualRun || _sidebarState(SidebarState.Parameters) : _sidebarState() === SidebarState.Parameters && _sidebarState(SidebarState.Hidden); }); } function chain(fn1, fn2) { return function() { fn1 && fn1.apply && fn1(), fn2 && fn2.apply && fn2(); }; } function onDocumentReady(e, document) { viewer.document = document; } function onFirstPageLoaded() { $(viewer).trigger("firstPageLoaded"); } function onTogglePageLoaded() { $(viewer).trigger("togglePageLoaded"); } if (!reportService) throw new ReferenceError("reportService is required here!"); var nullDocument = DocumentModel(), _reloadingOnInteraction = !1, _pageIndex = ko.observable(0), _location = ko.observable({ left: 0, top: 0 }), _report = ko.observable(), _document = ko.observable(nullDocument), _sidebarState = ko.observable(SidebarState.Hidden), _availableExports = ko.observable([ ExportType.Pdf, ExportType.Word, ExportType.Image, ExportType.Html, ExportType.Xls, ExportType.Csv, ExportType.Docx ]), _drillthroughStack = [], _backToParentEnabled = ko.observable(!1), _pageDisplayMode = ko.observable(PageDisplayMode.single), _errors = ko.observableArray([]), _showOnlyLastError = !!options && options.showOnlyLastError, _exporting = !1, _manualRun = !!options && !!options.manualRun, unbindDocument = noop, viewer = { get pageIndex() { return _pageIndex; }, get location() { return _location; }, get sidebarState() { return _sidebarState; }, get report() { return _report; }, set report(value) { viewer.clearReports(!0, null), viewer.clearErrors(), setReport(value), value.state() === ReportModelState.noReport && value.open(_manualRun); }, get document() { return _document; }, set document(value) { if (!value) throw new ReferenceError("value"); unbindDocument(), _document(value), $(value).on("error", errorHandler), unbindDocument = function() { $(_document()).unbind("error", errorHandler); }, options && options.documentLoaded && (unbindDocument = chain(unbindDocument, ko.waitFor(ko.computed(function() { return _document().state(); }), function(val) { return val === DocumentState.completed; }, options.documentLoaded))), _reloadingOnInteraction || (_pageIndex(0), _location({ left: 0, top: 0 })), _reloadingOnInteraction = !1; }, get availableExports() { return _availableExports; }, set availableExports(value) { _availableExports(value || []); }, drillthrough: function(drillthroughLink) { viewer.document().saveDocumentState(), viewer.report().drillthrough(drillthroughLink).done(function(result) { _drillthroughStack.push({ Report: viewer.report(), Document: viewer.document(), PageIndex: viewer.pageIndex() }), _backToParentEnabled(_drillthroughStack.length > 0), setReport(result.report), result.document && (viewer.document = result.document); }); }, toggle: function(toggleData) { var savedPageIndex = _pageIndex(); return _reloadingOnInteraction = !0, viewer.report().toggle(toggleData, savedPageIndex).then(function() { ko.waitFor(ko.computed(function() { return _document().state(); }), function(val) { return val === DocumentState.completed; }, function() { var pagesNumber = _document().pageCount(); savedPageIndex >= pagesNumber && (savedPageIndex = pagesNumber - 1), _pageIndex() >= pagesNumber || savedPageIndex > 0 && _pageIndex() !== savedPageIndex ? _pageIndex(savedPageIndex) : _pageIndex.valueHasMutated(); }); }); }, backToParent: function() { if (0 === _drillthroughStack.length) throw new Error("Report stack is empty!"); var oldReport = _report(); oldReport && oldReport.dispose(!0); var drill = _drillthroughStack.pop(); _backToParentEnabled(_drillthroughStack.length > 0), null !== drill && void 0 !== drill && (setReport(drill.Report), drill.Document.restoreDocumentState(), viewer.document = drill.Document, _pageIndex(drill.PageIndex), _pageIndex.valueHasMutated()); }, get backToParentEnabled() { return _backToParentEnabled; }, get errors() { return _errors; }, get showOnlyLastError() { return _showOnlyLastError; }, handleError: function(error) { if (error) { var errorObject = null; if (error.responseJSON) { var statusText = error.statusText; return void _errors(_errors().concat([ String(resolveErrorMessage([ error, "error", statusText ? statusText : "" ])) ])); } if (errorObject = { message: String(error) }, options && options.error && options.error.apply && options.error(errorObject)) return; errorObject && errorObject.message && _errors(_errors().concat([ String(errorObject.message) ])); } }, clearReports: function(async, clearCallback) { if (!_exporting) { clearDrillthroughStack(async); var oldReport = _report(); oldReport && oldReport.dispose(async), clearCallback && clearCallback(); } }, callExportCallback: function(url, exportCallback) { if (exportCallback) { _exporting = !0; try { exportCallback(url); } finally { setTimeout(function() { _exporting = !1; }, 1); } } }, clearErrors: function() { _errors([]); }, get pageDisplayMode() { return _pageDisplayMode; }, singlePageView: singlePageView, continuousPageView: continuousPageView }; return viewer.report = ReportModel(reportService), viewer; } function ViewerViewModel(services, options, viewer) { var _document = DocumentViewModel(viewer), _tocPane = TocPaneViewModel(viewer, _document), _parametersPane = ParameterPaneViewModel(services, viewer), _searchPane = SearchPaneViewModel(viewer, _document, options.maxSearchResults, options.element), _sendEmailDialog = sendEmailDialogViewModel(services, viewer), _errorsPane = ErrorPaneViewModel(viewer), _toolbar = ToolbarViewModel(services, viewer), _paramsExists = ko.computed(function() { return viewer.report().parameters().filter(function(p) { return void 0 === p.promptUser || p.promptUser; }).length > 0; }), _hasToc = ko.computed(function() { return viewer.document().toc().kids.length > 0; }), _interactivityProcessor = InteractivityProcessor({ viewer: viewer, tocPane: _tocPane, get action() { return options.action; } }), SR = services.resourceManager && $.isFunction(services.resourceManager.get) ? services.resourceManager.get : identity; return { sendEmail: function() { var distribution = { To: _sendEmailDialog.distribution.To().split(/\s*,\s*/), Subject: _sendEmailDialog.distribution.Subject(), MessageBody: _sendEmailDialog.distribution.MessageBody(), AsLink: "aslink" == _sendEmailDialog.distribution.asCheck(), AsAttachment: "asattachment" == _sendEmailDialog.distribution.asCheck() }, documentFormat = _sendEmailDialog.documentFormat(), settings = { Distribution: distribution, DocumentFormat: documentFormat, SendEmailPolicyName: SR("sendEmailPolicyName") }; viewer.document().sendEmail(settings).done(function() { viewer.sidebarState(SidebarState.Hidden), _sendEmailDialog.errorResponse(""); }).fail(function() { viewer.sidebarState(SidebarState.Hidden); var error = resolveErrorMessage(arguments, SR); viewer.handleError(error); }); }, canSendEmail: function() { return viewer.document().canSendEmail(); }, get document() { return _document; }, get toolbar() { return _toolbar; }, get tocPane() { return _tocPane; }, get parametersPane() { return _parametersPane; }, get searchPane() { return _searchPane; }, get errorPane() { return _errorsPane; }, get sidebarState() { return viewer.sidebarState; }, get hasParameters() { return _paramsExists; }, get hasToc() { return _hasToc; }, get sendEmailDialog() { return _sendEmailDialog; }, processPage: function(element) { $.each(viewer.document().resolveActionItems(element), function(index, item) { _interactivityProcessor.processActionItem(item, element); }), _interactivityProcessor.processActions(element), _interactivityProcessor.processToolTips(); }, setSidebarState: function(state) { viewer.sidebarState(state); } }; } function WebServiceBase(service, serviceUrl, setSecurityToken) { function isUndefined(value) { return void 0 === value || null === value; } function setAuthToken(ajaxOptions) { return setSecurityToken && setSecurityToken(ajaxOptions), ajaxOptions; } function postService(url, data, skipError, async) { return postJson(url, data, skipError, async).then(function(msg) { return isUndefined(msg.d) ? invalidResponse(msg) : isUndefined(msg.d.Error) ? msg.d : skipError ? msg.d : errorPromise(msg.d.Error.Description || "ReportService fail!"); }).fail(function() { var error = resolveErrorMessage(arguments); $(service).trigger("error", error); }); } function postJson(url, data, skipError, async) { return isAbsoluteUri(url) || (url = serviceUrl + url), isUndefined(async) && (async = !0), $.ajax(setAuthToken({ type: "POST", url: url, data: JSON.stringify(data), contentType: "application/json", async: async })); } function get(url) { return isAbsoluteUri(url) || (url = serviceUrl + url), $.ajax(setAuthToken({ type: "GET", url: url })).then(function(data, status, xhr) { return $.Deferred(function(d) { d.resolve(data, status, xhr); }); }, failCallback); } function getJson(url) { return isAbsoluteUri(url) || (url = serviceUrl + url), $.ajax(setAuthToken({ type: "GET", url: url, dataType: "json" })).then(function(data, status, xhr) { return $.Deferred(function(d) { d.resolve(data, status, xhr); }); }, failCallback); } function failCallback(error) { return 3 == arguments.length && arguments[0] && arguments[0].status && (error = getXhrErrorMessage(arguments[0])), error; } function getXhrErrorMessage(xhr) { var responseJson = xhr.responseJSON; if (!responseJson && xhr.responseText) try { responseJson = JSON.parse(xhr.responseText); } catch (e) {} return responseJson && responseJson.Message ? responseJson.Message : responseJson && responseJson.ErrorCode ? { errorCode: responseJson.ErrorCode, message: responseJson.Error, errorParameters: responseJson.ErrorParameters || [] } : xhr.statusText; } function errorPromise(problem) { return $.Deferred(function(deferred) { deferred.reject(problem); }).promise(); } function invalidResponse(value) { return errorPromise("Invalid response: " + JSON.stringify(value)); } return { post: postService, postRest: postJson, get: get, getJson: getJson, errorPromise: errorPromise, invalidResponse: invalidResponse, invalidArg: function(name, value) { return errorPromise("Invalid argument {0}. Value: {1}".format(name, JSON.stringify(value))); }, promise: function(value) { return $.Deferred(function(d) { d.resolve(value); }).promise(); }, delay: function(promiseFn, timeout) { var def = $.Deferred(); return setTimeout(function() { promiseFn().done(function() { def.resolve.apply(def, arguments); }).fail(function() { def.reject.apply(def, arguments); }); }, timeout), def.promise(); } }; } function createViewer(options) { var baseUri = options.baseUri || ".", resourceManager = ResourceManager(), reportService = ReportServiceSelector(options.reportService, resourceManager), templates = Templates(baseUri, resourceManager), browserSpecific = BrowserSpecific(), printingService = PrintingService(resourceManager, browserSpecific), services = { reportService: reportService, templates: templates, resourceManager: resourceManager, printingService: printingService, browserSpecific: browserSpecific }, viewerModel = ViewerModel(reportService, options); return ViewerImpl(services, options, { viewerModel: viewerModel, viewerViewModel: ViewerViewModel(services, options, viewerModel) }); } !function($) { "use strict"; $.fn.bootstrapSwitch = function(method) { var methods = { init: function() { return this.each(function() { var $div, $switchLeft, $switchRight, $label, color, moving, $element = $(this), myClasses = "", classes = $element.attr("class"), onLabel = "ON", offLabel = "OFF", icon = !1; $.each([ "switch-mini", "switch-small", "switch-large" ], function(i, el) { classes.indexOf(el) >= 0 && (myClasses = el); }), $element.addClass("has-switch"), void 0 !== $element.data("on") && (color = "switch-" + $element.data("on")), void 0 !== $element.data("on-label") && (onLabel = $element.data("on-label")), void 0 !== $element.data("off-label") && (offLabel = $element.data("off-label")), void 0 !== $element.data("icon") && (icon = $element.data("icon")), $switchLeft = $("<span>").addClass("switch-left").addClass(myClasses).addClass(color).html(onLabel), color = "", void 0 !== $element.data("off") && (color = "switch-" + $element.data("off")), $switchRight = $("<span>").addClass("switch-right").addClass(myClasses).addClass(color).html(offLabel), $label = $("<label>").html(" ").addClass(myClasses).attr("for", $element.find("input").attr("id")), icon && $label.html('<i class="icon icon-' + icon + '"></i>'), $div = $element.find(":checkbox").wrap($("<div>")).parent().data("animated", !1), $element.data("animated") !== !1 && $div.addClass("switch-animate").data("animated", !0), $div.append($switchLeft).append($label).append($switchRight), $element.find(">div").addClass($element.find("input").is(":checked") ? "switch-on" : "switch-off"), $element.find("input").is(":disabled") && $(this).addClass("deactivate"); var changeStatus = function($this) { $this.siblings("label").trigger("mousedown").trigger("mouseup").trigger("click"); }; $element.on("keydown", function(e) { 32 === e.keyCode && (e.stopImmediatePropagation(), e.preventDefault(), changeStatus($(e.target).find("span:first"))); }), $switchLeft.on("click", function(e) { changeStatus($(this)); }), $switchRight.on("click", function(e) { changeStatus($(this)); }), $element.find("input").on("change", function(e) { var $this = $(this), $element = $this.parent(), thisState = $this.is(":checked"), state = $element.is(".switch-off"); e.preventDefault(), $element.css("left", ""), state === thisState && (thisState ? $element.removeClass("switch-off").addClass("switch-on") : $element.removeClass("switch-on").addClass("switch-off"), $element.data("animated") !== !1 && $element.addClass("switch-animate"), $element.parent().trigger("switch-change", { el: $this, value: thisState })); }), $element.find("label").on("mousedown touchstart", function(e) { var $this = $(this); moving = !1, e.preventDefault(), e.stopImmediatePropagation(), $this.closest("div").removeClass("switch-animate"), $this.closest(".has-switch").is(".deactivate") ? $this.unbind("click") : ($this.on("mousemove touchmove", function(e) { var $element = $(this).closest(".switch"), relativeX = (e.pageX || e.originalEvent.targetTouches[0].pageX) - $element.offset().left, percent = relativeX / $element.width() * 100, left = 25, right = 75; moving = !0, percent < left ? percent = left : percent > right && (percent = right), $element.find(">div").css("left", percent - right + "%"); }), $this.on("click touchend", function(e) { var $this = $(this), $target = $(e.target), $myCheckBox = $target.siblings("input"); e.stopImmediatePropagation(), e.preventDefault(), $this.unbind("mouseleave"), moving ? $myCheckBox.prop("checked", !(parseInt($this.parent().css("left")) < -25)) : $myCheckBox.prop("checked", !$myCheckBox.is(":checked")), moving = !1, $myCheckBox.trigger("change"); }), $this.on("mouseleave", function(e) { var $this = $(this), $myCheckBox = $this.siblings("input"); e.preventDefault(), e.stopImmediatePropagation(), $this.unbind("mouseleave"), $this.trigger("mouseup"), $myCheckBox.prop("checked", !(parseInt($this.parent().css("left")) < -25)).trigger("change"); }), $this.on("mouseup", function(e) { e.stopImmediatePropagation(), e.preventDefault(), $(this).unbind("mousemove"); })); }); }); }, toggleActivation: function() { $(this).toggleClass("deactivate"); }, isActive: function() { return !$(this).hasClass("deactivate"); }, setActive: function(active) { active ? $(this).removeClass("deactivate") : $(this).addClass("deactivate"); }, toggleState: function(skipOnChange) { var $input = $(this).find("input:checkbox"); $input.prop("checked", !$input.is(":checked")).trigger("change", skipOnChange); }, setState: function(value, skipOnChange) { $(this).find("input:checkbox").prop("checked", value).trigger("change", skipOnChange); }, status: function() { return $(this).find("input:checkbox").is(":checked"); }, destroy: function() { var $checkbox, $div = $(this).find("div"); return $div.find(":not(input:checkbox)").remove(), $checkbox = $div.children(), $checkbox.unwrap().unwrap(), $checkbox.unbind("change"), $checkbox; } }; return methods[method] ? methods[method].apply(this, Array.prototype.slice.call(arguments, 1)) : "object" != typeof method && method ? void $.error("Method " + method + " does not exist!") : methods.init.apply(this, arguments); }; }(jQuery), $(function() { $(".switch").bootstrapSwitch(); }), // @preserve jQuery.floatThead 1.4.5 - http://mkoryak.github.io/floatThead/ - Copyright (c) 2012 - 2016 Misha Koryak // @license MIT function($) { function windowResize(eventName, cb) { if (8 == ieVersion) { var winWidth = $window.width(), debouncedCb = util.debounce(function() { var winWidthNew = $window.width(); winWidth != winWidthNew && (winWidth = winWidthNew, cb()); }, 1); $window.on(eventName, debouncedCb); } else $window.on(eventName, util.debounce(cb, 1)); } function getClosestScrollContainer($elem) { var elem = $elem[0], parent = elem.parentElement; do { var pos = window.getComputedStyle(parent).getPropertyValue("overflow"); if ("visible" != pos) break; } while (parent = parent.parentElement); return $(parent == document.body ? [] : parent); } function debug(str) { window && window.console && window.console.error && window.console.error("jQuery.floatThead: " + str); } function getOffsetWidth(el) { var rect = el.getBoundingClientRect(); return rect.width || rect.right - rect.left; } function scrollbarWidth() { var $div = $("<div>").css({ width: 50, height: 50, "overflow-y": "scroll", position: "absolute", top: -200, left: -200 }).append($("<div>").css({ height: 100, width: "100%" })); $("body").append($div); var w1 = $div.innerWidth(), w2 = $("div", $div).innerWidth(); return $div.remove(), w1 - w2; } function isDatatable($table) { if ($table.dataTableSettings) for (var i = 0; i < $table.dataTableSettings.length; i++) { var table = $table.dataTableSettings[i].nTable; if ($table[0] == table) return !0; } return !1; } function tableWidth($table, $fthCells, isOuter) { var fn = isOuter ? "outerWidth" : "width"; if (isTableWidthBug && $table.css("max-width")) { var w = 0; isOuter && (w += parseInt($table.css("borderLeft"), 10), w += parseInt($table.css("borderRight"), 10)); for (var i = 0; i < $fthCells.length; i++) w += $fthCells.get(i).offsetWidth; return w; } return $table[fn](); } $.floatThead = $.floatThead || {}, $.floatThead.defaults = { headerCellSelector: "tr:visible:first>*:visible", zIndex: 1001, position: "auto", top: 0, bottom: 0, scrollContainer: function($table) { return $([]); }, responsiveContainer: function($table) { return $([]); }, getSizingRow: function($table, $cols, $fthCells) { return $table.find("tbody tr:visible:first>*:visible"); }, floatTableClass: "floatThead-table", floatWrapperClass: "floatThead-wrapper", floatContainerClass: "floatThead-container", copyTableClass: !0, autoReflow: !1, debug: !1, support: { bootstrap: !0, datatables: !0, jqueryUI: !0, perfectScrollbar: !0 } }; var util = window._, canObserveMutations = "undefined" != typeof MutationObserver, ieVersion = function() { for (var a = 3, b = document.createElement("b"), c = b.all || []; a = 1 + a, b.innerHTML = "<!--[if gt IE " + a + "]><i><![endif]-->", c[0]; ) ; return 4 < a ? a : document.documentMode; }(), isFF = /Gecko\//.test(navigator.userAgent), isWebkit = /WebKit\//.test(navigator.userAgent); ieVersion || isFF || isWebkit || (ieVersion = 11); var isTableWidthBug = function() { if (isWebkit) { var $test = $("<div>").css("width", 0).append($("<table>").css("max-width", "100%").append($("<tr>").append($("<th>").append($("<div>").css("min-width", 100).text("X"))))); $("body").append($test); var ret = 0 == $test.find("table").width(); return $test.remove(), ret; } return !1; }, createElements = !isFF && !ieVersion, $window = $(window); if (!window.matchMedia) { var _beforePrint = window.onbeforeprint, _afterPrint = window.onafterprint; window.onbeforeprint = function() { _beforePrint && _beforePrint(), $window.triggerHandler("beforeprint"); }, window.onafterprint = function() { _afterPrint && _afterPrint(), $window.triggerHandler("afterprint"); }; } $.fn.floatThead = function(map) { if (map = map || {}, !util && (util = window._ || $.floatThead._, !util)) throw new Error("jquery.floatThead-slim.js requires underscore. You should use the non-lite version since you do not have underscore."); if (ieVersion < 8) return this; var mObs = null; if (util.isFunction(isTableWidthBug) && (isTableWidthBug = isTableWidthBug()), util.isString(map)) { var command = map, args = Array.prototype.slice.call(arguments, 1), ret = this; return this.filter("table").each(function() { var $this = $(this), opts = $this.data("floatThead-lazy"); opts && $this.floatThead(opts); var obj = $this.data("floatThead-attached"); if (obj && util.isFunction(obj[command])) { var r = obj[command].apply(this, args); void 0 !== r && (ret = r); } }), ret; } var opts = $.extend({}, $.floatThead.defaults || {}, map); if ($.each(map, function(key, val) { key in $.floatThead.defaults || !opts.debug || debug("Used [" + key + "] key to init plugin, but that param is not an option for the plugin. Valid options are: " + util.keys($.floatThead.defaults).join(", ")); }), opts.debug) { var v = $.fn.jquery.split("."); 1 == parseInt(v[0], 10) && parseInt(v[1], 10) <= 7 && debug("jQuery version " + $.fn.jquery + " detected! This plugin supports 1.8 or better, or 1.7.x with jQuery UI 1.8.24 -> http://jqueryui.com/resources/download/jquery-ui-1.8.24.zip"); } return this.filter(":not(." + opts.floatTableClass + ")").each(function() { function eventName(name) { return name + ".fth-" + floatTheadId + ".floatTHead"; } function setFloatWidth() { var tw = tableWidth($table, $fthCells, !0), $container = responsive ? $responsiveContainer : $scrollContainer, width = $container.width() || tw, floatContainerWidth = "hidden" != $container.css("overflow-y") ? width - scrollbarOffset.horizontal : width; if ($floatContainer.width(floatContainerWidth), locked) { var percent = 100 * tw / floatContainerWidth; $floatTable.css("width", percent + "%"); } else $floatTable.outerWidth(tw); } function updateScrollingOffsets() { scrollingTop = (util.isFunction(opts.top) ? opts.top($table) : opts.top) || 0, scrollingBottom = (util.isFunction(opts.bottom) ? opts.bottom($table) : opts.bottom) || 0; } function columnNum() { var count, $headerColumns = $header.find(opts.headerCellSelector); if (existingColGroup ? count = $tableColGroup.find("col").length : (count = 0, $headerColumns.each(function() { count += parseInt($(this).attr("colspan") || 1, 10); })), count != lastColumnCount) { lastColumnCount = count; for (var content, cells = [], cols = [], psuedo = [], x = 0; x < count; x++) content = $headerColumns.eq(x).text(), cells.push('<th class="floatThead-col" aria-label="' + content + '"/>'), cols.push("<col/>"), psuedo.push($("<fthtd>").css({ display: "table-cell", height: 0, width: "auto" })); cols = cols.join(""), cells = cells.join(""), createElements && ($fthRow.empty(), $fthRow.append(psuedo), $fthCells = $fthRow.find("fthtd")), existingColGroup || $tableColGroup.html(cols), $tableCells = $tableColGroup.find("col"), $floatColGroup.html(cols), $headerCells = $floatColGroup.find("col"); } return count; } function refloat() { if (!headerFloated) { if (headerFloated = !0, useAbsolutePositioning) { var tw = tableWidth($table, $fthCells, !0), wrapperWidth = $wrapper.width(); tw > wrapperWidth && $table.css("minWidth", tw); } $headerClone.css("display", ""), $table.css(layoutFixed), $floatTable.css(layoutFixed), $floatTable.append($header); } } function unfloat() { headerFloated && (headerFloated = !1, useAbsolutePositioning && $table.width(originalTableWidth), $headerClone.css("display", "none"), $table.prepend($header), $table.css(layoutAuto), $floatTable.css(layoutAuto), $table.css("minWidth", originalTableMinWidth), $table.css("minWidth", tableWidth($table, $fthCells))); } function triggerFloatEvent(isFloating) { isHeaderFloatingLogical != isFloating && (isHeaderFloatingLogical = isFloating, $table.triggerHandler("floatThead", [ isFloating, $floatContainer ])); } function changePositioning(isAbsolute) { useAbsolutePositioning != isAbsolute && (useAbsolutePositioning = isAbsolute, $floatContainer.css({ position: useAbsolutePositioning ? "absolute" : "fixed" })); } function getSizingRow($table, $cols, $fthCells, ieVersion) { return createElements ? $fthCells : ieVersion ? opts.getSizingRow($table, $cols, $fthCells) : $cols; } function reflow() { var i, numCols = columnNum(); return function() { if (!isHidden) { var scrollLeft = $floatContainer.scrollLeft(); $tableCells = $tableColGroup.find("col"); var $rowCells = getSizingRow($table, $tableCells, $fthCells, ieVersion); if ($rowCells.length == numCols && numCols > 0) { if (!existingColGroup) for (i = 0; i < numCols; i++) $tableCells.eq(i).css("width", ""); unfloat(); var widths = []; for (i = 0; i < numCols; i++) widths[i] = getOffsetWidth($rowCells.get(i)); for (i = 0; i < numCols; i++) $headerCells.eq(i).width(widths[i]), $tableCells.eq(i).width(widths[i]); refloat(); } else $floatTable.append($header), $table.css(layoutAuto), $floatTable.css(layoutAuto); $floatContainer.scrollLeft(scrollLeft), $table.triggerHandler("reflowed", [ $floatContainer ]); } }; } function floatContainerBorderWidth(side) { var border = $scrollContainer.css("border-" + side + "-width"), w = 0; return border && ~border.indexOf("px") && (w = parseInt(border, 10)), w; } function isResponsiveContainerActive() { return "auto" == $responsiveContainer.css("overflow-x"); } function calculateFloatContainerPosFn() { var floatEnd, scrollingContainerTop = $scrollContainer.scrollTop(), scrollingContainerLeft = $scrollContainer.scrollLeft(), tableContainerGap = 0, tableLeftContainerGap = 0, captionHeight = haveCaption ? $caption.outerHeight(!0) : 0, captionScrollOffset = captionAlignTop ? captionHeight : -captionHeight, floatContainerHeight = $floatContainer.height(), tableOffset = $table.offset(), tableLeftGap = 0, tableTopGap = 0; if (locked) { var containerOffset = $scrollContainer.offset(); tableContainerGap = tableOffset.top - containerOffset.top + scrollingContainerTop, haveCaption && captionAlignTop && (tableContainerGap += captionHeight), tableLeftGap = floatContainerBorderWidth("left"), tableTopGap = floatContainerBorderWidth("top"), tableContainerGap -= tableTopGap, tableLeftContainerGap = tableOffset.left - containerOffset.left + scrollingContainerLeft, tableLeftContainerGap -= tableLeftGap; } else floatEnd = tableOffset.top - scrollingTop - floatContainerHeight + scrollingBottom + scrollbarOffset.vertical; var windowTop = $window.scrollTop(), windowLeft = $window.scrollLeft(), scrollContainerLeft = (isResponsiveContainerActive() ? $responsiveContainer : locked ? $scrollContainer : $window).scrollLeft(), scrollContainerWidth = (isResponsiveContainerActive() ? $responsiveContainer : locked ? $scrollContainer : $window).prop("clientWidth"); return function(eventType) { if (!isHidden) { responsive = isResponsiveContainerActive(); var isTableHidden = $table[0].offsetWidth <= 0 && $table[0].offsetHeight <= 0; if (!isTableHidden && floatTableHidden) return floatTableHidden = !1, setTimeout(function() { $table.triggerHandler("reflow"); }, 1), null; if (isTableHidden && (floatTableHidden = !0, !useAbsolutePositioning)) return null; if ("windowScroll" == eventType) windowTop = $window.scrollTop(), windowLeft = $window.scrollLeft(); else if ("containerScroll" == eventType) if ($responsiveContainer.length) { if (!responsive) return; scrollContainerLeft = $responsiveContainer.scrollLeft(); } else scrollingContainerTop = $scrollContainer.scrollTop(), scrollContainerLeft = $scrollContainer.scrollLeft(); else "init" != eventType && (windowTop = $window.scrollTop(), windowLeft = $window.scrollLeft(), scrollingContainerTop = $scrollContainer.scrollTop(), scrollContainerLeft = (responsive ? $responsiveContainer : $scrollContainer).scrollLeft()); if (!isWebkit || !(windowTop < 0 || windowLeft < 0)) { if (absoluteToFixedOnScroll) changePositioning("windowScrollDone" == eventType ? !0 : !1); else if ("windowScrollDone" == eventType) return null; tableOffset = $table.offset(), haveCaption && captionAlignTop && (tableOffset.top += captionHeight); var top, left, tableHeight = $table.outerHeight(), tableWidth = $table.outerWidth(); if (locked && useAbsolutePositioning) { if (tableContainerGap >= scrollingContainerTop) { var gap = tableContainerGap - scrollingContainerTop + tableTopGap; top = gap > 0 ? gap : 0, triggerFloatEvent(!1); } else top = wrappedContainer ? tableTopGap : scrollingContainerTop, triggerFloatEvent(!0); left = tableLeftGap; } else if (!locked && useAbsolutePositioning) windowTop > floatEnd + tableHeight + captionScrollOffset ? top = tableHeight - floatContainerHeight + captionScrollOffset : tableOffset.top >= windowTop + scrollingTop ? (top = 0, unfloat(), triggerFloatEvent(!1)) : (top = scrollingTop + windowTop - tableOffset.top + tableContainerGap + (captionAlignTop ? captionHeight : 0), refloat(), triggerFloatEvent(!0)), left = scrollContainerLeft; else if (locked && !useAbsolutePositioning) if (tableContainerGap > scrollingContainerTop || scrollingContainerTop - tableContainerGap > tableHeight ? (top = tableOffset.top - windowTop, unfloat(), triggerFloatEvent(!1)) : (top = tableOffset.top + scrollingContainerTop - windowTop - tableContainerGap, refloat(), triggerFloatEvent(!0)), tableLeftContainerGap > scrollContainerLeft) left = tableOffset.left - windowLeft, reduceWidthFloatContainer(tableLeftContainerGap - scrollContainerLeft); else { var tableRight = tableLeftContainerGap + tableWidth, scrollableAreaRight = scrollContainerLeft + scrollContainerWidth; reduceWidthFloatContainer(tableRight < scrollableAreaRight ? scrollableAreaRight - tableRight : 0), left = tableOffset.left + scrollContainerLeft - windowLeft - tableLeftContainerGap; } else locked || useAbsolutePositioning || (windowTop > floatEnd + tableHeight + captionScrollOffset ? top = tableHeight + scrollingTop - windowTop + floatEnd + captionScrollOffset : tableOffset.top > windowTop + scrollingTop ? (top = tableOffset.top - windowTop, refloat(), triggerFloatEvent(!1)) : (top = scrollingTop, triggerFloatEvent(!0)), left = tableOffset.left + scrollContainerLeft - windowLeft); return { top: top, left: left }; } } }; } function reduceWidthFloatContainer(delta) { var scrollContainerWidth = (isResponsiveContainerActive() ? $responsiveContainer : locked ? $scrollContainer : $window).prop("clientWidth"); scrollContainerWidth -= delta, $floatContainer.width(scrollContainerWidth); } function repositionFloatContainerFn() { var oldTop = 0, oldLeft = 0, oldScrollLeft = null; return function(pos, setWidth) { null != pos && (Math.abs(oldTop - pos.top) > 1 || Math.abs(oldLeft - pos.left) > 1) && ($floatContainer.css({ top: pos.top, left: pos.left }), oldTop = pos.top, oldLeft = pos.left), setWidth && setFloatWidth(); var container = responsive ? $responsiveContainer : $scrollContainer, scrollLeft = container.scrollLeft(); if (!useAbsolutePositioning || oldScrollLeft != scrollLeft) { var tableLeftContainerGap = $table.offset().left - container.offset().left + container.scrollLeft(), tableLeftGap = floatContainerBorderWidth("left"); tableLeftContainerGap -= tableLeftGap, $floatContainer.scrollLeft(scrollLeft - Math.round(tableLeftContainerGap)), oldScrollLeft = scrollLeft; } }; } function calculateScrollBarSize() { if ($scrollContainer.length) if (opts.support && opts.support.perfectScrollbar && $scrollContainer.data().perfectScrollbar) scrollbarOffset = { horizontal: 0, vertical: 0 }; else { if ("scroll" == $scrollContainer.css("overflow-x")) scrollbarOffset.horizontal = scWidth; else { var sw = $scrollContainer.width(), tw = tableWidth($table, $fthCells), offsetv = sh < th ? scWidth : 0; scrollbarOffset.horizontal = sw - offsetv < tw ? scWidth : 0; } if ("scroll" == $scrollContainer.css("overflow-y")) scrollbarOffset.vertical = scWidth; else { var sh = $scrollContainer.height(), th = $table.height(), offseth = sw < tw ? scWidth : 0; scrollbarOffset.vertical = sh - offseth < th ? scWidth : 0; } } } function getBackground(jqueryElement) { var color = jqueryElement.css("background-color"); return isTransparent(color) ? jqueryElement.is("body") ? "rgb(255, 255, 255)" : getBackground(jqueryElement.parent()) : color; } function isTransparent(color) { switch ((color || "").replace(/\s+/g, "").toLowerCase()) { case "transparent": case "": case "rgba(0,0,0,0)": return !0; default: return !1; } } function setBackgrund(jqueryElement, color) { jqueryElement.css("background-color", color); } var floatTheadId = util.uniqueId(), $table = $(this); if ($table.data("floatThead-attached")) return !0; if (!$table.is("table")) throw new Error('jQuery.floatThead must be run on a table element. ex: $("table").floatThead();'); canObserveMutations = opts.autoReflow && canObserveMutations; var $header = $table.children("thead:first"), $headerClone = $header.clone().css("display", "none"); $table.prepend($headerClone); var $tbody = $table.children("tbody:first"); if (0 == $header.length || 0 == $tbody.length) return $table.data("floatThead-lazy", opts), void $table.unbind("reflow").one("reflow", function() { $table.floatThead(opts); }); $table.data("floatThead-lazy") && $table.unbind("reflow"), $table.data("floatThead-lazy", !1); var scrollingTop, scrollingBottom, headerFloated = !0, isHidden = !1, scrollbarOffset = { vertical: 0, horizontal: 0 }, scWidth = scrollbarWidth(), lastColumnCount = 0; opts.scrollContainer === !0 && (opts.scrollContainer = getClosestScrollContainer); var $scrollContainer = opts.scrollContainer($table) || $([]), locked = $scrollContainer.length > 0, $responsiveContainer = locked ? $([]) : opts.responsiveContainer($table) || $([]), responsive = isResponsiveContainerActive(), useAbsolutePositioning = null; "undefined" != typeof opts.useAbsolutePositioning && (opts.position = "auto", opts.useAbsolutePositioning && (opts.position = opts.useAbsolutePositioning ? "absolute" : "fixed"), debug("option 'useAbsolutePositioning' has been removed in v1.3.0, use `position:'" + opts.position + "'` instead. See docs for more info: http://mkoryak.github.io/floatThead/#options")), "undefined" != typeof opts.scrollingTop && (opts.top = opts.scrollingTop, debug("option 'scrollingTop' has been renamed to 'top' in v1.3.0. See docs for more info: http://mkoryak.github.io/floatThead/#options")), "undefined" != typeof opts.scrollingBottom && (opts.bottom = opts.scrollingBottom, debug("option 'scrollingBottom' has been renamed to 'bottom' in v1.3.0. See docs for more info: http://mkoryak.github.io/floatThead/#options")), "auto" == opts.position ? useAbsolutePositioning = null : "fixed" == opts.position ? useAbsolutePositioning = !1 : "absolute" == opts.position ? useAbsolutePositioning = !0 : opts.debug && debug('Invalid value given to "position" option, valid is "fixed", "absolute" and "auto". You passed: ', opts.position), null == useAbsolutePositioning && (useAbsolutePositioning = locked); var $caption = $table.find("caption"), haveCaption = 1 == $caption.length; if (haveCaption) var captionAlignTop = "top" === ($caption.css("caption-side") || $caption.attr("align") || "top"); var $fthGrp = $("<fthfoot>").css({ display: "table-footer-group", "border-spacing": 0, height: 0, "border-collapse": "collapse", visibility: "hidden" }), wrappedContainer = !1, $wrapper = $([]), absoluteToFixedOnScroll = ieVersion <= 9 && !locked && useAbsolutePositioning, $floatTable = $("<table/>"), $floatColGroup = $("<colgroup/>"), $tableColGroup = $table.children("colgroup:first"), existingColGroup = !0; 0 == $tableColGroup.length && ($tableColGroup = $("<colgroup/>"), existingColGroup = !1); var $fthRow = $("<fthtr>").css({ display: "table-row", "border-spacing": 0, height: 0, "border-collapse": "collapse" }), $floatContainer = $("<div>").css("overflow", "hidden").attr("aria-hidden", "true"), floatTableHidden = !1, $tableCells = $([]), $headerCells = $([]), $fthCells = $([]); $table.prepend($tableColGroup), createElements && ($fthGrp.append($fthRow), $table.append($fthGrp)), $floatTable.append($floatColGroup), $floatContainer.append($floatTable), opts.copyTableClass && $floatTable.attr("class", $table.attr("class")), $floatTable.attr({ cellpadding: $table.attr("cellpadding"), cellspacing: $table.attr("cellspacing"), border: $table.attr("border") }); var tableDisplayCss = $table.css("display"); if ($floatTable.css({ borderCollapse: $table.css("borderCollapse"), border: $table.css("border"), display: tableDisplayCss }), locked || $floatTable.css("width", "auto"), "none" == tableDisplayCss && (floatTableHidden = !0), $floatTable.addClass(opts.floatTableClass).css({ margin: 0, "border-bottom-width": 0 }), setBackgrund($floatTable, getBackground($table)), useAbsolutePositioning) { var makeRelative = function($container, alwaysWrap) { var positionCss = $container.css("position"), relativeToScrollContainer = "relative" == positionCss || "absolute" == positionCss, $containerWrap = $container; if (!relativeToScrollContainer || alwaysWrap) { var css = { paddingLeft: $container.css("paddingLeft"), paddingRight: $container.css("paddingRight") }; $floatContainer.css(css), $containerWrap = $container.data("floatThead-containerWrap") || $container.wrap($("<div>").addClass(opts.floatWrapperClass).css({ position: "relative", clear: "both" })).parent(), $container.data("floatThead-containerWrap", $containerWrap), wrappedContainer = !0; } return $containerWrap; }; locked ? ($wrapper = makeRelative($scrollContainer, !0), $wrapper.prepend($floatContainer)) : ($wrapper = makeRelative($table), $table.before($floatContainer)); } else $table.before($floatContainer); $floatContainer.css({ position: useAbsolutePositioning ? "absolute" : "fixed", marginTop: 0, top: useAbsolutePositioning ? 0 : "auto", zIndex: opts.zIndex, willChange: "transform" }), $floatContainer.addClass(opts.floatContainerClass), updateScrollingOffsets(); var layoutFixed = { "table-layout": "fixed" }, layoutAuto = { "table-layout": $table.css("tableLayout") || "auto" }, originalTableWidth = $table[0].style.width || "", originalTableMinWidth = $table.css("minWidth") || "", isHeaderFloatingLogical = !1; calculateScrollBarSize(); var flow, ensureReflow = function() { (flow = reflow())(); }; ensureReflow(); var calculateFloatContainerPos = calculateFloatContainerPosFn(), repositionFloatContainer = repositionFloatContainerFn(); repositionFloatContainer(calculateFloatContainerPos("init"), !0); var matchMediaPrint, windowScrollDoneEvent = util.debounce(function() { repositionFloatContainer(calculateFloatContainerPos("windowScrollDone"), !1); }, 1), windowScrollEvent = function() { repositionFloatContainer(calculateFloatContainerPos("windowScroll"), !1), absoluteToFixedOnScroll && windowScrollDoneEvent(); }, containerScrollEvent = function() { repositionFloatContainer(calculateFloatContainerPos("containerScroll"), !1); }, windowResizeEvent = function() { $table.is(":hidden") || (updateScrollingOffsets(), calculateScrollBarSize(), ensureReflow(), calculateFloatContainerPos = calculateFloatContainerPosFn(), (repositionFloatContainer = repositionFloatContainerFn())(calculateFloatContainerPos("resize"), !1)); }, reflowEvent = util.debounce(function() { $table.is(":hidden") || (calculateScrollBarSize(), updateScrollingOffsets(), ensureReflow(), calculateFloatContainerPos = calculateFloatContainerPosFn(), repositionFloatContainer(calculateFloatContainerPos("reflow"), !1)); }, 1), updateOfPositionEvent = util.debounce(function() { $table.is(":hidden") || (calculateScrollBarSize(), updateScrollingOffsets(), calculateFloatContainerPos = calculateFloatContainerPosFn(), repositionFloatContainer(calculateFloatContainerPos("reflow"), !1)); }, 1), beforePrint = function() { unfloat(); }, afterPrint = function() { refloat(); }, printEvent = function(mql) { mql.matches ? beforePrint() : afterPrint(); }; if (window.matchMedia && window.matchMedia("print").addListener ? (matchMediaPrint = window.matchMedia("print"), matchMediaPrint.addListener(printEvent)) : ($window.on("beforeprint", beforePrint), $window.on("afterprint", afterPrint)), locked ? useAbsolutePositioning ? $scrollContainer.on(eventName("scroll"), containerScrollEvent) : ($scrollContainer.on(eventName("scroll"), containerScrollEvent), $window.on(eventName("scroll"), windowScrollEvent)) : ($responsiveContainer.on(eventName("scroll"), containerScrollEvent), $window.on(eventName("scroll"), windowScrollEvent)), $window.on(eventName("load"), reflowEvent), windowResize(eventName("resize"), windowResizeEvent), $table.on("reflow", reflowEvent), opts.support && opts.support.datatables && isDatatable($table) && $table.on("filter", reflowEvent).on("sort", reflowEvent).on("page", reflowEvent), opts.support && opts.support.bootstrap && $window.on(eventName("shown.bs.tab"), reflowEvent), opts.support && opts.support.jqueryUI && $window.on(eventName("tabsactivate"), reflowEvent), canObserveMutations) { var mutationElement = null; util.isFunction(opts.autoReflow) && (mutationElement = opts.autoReflow($table, $scrollContainer)), mutationElement || (mutationElement = $scrollContainer.length ? $scrollContainer[0] : $table[0]), mObs = new MutationObserver(function(e) { for (var wasTableRelated = function(nodes) { return nodes && nodes[0] && ("THEAD" == nodes[0].nodeName || "TD" == nodes[0].nodeName || "TH" == nodes[0].nodeName); }, i = 0; i < e.length; i++) if (!wasTableRelated(e[i].addedNodes) && !wasTableRelated(e[i].removedNodes)) { reflowEvent(); break; } }), mObs.observe(mutationElement, { childList: !0, subtree: !0 }); } $table.data("floatThead-attached", { destroy: function() { var ns = ".fth-" + floatTheadId; return unfloat(), $table.css(layoutAuto), $tableColGroup.remove(), createElements && $fthGrp.remove(), triggerFloatEvent(!1), canObserveMutations && (mObs.disconnect(), mObs = null), $table.off("reflow reflowed"), $scrollContainer.off(ns), $responsiveContainer.off(ns), wrappedContainer && ($scrollContainer.length ? $scrollContainer.unwrap() : $table.unwrap()), locked ? $scrollContainer.data("floatThead-containerWrap", !1) : $table.data("floatThead-containerWrap", !1), $table.css("minWidth", originalTableMinWidth), $floatContainer.remove(), $table.data("floatThead-attached", !1), $window.off(ns), matchMediaPrint && matchMediaPrint.removeListener(printEvent), beforePrint = afterPrint = function() {}, function() { return $table.floatThead(opts); }; }, reflow: function() { reflowEvent(); }, hide: function() { isHidden || (isHidden = !0, unfloat()); }, show: function() { isHidden && (isHidden = !1, updateOfPositionEvent()); }, updateOfPosition: function() { updateOfPositionEvent(); }, getFloatContainer: function() { return $floatContainer; }, getRowGroups: function() { return headerFloated ? $floatContainer.find(">table>thead").add($table.children("tbody,tfoot")) : $table.children("thead,tbody,tfoot"); } }); }), this; }; }(function() { var $ = window.jQuery; return "undefined" != typeof module && module.exports && !$ && ($ = require("jquery")), $; }()), function($) { $.floatThead = $.floatThead || {}, $.floatThead._ = window._ || function() { var that = {}, hasOwnProperty = Object.prototype.hasOwnProperty, isThings = [ "Arguments", "Function", "String", "Number", "Date", "RegExp" ]; that.has = function(obj, key) { return hasOwnProperty.call(obj, key); }, that.keys = function(obj) { if (obj !== Object(obj)) throw new TypeError("Invalid object"); var keys = []; for (var key in obj) that.has(obj, key) && keys.push(key); return keys; }; var idCounter = 0; return that.uniqueId = function(prefix) { var id = ++idCounter + ""; return prefix ? prefix + id : id; }, $.each(isThings, function() { var name = this; that["is" + name] = function(obj) { return Object.prototype.toString.call(obj) == "[object " + name + "]"; }; }), that.debounce = function(func, wait, immediate) { var timeout, args, context, timestamp, result; return function() { context = this, args = arguments, timestamp = new Date(); var later = function() { var last = new Date() - timestamp; last < wait ? timeout = setTimeout(later, wait - last) : (timeout = null, immediate || (result = func.apply(context, args))); }, callNow = immediate && !timeout; return timeout || (timeout = setTimeout(later, wait)), callNow && (result = func.apply(context, args)), result; }; }, that; }(); }(jQuery), function(factory) { factory(window.jQuery); }(function($) { $.fn.spin = function(opts, color) { return this.each(function() { var $this = $(this), data = $this.data(); data.spinner && (data.spinner.stop(), delete data.spinner), opts !== !1 && (opts = $.extend({ color: color || $this.css("color") }, $.fn.spin.presets[opts] || opts), data.spinner = new Spinner(opts).spin(this)); }); }, $.fn.spin.presets = { tiny: { lines: 8, length: 2, width: 2, radius: 3 }, small: { lines: 8, length: 4, width: 3, radius: 5 }, large: { lines: 10, length: 8, width: 4, radius: 8 } }; }), !function(a, b) { "object" == typeof module && module.exports ? module.exports = b() : "function" == typeof define && define.amd ? define(b) : a.Spinner = b(); }(this, function() { "use strict"; function a(a, b) { var c, d = document.createElement(a || "div"); for (c in b) d[c] = b[c]; return d; } function b(a) { for (var b = 1, c = arguments.length; c > b; b++) a.appendChild(arguments[b]); return a; } function c(a, b, c, d) { var e = [ "opacity", b, ~~(100 * a), c, d ].join("-"), f = .01 + c / d * 100, g = Math.max(1 - (1 - a) / b * (100 - f), a), h = j.substring(0, j.indexOf("Animation")).toLowerCase(), i = h && "-" + h + "-" || ""; return m[e] || (k.insertRule("@" + i + "keyframes " + e + "{0%{opacity:" + g + "}" + f + "%{opacity:" + a + "}" + (f + .01) + "%{opacity:1}" + (f + b) % 100 + "%{opacity:" + a + "}100%{opacity:" + g + "}}", k.cssRules.length), m[e] = 1), e; } function d(a, b) { var c, d, e = a.style; if (b = b.charAt(0).toUpperCase() + b.slice(1), void 0 !== e[b]) return b; for (d = 0; d < l.length; d++) if (c = l[d] + b, void 0 !== e[c]) return c; } function e(a, b) { for (var c in b) a.style[d(a, c) || c] = b[c]; return a; } function f(a) { for (var b = 1; b < arguments.length; b++) { var c = arguments[b]; for (var d in c) void 0 === a[d] && (a[d] = c[d]); } return a; } function g(a, b) { return "string" == typeof a ? a : a[b % a.length]; } function h(a) { this.opts = f(a || {}, h.defaults, n); } function i() { function c(b, c) { return a("<" + b + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', c); } k.addRule(".spin-vml", "behavior:url(#default#VML)"), h.prototype.lines = function(a, d) { function f() { return e(c("group", { coordsize: k + " " + k, coordorigin: -j + " " + -j }), { width: k, height: k }); } function h(a, h, i) { b(m, b(e(f(), { rotation: 360 / d.lines * a + "deg", left: ~~h }), b(e(c("roundrect", { arcsize: d.corners }), { width: j, height: d.scale * d.width, left: d.scale * d.radius, top: -d.scale * d.width >> 1, filter: i }), c("fill", { color: g(d.color, a), opacity: d.opacity }), c("stroke", { opacity: 0 })))); } var i, j = d.scale * (d.length + d.width), k = 2 * d.scale * j, l = -(d.width + d.length) * d.scale * 2 + "px", m = e(f(), { position: "absolute", top: l, left: l }); if (d.shadow) for (i = 1; i <= d.lines; i++) h(i, -2, "progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)"); for (i = 1; i <= d.lines; i++) h(i); return b(a, m); }, h.prototype.opacity = function(a, b, c, d) { var e = a.firstChild; d = d.shadow && d.lines || 0, e && b + d < e.childNodes.length && (e = e.childNodes[b + d], e = e && e.firstChild, e = e && e.firstChild, e && (e.opacity = c)); }; } var j, k, l = [ "webkit", "Moz", "ms", "O" ], m = {}, n = { lines: 12, length: 7, width: 5, radius: 10, scale: 1, corners: 1, color: "#000", opacity: .25, rotate: 0, direction: 1, speed: 1, trail: 100, fps: 20, zIndex: 2e9, className: "spinner", top: "50%", left: "50%", shadow: !1, hwaccel: !1, position: "absolute" }; if (h.defaults = {}, f(h.prototype, { spin: function(b) { this.stop(); var c = this, d = c.opts, f = c.el = a(null, { className: d.className }); if (e(f, { position: d.position, width: 0, zIndex: d.zIndex, left: d.left, top: d.top }), b && b.insertBefore(f, b.firstChild || null), f.setAttribute("role", "progressbar"), c.lines(f, c.opts), !j) { var g, h = 0, i = (d.lines - 1) * (1 - d.direction) / 2, k = d.fps, l = k / d.speed, m = (1 - d.opacity) / (l * d.trail / 100), n = l / d.lines; !function o() { h++; for (var a = 0; a < d.lines; a++) g = Math.max(1 - (h + (d.lines - a) * n) % l * m, d.opacity), c.opacity(f, a * d.direction + i, g, d); c.timeout = c.el && setTimeout(o, ~~(1e3 / k)); }(); } return c; }, stop: function() { var a = this.el; return a && (clearTimeout(this.timeout), a.parentNode && a.parentNode.removeChild(a), this.el = void 0), this; }, lines: function(d, f) { function h(b, c) { return e(a(), { position: "absolute", width: f.scale * (f.length + f.width) + "px", height: f.scale * f.width + "px", background: b, boxShadow: c, transformOrigin: "left", transform: "rotate(" + ~~(360 / f.lines * k + f.rotate) + "deg) translate(" + f.scale * f.radius + "px,0)", borderRadius: (f.corners * f.scale * f.width >> 1) + "px" }); } for (var i, k = 0, l = (f.lines - 1) * (1 - f.direction) / 2; k < f.lines; k++) i = e(a(), { position: "absolute", top: 1 + ~(f.scale * f.width / 2) + "px", transform: f.hwaccel ? "translate3d(0,0,0)" : "", opacity: f.opacity, animation: j && c(f.opacity, f.trail, l + k * f.direction, f.lines) + " " + 1 / f.speed + "s linear infinite" }), f.shadow && b(i, e(h("#000", "0 0 4px #000"), { top: "2px" })), b(d, b(i, h(g(f.color, k), "0 0 1px rgba(0,0,0,.1)"))); return d; }, opacity: function(a, b, c) { b < a.childNodes.length && (a.childNodes[b].style.opacity = c); } }), "undefined" != typeof document) { k = function() { var c = a("style", { type: "text/css" }); return b(document.getElementsByTagName("head")[0], c), c.sheet || c.styleSheet; }(); var o = e(a("group"), { behavior: "url(#default#VML)" }); !d(o, "transform") && o.adj ? i() : j = d(o, "animation"); } return h; }), /*! Copyright (c) 2011 by Jonas Mosbech - https://github.com/jmosbech/StickyTableHeaders MIT license info: https://github.com/jmosbech/StickyTableHeaders/blob/master/license.txt */ function($, window, undefined) { "use strict"; function Plugin(el, options) { var base = this, ieVersion = function() { for (var a = 3, b = document.createElement("b"), c = b.all || []; a = 1 + a, b.innerHTML = "<!--[if gt IE " + a + "]><i><![endif]-->", c[0]; ) ; return 4 < a ? a : document.documentMode; }(), isFF = /Gecko\//.test(navigator.userAgent), isWebkit = /WebKit\//.test(navigator.userAgent); ieVersion || isFF || isWebkit || (ieVersion = 11), base.$el = $(el), base.el = el, base.id = id++, base.$window = $(window), base.$document = $(document), base.$el.bind("destroyed", $.proxy(base.teardown, base)), base.$floatTable = null, base.$clonedColumn = null, base.$tableColGroup = null, base.isColumnSticky = !1, base.isHeadSticky = !1, base.isHidden = !1, base.$floatContainer = $("<div>").css({ overflow: "hidden", position: "fixed" }), base.$floatContainerCorner = $("<div>").css({ overflow: "hidden", position: "fixed" }), base.initColumn = function() { base.$el.each(function() { var $this = $(this), _stickyColIndex = (0 | $this.data("frozenColumns")) - 1; if (!(_stickyColIndex < 0)) { var $originalColumn = $("thead:first, tbody:first", $this); base.$clonedColumn = $originalColumn.clone(), base.$clonedColumn.find("tr").each(function() { $(this).find("td:gt(" + _stickyColIndex + ")").remove(); }), base.$clonedColumn.ready(function() { base.updateHeightOfRows(base.$clonedColumn, base.getHeightOfRows($originalColumn)); }), $this.trigger("clonedColumn." + name, [ base.$clonedColumn ]), base.$floatTable = $("<table>").css({ "table-layout": "fixed", position: "relative" }).append(base.$clonedColumn), base.$tableColGroup = $("colgroup:first", $this).clone(); var widthColGroup = 0; base.$tableColGroup.each(function() { $(this).find("col:gt(" + _stickyColIndex + ")").remove(), $(this).find("col").each(function() { widthColGroup += $(this).width(); }); }), base.$floatTable.prepend(base.$tableColGroup), base.$floatTable.css("width", widthColGroup), base.$floatTable.attr("class", $this.attr("class")), base.$floatTable.attr("cellpadding", $this.attr("cellpadding")), base.$floatTable.attr("cellspacing", $this.attr("cellspacing")), base.$floatContainer.css({ position: "fixed", top: 0, "margin-top": 0, left: 0, "z-index": base.options.zIndex }), base.setBackgrund(base.$floatContainer, base.getBackground($(this))), base.$floatContainer.append(base.$floatTable).css("display", "none"), base.$el.before(base.$floatContainer); } }); }, base.initCorner = function() { base.$el.each(function() { var $this = $(this), _stickyColIndex = (0 | $this.data("frozenColumns")) - 1; if (!(_stickyColIndex < 0)) { var stickyHeadIndex = $("thead:first", $this).find("tr").length; stickyHeadIndex > 0 && (base.isHeadSticky = !0, base.$floatContainerCorner = base.$floatContainer.clone(), base.$floatContainerCorner.find("tbody:first").remove(), base.$floatContainerCorner.css({ position: "fixed", top: 0, "margin-top": 0, left: 0, "z-index": base.options.zIndex + 2 }), base.setBackgrund(base.$floatContainer, base.getBackground($(this))), base.$el.before(base.$floatContainerCorner)); } }); }, base.init = function() { base.setOptions(options), base.initColumn(), base.initCorner(), base.toggleTableColumns(), base.bind(); }, base.destroy = function() { base.$el.unbind("destroyed", base.teardown), base.teardown(); }, base.reflow = function() { base.toggleTableColumns(); }, base.hide = function() { base.isHidden || (base.isHidden = !0, base.toggleTableColumns()); }, base.show = function() { base.isHidden && (base.isHidden = !1, base.toggleTableColumns()); }, base.teardown = function() { $.removeData(base.el, "plugin_" + name), base.unbind(), base.$clonedColumn.remove(), base.$tableColGroup.remove(), base.$floatContainerCorner.remove(), base.el = null, base.$el = null; }, base.bind = function() { base.$scrollableArea.on("scroll." + name, base.toggleTableColumns), base.isWindowScrolling || (base.$window.on("scroll." + name + base.id, base.setPositionValues), base.$window.on("resize." + name + base.id, base.toggleTableColumns)), base.$scrollableArea.on("resize." + name, base.toggleTableColumns); }, base.unbind = function() { base.$scrollableArea.off("." + name, base.toggleTableColumns), base.isWindowScrolling || (base.$window.off("." + name + base.id, base.setPositionValues), base.$window.off("." + name + base.id, base.toggleTableColumns)); }, base.getHeightOfRows = function(table) { var result = []; return table.find("tr").each(function(i) { result.push(this.getBoundingClientRect().height); }), result; }, base.updateHeightOfRows = function(table, heightOfRows) { table.find("tr").each(function(i) { $(this).height(heightOfRows[i]); }); }, base.toggleTableColumns = function() { base.$el && base.$el.each(function() { var $this = $(this), offset = $this.offset(), containerOffset = base.$scrollableArea.offset(), tableOffset = base.$el.offset(), scrollingContainerTop = base.$scrollableArea.scrollTop(), tableTopContainerGap = tableOffset.top - containerOffset.top + scrollingContainerTop, tableTopGap = base.floatContainerBorderWidth("top"); tableTopContainerGap -= tableTopGap; var scrolledPastTop = tableTopContainerGap < scrollingContainerTop + base.$scrollableArea.height(), scrollingContainerLeft = base.$scrollableArea.scrollLeft(), tableLeftContainerGap = tableOffset.left - containerOffset.left + scrollingContainerLeft, tableLeftGap = base.floatContainerBorderWidth("left"); tableLeftContainerGap -= tableLeftGap; var scrolledPastLeft = tableLeftContainerGap < scrollingContainerLeft, newLeftOffset = base.$scrollableArea.offset().left + (isNaN(base.options.column.leftOffset) ? 0 : base.options.column.leftOffset), notScrolledPastRight = newLeftOffset + base.$floatContainer.width() <= offset.left + $this.width(), newTopOffset = base.$scrollableArea.offset().top + (isNaN(base.options.column.fixedOffset) ? 0 : base.options.column.fixedOffset), notScrolledPastBottom = newTopOffset <= offset.top + $this.height(); scrolledPastTop && notScrolledPastBottom && scrolledPastLeft && notScrolledPastRight && !base.isHidden ? (base.refloat(), base.isHeadSticky && tableTopContainerGap < scrollingContainerTop && base.$floatContainerCorner.css("display", ""), base.isColumnSticky || (base.isColumnSticky = !0), base.setColumnPositionValues(), base.$floatContainer.scrollTop(scrollingContainerTop - Math.round(tableTopContainerGap))) : base.isColumnSticky && (base.unfloat(), base.isColumnSticky = !1); }); }, base.calculateFloatContainerPos = function() { var containerOffset = base.$scrollableArea.offset(), tableOffset = base.$el.offset(), tableHeight = (base.$el.outerWidth(), base.$el.outerHeight()), scrollingContainerLeft = base.$scrollableArea.scrollLeft(), tableLeftContainerGap = tableOffset.left - containerOffset.left + scrollingContainerLeft, tableLeftGap = base.floatContainerBorderWidth("left"); tableLeftContainerGap -= tableLeftGap; var scrollingContainerTop = base.$scrollableArea.scrollTop(), tableTopContainerGap = tableOffset.top - containerOffset.top + scrollingContainerTop, tableTopGap = base.floatContainerBorderWidth("top"); tableTopContainerGap -= tableTopGap; var top, left, windowTop = $(window).scrollTop(), windowLeft = $(window).scrollLeft(); if (tableTopContainerGap > scrollingContainerTop) top = tableOffset.top - windowTop, base.reduceHeightFloatContainer(tableTopContainerGap - scrollingContainerTop); else { var tableBottom = tableTopContainerGap + tableHeight, scrollableAreaBottom = scrollingContainerTop + base.$scrollableArea.prop("clientHeight"); tableBottom < scrollableAreaBottom ? base.reduceHeightFloatContainer(scrollableAreaBottom - tableBottom) : base.reduceHeightFloatContainer(0), top = tableOffset.top + scrollingContainerTop - windowTop - tableTopContainerGap; } return left = tableOffset.left + scrollingContainerLeft - windowLeft - tableLeftContainerGap, { top: Math.round(top), left: Math.round(left) }; }, base.floatContainerBorderWidth = function(side) { var border = base.$scrollableArea.css("border-" + side + "-width"), w = 0; return border && ~border.indexOf("px") && (w = parseInt(border, 10)), w; }, base.refloat = function() { base.$floatContainer.css("display", ""); }, base.unfloat = function() { base.$floatContainer.css("display", "none"), base.isHeadSticky && base.$floatContainerCorner.css("display", "none"); }, base.setColumnPositionValues = function() { var winScrollTop = base.$window.scrollTop(), winScrollLeft = base.$window.scrollLeft(); if (!(!base.isColumnSticky || winScrollTop < 0 || winScrollTop + base.$window.height() > base.$document.height() || winScrollLeft < 0 || winScrollLeft + base.$window.width() > base.$document.width())) { var pos = base.calculateFloatContainerPos(), transform = "translateX(" + pos.left + "px) translateY(" + pos.top + "px)"; base.$floatContainer.css({ "-webkit-transform": transform, "-moz-transform": transform, "-ms-transform": transform, "-o-transform": transform, transform: transform }), base.isHeadSticky && (ieVersion && (base.$floatContainerCorner.css("display", ""), base.$floatContainer.find("div:first").css({ position: "relative" })), base.$floatContainerCorner.css({ "-webkit-transform": transform, "-moz-transform": transform, "-ms-transform": transform, "-o-transform": transform, transform: transform })), base.setBackgrund(base.$floatContainerCorner, base.getBackground(base.$floatContainer)); } }, base.getFloatWidth = function() { var widthColGroup = 0; return base.$tableColGroup.each(function() { $(this).find("col:gt(" + _stickyColIndex + ")").remove(), $(this).find("col").each(function() { widthColGroup += $(this).width(); }); }), widthColGroup; }, base.reduceHeightFloatContainer = function(delta) { var $container = base.$scrollableArea, height = $container.prop("clientHeight"); height -= delta, base.$floatContainer.height(height); }, base.setPositionValues = function() { base.setColumnPositionValues(); }, base.setOptions = function(options) { base.options = $.extend(!0, defaults, options), base.$scrollableArea = $(base.options.scrollableArea), base.isWindowScrolling = base.$scrollableArea[0] === window; }, base.updateOptions = function(options) { base.setOptions(options), base.unbind(), base.bind(), base.toggleTableColumns(); }, base.getBackground = function(jqueryElement) { var color = jqueryElement.css("background-color"); return base.isTransparent(color) ? jqueryElement.is("body") ? "rgb(255, 255, 255)" : base.getBackground(jqueryElement.parent()) : color; }, base.isTransparent = function(color) { switch ((color || "").replace(/\s+/g, "").toLowerCase()) { case "transparent": case "": case "rgba(0,0,0,0)": return !0; default: return !1; } }, base.setBackgrund = function(jqueryElement, color) { jqueryElement.css("background-color", color); }, base.init(); } var name = "stickyTableHeaders", id = 0, defaults = { column: { fixedOffset: 0, leftOffset: 0 }, scrollableArea: window, zIndex: 1 }; $.fn[name] = function(options) { return this.each(function() { var instance = $.data(this, "plugin_" + name); instance ? "string" == typeof options ? instance[options].apply(instance) : instance.updateOptions(options) : "destroy" !== options && "reflow" !== options && "hide" !== options && "show" !== options && $.data(this, "plugin_" + name, new Plugin(this, options)); }); }; }(jQuery, window); var ServiceParameterType = { String: 0, DateTime: 1, Bool: 2, Int: 3, Float: 4 }, ticksOffsetFromUnixEpoch = 621355968e9, ticksInMillisecond = 1e4, millisecondsInMinute = 6e4; !function() { function extend(proto, prop, value) { proto[prop] || Object.defineProperty(proto, prop, { value: value, writable: !0, configurable: !0, enumerable: !1 }); } extend(Boolean, "parse", function(x) { switch (typeof x) { case "boolean": return x; case "string": switch (x.toLowerCase()) { case "true": return !0; case "false": return !1; default: var n = parseFloat(x); return !isNaN(n) && 0 !== n; } default: return !1; } }), extend(String.prototype, "trim", function() { return this.replace(/^\s+|\s+$/g, ""); }), extend(String.prototype, "format", function() { var args = arguments; return this.replace(/{(\d+)}/g, function(match, number) { return "undefined" != typeof args[number] ? args[number] : match; }); }), extend(String.prototype, "startsWith", function(str) { return 0 === this.indexOf(str, 0); }), extend(String.prototype, "endsWith", function(str) { return this.indexOf(str, this.length - str.length) !== -1; }), extend(String.prototype, "right", function(nn) { return this.length > nn ? this.substr(this.length - nn) : this; }), extend(Date, "isDate", function(date) { return date instanceof Date && !isNaN(date.valueOf()); }), extend(Date, "format", function(x, format) { var $c = { dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], abbreviatedDayNames: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], shortestDayNames: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ], firstLetterDayNames: [ "S", "M", "T", "W", "T", "F", "S" ], monthNames: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], abbreviatedMonthNames: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], amDesignator: "AM", pmDesignator: "PM" }, ord = function(n) { switch (1 * n) { case 1: case 21: case 31: return "st"; case 2: case 22: return "nd"; case 3: case 23: return "rd"; default: return "th"; } }, p = function(s, l) { return l || (l = 2), ("000" + s).slice(l * -1); }; return format ? format.replace(/(\\)?(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|S)/g, function(m) { if ("\\" === m.charAt(0)) return m.replace("\\", ""); switch (m) { case "hh": return p(x.getHours() < 13 ? 0 === x.getHours() ? 12 : x.getHours() : x.getHours() - 12); case "h": return x.getHours() < 13 ? 0 === x.getHours() ? 12 : x.getHours() : x.getHours() - 12; case "HH": return p(x.getHours()); case "H": return x.getHours(); case "mm": return p(x.getMinutes()); case "m": return x.getMinutes(); case "ss": return p(x.getSeconds()); case "s": return x.getSeconds(); case "yyyy": return p(x.getFullYear(), 4); case "yy": return p(x.getFullYear()); case "dddd": return $c.dayNames[x.getDay()]; case "ddd": return $c.abbreviatedDayNames[x.getDay()]; case "dd": return p(x.getDate()); case "d": return x.getDate(); case "MMMM": return $c.monthNames[x.getMonth()]; case "MMM": return $c.abbreviatedMonthNames[x.getMonth()]; case "MM": return p(x.getMonth() + 1); case "M": return x.getMonth() + 1; case "t": return x.getHours() < 12 ? $c.amDesignator.substring(0, 1) : $c.pmDesignator.substring(0, 1); case "tt": return x.getHours() < 12 ? $c.amDesignator : $c.pmDesignator; case "S": return ord(x.getDate()); default: return m; } }) : x.toString(); }), extend(Array.prototype, "clone", function() { return this.slice(0); }), extend(Array.prototype, "remove", function() { for (var what, ax, a = arguments, l = a.length; l && this.length; ) for (what = a[--l]; (ax = this.indexOf(what)) !== -1; ) this.splice(ax, 1); return this; }); }(); var DocumentState = { init: "init", progress: "progress", completed: "completed", cancelled: "cancelled", error: "error" }; Enum.prototype = { contains: function(item) { var self = this; return Object.keys(self).map(function(propertyName) { return self[propertyName]; }).some(function(propertyValue) { return propertyValue === item; }); }, notContains: function(item) { return !this.contains(item); } }; var ParameterType = new Enum(); ParameterType.String = "string", ParameterType.DateTime = "datetime", ParameterType.Bool = "bool", ParameterType.Int = "int", ParameterType.Float = "float"; var ParameterState = new Enum(); ParameterState.Ok = "Ok", ParameterState.ExpectValue = "ExpectValue", ParameterState.HasOutstandingDependencies = "HasOutstandingDependencies", ParameterState.ValidationFailed = "ValidationFailed", ParameterState.DynamicValuesUnavailable = "DynamicValuesUnavailable", ParameterState.ClientValidationFailed = "ClientValidationFailed"; var ParameterEditorType = new Enum(); ParameterEditorType.SelectOneFromMany = "SelectOneFromMany", ParameterEditorType.MultiValue = "MultiValue", ParameterEditorType.MultiLine = "MultiLine", ParameterEditorType.SingleValue = "SingleValue"; var ParameterSpecialValue = new Enum(); ParameterSpecialValue.SelectAll = { toString: function() { return "(SELECT ALL)"; } }, ParameterSpecialValue.Empty = { toString: function() { return "(NULL)"; } }; var ExportType = new Enum(); ExportType.Pdf = "Pdf", ExportType.Word = "Word", ExportType.Image = "Image", ExportType.Html = "Html", ExportType.Xls = "Xls", ExportType.Csv = "Csv", ExportType.Docx = "Docx"; var ActionType = new Enum(); ActionType.hyperlink = 0, ActionType.bookmark = 1, ActionType.drillthrough = 2, ActionType.toggle = 3; var SidebarState = new Enum(); SidebarState.Hidden = "Hidden", SidebarState.Search = "Search", SidebarState.Parameters = "Parameters", SidebarState.TOC = "TOC", SidebarState.Email = "Email"; var ServerPagingMode = new Enum(); ServerPagingMode.NoPaging = "No paging", ServerPagingMode.UsePaging = "Use paging"; var Renderer = new Enum(); Renderer.HTML = "HTML", Renderer.SVG = "SVG"; var PageDisplayMode = new Enum(); PageDisplayMode.single = "single", PageDisplayMode.continuous = "continuous", function($) { $.fn.attrs = function() { for (var map = {}, attrs = this[0].attributes, i = 0; i < attrs.length; i++) { var name = attrs[i].name; map[name.toLowerCase()] = attrs[i].value; } return map; }, $.fn.spin.presets.load = { lines: 13, length: 16, width: 6, radius: 18, corners: 1, rotate: 0, direction: 1, color: "#000", speed: 1, trail: 60, shadow: !0, hwaccel: !0, className: "spinner", left: "50%", top: "50%" }; }(jQuery), ko.bindingHandlers.activeTab = { init: function(element, valueAccessor) { function update() { var tab = value(); $e.find(".tab-pane").removeClass("active"), $e.find("[data-tab-name=" + tab + "]").addClass("active"); } var value = valueAccessor(), $e = $(element); update(), ko.isObservable(value) && value.subscribe(update); } }, ko.bindingHandlers.treeNode = { init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { var options = valueAccessor(), $e = $(element); $e.find(".toggle").click(function() { if ($e.toggleClass("collapsed").toggleClass("expanded"), $e.hasClass("expanded") && !$e.hasClass("loaded")) { $e.toggleClass("loaded"); var node = options.node; "function" == typeof node.kids && node.kids(); var div = $("<div/>").appendTo($e); ko.renderTemplate(options.template, bindingContext.createChildContext(node), {}, div[0]); } return !1; }); } }, ko.bindingHandlers.spin = { init: function(element, valueAccessor) { function update() { visible() ? $(element).spin("load") : $(element).spin(!1); } var visible = valueAccessor(); visible.subscribe(update), update(); } }, ko.bindingHandlers.resizeViewerBody = { init: function(element) { function resize() { var tb1 = $e.find(".toolbar-top"), tb2 = $e.find(".toolbar-bottom"), h1 = tb1.length ? tb1.outerHeight(!0) : 0, h2 = tb2.length ? tb2.outerHeight(!0) : 0, height = $e.height() - h1 - h2; $e.find(".viewer-body").css("height", height + "px"), $e.find(".sidebar").css("height", height + "px"); } function watchResize() { var state = [ $e.height(), $e.find(".toolbar-top").length, $e.find(".toolbar-bottom").length ]; currentState.filter(function(v, i) { return v != state[i]; }).length && (currentState = state, resize()); } var $e = $(element).parent(), currentState = [ $e.height(), $e.find(".toolbar-top").length, $e.find(".toolbar-bottom").length ]; resize(), setInterval(watchResize, 10); } }, ko.bindingHandlers.scrollPosition = { init: function(element, valueAccessor) { var value = valueAccessor(); value.subscribe(function() { var pos = value(); $(element).scrollLeft(pos.left).scrollTop(pos.top); }); } }, ko.bindingHandlers.showPanel = { init: function(element, valueAccessor, _, viewModel) { function update() { observable() ? $e.fadeIn().show() : $e.fadeOut().hide(); } var observable = valueAccessor(), $e = $(element); update(), observable.subscribe(update), $e.on("click", "button.close", function() { observable(!1); }); } }, ko.bindingHandlers.valueEdit = { init: function(element, valueAccessor) { function update() { $e.is(":focus") || $e.val(value()); } var value = valueAccessor(), $e = $(element); value.subscribe(update), $e.focus(function() { var f = value.text; $e.val("function" == typeof f ? f.call(value) : ""), setTimeout(function() { $e.select(); }, 10); }).focusout(function() { $e.val(value()); }).keydown(function(event) { var k = event.which ? event.which : event.keyCode; if (13 == k) { event.preventDefault(); var oldVal = value(); return value($e.val()), oldVal != value() && $e.blur(), !1; } return !0; }), update(); } }, ko.bindingHandlers.command = { init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { var cmd = valueAccessor(), handlerAccessor = function() { return function() { cmd.exec(); }; }; ko.bindingHandlers.click.init(element, handlerAccessor, allBindings, viewModel, bindingContext); }, update: function(element, valueAccessor, allBindings, viewModel, bindingContext) { var cmd = valueAccessor(), enabled = function() { return !cmd.hasOwnProperty("enabled") || cmd.enabled; }; ko.bindingHandlers.enable.update(element, enabled, allBindings, viewModel, bindingContext), ko.bindingHandlers.active.update(element, enabled, allBindings, viewModel, bindingContext); var visible = function() { return !cmd.hasOwnProperty("visible") || cmd.visible; }; ko.bindingHandlers.visible.update(element, visible, allBindings, viewModel, bindingContext); } }, ko.bindingHandlers.showSidebar = { update: function(element, valueAccessor) { ko.unwrap(valueAccessor()), $(element).ready(function() { $(".sticky-header").floatThead("updateOfPosition"), $(".sticky-columns").stickyTableHeaders("reflow"); }); } }, ko.bindingHandlers.showPanelsSite = { update: function(element, valueAccessor) { var isShowPanelsSite = ko.unwrap(valueAccessor()); isShowPanelsSite ? $(element).ready(function() { $(".sticky-header").floatThead("hide"), $(".sticky-columns").stickyTableHeaders("hide"); }) : ($(".sticky-header").floatThead("show"), $(".sticky-columns").stickyTableHeaders("show")); } }, ko.bindingHandlers.htmlPage = { init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { ko.bindingHandlers.html.init(element, function() { return valueAccessor().page; }, allBindings, viewModel, bindingContext); }, update: function(element, valueAccessor, allBindings, viewModel, bindingContext) { var settings = valueAccessor(), page = settings.page(); page && (element.innerHTML = page), $(element).ready(function() { var zIndex = 50; $(".sticky-header").floatThead({ copyTableClass: !1, zIndex: zIndex, scrollContainer: !0, position: "fixed" }), $(".sticky-columns").stickyTableHeaders({ column: { fixedOffset: 0, leftOffset: 0 }, scrollableArea: $(".sticky-columns").closest(".document-view").parent(), zIndex: zIndex - 1 }); }), settings.onupdate && settings.onupdate.apply && settings.onupdate(element); } }; var simulatedObservable = function() { var timer = null, items = [], check = function() { return items = items.filter(function(item) { return !!item.elem.parents("html").length; }), 0 === items.length ? (clearInterval(timer), void (timer = null)) : void items.forEach(function(item) { item.obs(item.getter()); }); }; return function(elem, getter) { var obs = ko.observable(getter()); return items.push({ obs: obs, getter: getter, elem: $(elem) }), null === timer && (timer = setInterval(check, 100)), obs; }; }(); ko.bindingHandlers.virtualScroll = { init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) { var clone = $(element).clone(); $(element).empty(); var config = ko.utils.unwrapObservable(valueAccessor()), heightPage = config.heightPage, countPages = config.countPages, getPageContent = config.getPageContent; ko.computed(function() { $(element).css({ height: countPages() * heightPage() }); }, null, { disposeWhenNodeIsRemoved: element }); var offset = simulatedObservable(element, function() { return $(element).offset().top; }), windowHeight = simulatedObservable(element, function() { return window.innerHeight; }), created = {}, refresh = function() { var o = offset(), data = config.pages(), top = Math.max(0, Math.floor(-o / heightPage()) - 10), bottom = Math.min(data.length, Math.ceil((-o + windowHeight()) / heightPage())); if (0 !== heightPage()) { for (var pageIndex = top; pageIndex < bottom; pageIndex++) if (!created[pageIndex]) { var pageDiv = $("<div></div>"); pageDiv.css({ position: "absolute", height: heightPage(), left: 0, right: 0, top: pageIndex * heightPage() }), pageDiv.append(clone.clone().children()), ko.applyBindingsToDescendants(context.createChildContext(data[pageIndex]), pageDiv[0]), created[pageIndex] = pageDiv, $(element).append(pageDiv); } Object.keys(created).forEach(function(pageIndex) { (pageIndex < top || pageIndex >= bottom) && (created[pageIndex].remove(), delete created[pageIndex]); }), Object.keys(created).forEach(function(pageIndex) { void 0 === data[pageIndex].content() && null === data[pageIndex].state && (data[pageIndex].state = "loaded", getPageContent(pageIndex).done(function(val) { data[pageIndex].content(val); })); }); } }, heightPageSubscription = config.heightPage.subscribe(function() { Object.keys(created).forEach(function(pageIndex) { created[pageIndex].remove(), delete created[pageIndex]; }), refresh(); }), pagesSubscription = config.pages.subscribe(function() { Object.keys(created).forEach(function(pageIndex) { created[pageIndex].remove(), delete created[pageIndex]; }), refresh(); }); return ko.computed(refresh, null, { disposeWhenNodeIsRemoved: element }), ko.utils.domNodeDisposal.addDisposeCallback(element, function() { heightPageSubscription.dispose(), pagesSubscription.dispose(); }), { controlsDescendantBindings: !0 }; } }, ko.bindingHandlers.bootstrapSwitch = { init: function(element, valueAccessor) { var value = valueAccessor(), switchEl = $(element); switchEl.bootstrapSwitch(), switchEl.bootstrapSwitch("setState", value()), switchEl.on("switch-change", function(e, data) { value(data.value); }), value.subscribe(function() { switchEl.bootstrapSwitch("setState", value()); }); } }, ko.bindingHandlers.allowBindings = { init: function(elem, valueAccessor) { var shouldAllowBindings = ko.utils.unwrapObservable(valueAccessor()); return { controlsDescendantBindings: !shouldAllowBindings }; } }, ko.bindingHandlers.dropdownForm = { init: function(elem, valueAccessor) { var formOptions = ko.utils.unwrapObservable(valueAccessor()); formOptions.onApply && $(elem).on("hidden.bs.dropdown", function() { formOptions.onApply(!0); }), formOptions.onShown && $(elem).on("shown.bs.dropdown", formOptions.onShown); var browserSpecific = BrowserSpecific(); $(elem).on("click", ".dropdown-menu", function(e) { $(this).hasClass("dropdown-menu-form") && browserSpecific.AllowStopPropagation && e.stopPropagation(); }); } }, ko.bindingHandlers.showEditor = { init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { function closeEditor(ok) { ko.removeNode(editor), editorOptions.onClose && editorOptions.onClose.apply && editorOptions.onClose(ok || !1), editor.hide(), editor.html(""); } var editorOptions = ko.utils.unwrapObservable(valueAccessor()), editor = $(editorOptions.placeholder); editor.hide(), editor.html(""); var clickHandler = function() { editor.hide(), editorOptions.enable === !1 || editorOptions.enable && editorOptions.enable.apply && editorOptions.enable() === !1 || ko.renderTemplate(editorOptions.template, viewModel, { afterRender: function() { editor.show(), editor.find("*:input[type=text]:first").focus().select(), editor.find("button.close, .close-onclick").click(function() { closeEditor(!0); }), editorOptions.visible && editorOptions.visible.subscribe && editorOptions.visible.subscribe(function(visible) { visible || closeEditor(!1); }); } }, editor[0], "replaceChildren"); }; ko.bindingHandlers.click.init(element, function() { return clickHandler; }, allBindings, viewModel, bindingContext); } }, ko.bindingHandlers.active = { update: function(element, valueAccessor) { $(element).attr("disabled", !ko.unwrap(valueAccessor())); } }, ko.subscriptions = function() { var list = []; return list.dispose = function() { return list.forEach(function(s) { s.dispose(); }), list.length = 0, list; }, list; }, ko.promise = function(promiseFn, target) { var value = ko.observable(); return ko.dependentObservable(function() { promiseFn.call(target).done(value); }), value; }, ko.deferredArray = function(promiseFn) { var array = ko.observable(null); return ko.computed({ read: function() { return null === array() && (array([]), promiseFn().done(function(value) { array(value); })), array(); }, deferEvaluation: !0 }); }, ko.waitFor = function(value, predicate, callback) { function unsubscr() { subscr && (subscr.dispose(), subscr = null); } if (predicate(value())) return callback(value()), noop; var subscr = value.subscribe(function(newValue) { predicate(newValue) && (unsubscr(), callback(newValue)); }); return unsubscr; }, parseUri.options = { strictMode: !1, key: [ "source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor" ], q: { name: "queryKey", parser: /(?:^|&)([^&=]*)=?([^&]*)/g }, parser: { strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ } }, "undefined" != typeof module && module.exports && (require("./Common.js"), module.exports.toJson = convertPropertiesToJson); var ReportModelState = { noReport: "noReport", open: "open", documentReady: "documentReady", error: "error", closed: "closed" }, ReportType = { unknown: 0, pageReport: 1, sectionReport: 2 }; window.GrapeCity = { ActiveReports: { Viewer: createViewer } }; }(window);